我是David,此存储库/文章的目标是通过尝试以最简单的方式解释它们来揭开插座。
在这些示例中,我将使用nodejs和粒子(任何版本都可以使用)来显示硬件可以与nodejs交谈,反之亦然。但是毫无疑问,这并不意味着我选择的工具是解决这个问题的唯一方法。这就是我个人所知道的。
任何具有网络连接性的嵌入式设备都可以类似地工作,并且任何带有插座支持的语言也可以使用。
回购结构
我相信插座周围有很大的神秘感。多年来,许多人使他们听起来令人恐惧,我的目标是证明他们并不是那么神秘或复杂。我希望最终您将把插座视为解决特定问题的更简单解决方案。
特别是在每个字节都计数的嵌入式系统中。
插座是所有网络连接的基础。每个连接的设备都使用插座。在插座之上,您将拥有协议,这是指定数据后应如何发送或处理数据的规则。流行的HTTP协议就是一个例子。知道这一点,您可以模仿任何具有插座支持的语言的设备。如何?通过发送遵守特定协议(规则)的字节。这些规则可在线免费提供。
您可以制作一个假装为一个的应用程序:
人们为什么认为插座很复杂?
可能是因为人们倾向于使用传达复杂性的单词,例如:
仅通过阅读您可能认为的这几点,这不适合我。但是插座实际上非常简单。例如,要从Web服务器获得响应,您只需要发送以下文本:
GET / HTTP/1.1
就是这样。服务器将进行此文本,解析并了解您正在制作:
/contact以获取联系页面。它没有更多。打印机将了解另一个标题,同样,DNS服务器将需要其协议(规则)的特定内容。
难以相信吗?使用此命令使用Telnet应用程序连接到您喜欢的站点(仅通过端口80支持一个不安全的连接)。
SITE 80GET / HTTP/1.1对于安全连接,您可以使用openSSL如下:
Openssl s_client -connect google.com:443GET / HTTP/1.1另一个示例是通过直接连接到SMTP服务器来发送电子邮件。大多数当前的SMTP服务器都通过密码确保并使用加密保护,这使得很难快速测试。但是,如果您可以访问普通SMTP服务器,则可以输入以下内容:
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUIT如您所见,这不是吗?
现在,我们对协议有了更好的了解,您需要设计一个通用的通信结构。假设您想将房屋的温度发送到Nodejs服务器。您的字节流看起来像这样:
45,40.1,50,90,100,102.5
逗号充当每个测量的分离器。您可以选择想要的任何字符,但是,您知道,逗号将使您的数据与CSV(逗号分隔值)格式兼容。另一方面,您需要一些可以检查分离器的代码,而当发生这种情况时 - 您的价值。
从此示例中可以看到,没有标题或可选数据。您决定协议中的内容。
基于上面的示例,您可以在协议中添加湿度,例如:
45:80,40:85,32.1:82,50:89
同样,逗号将您的数据分开,而结肠将数据集区分开来。另外:请记住...协议需要良好的文档,因此其他开发人员可以理解他们必须管理的数据。
另一个重要的是,他的示例谈论了ASCII ProtoCall,要了解二进制文件的工作原理,您可以阅读我写的以下文章,标题为:How-to-deconstruct-ping-with-c-and-c-and-nodejs。
计算机以1s和0s工作,这是一个事实。该示例无法将编译应用程序与常规数据区分开。一切都存储为一系列位。这意味着即使是通过Internet发送的数据也为1s和0s。
您可能在问,那我为什么要关心类型。因为根据您的类型,您的二进制数据将有所不同。例如: 1个整数将为00000001 ,其中31个整数将变为00011111 。
这意味着,在连接的另一端,您需要知道自己得到的。假设您想进行简单的比较。
if ( data == 1 ) {
true
}如果您将数据转换为整数,但是将其发送为char,则将其将INT 31与INT 1进行比较。但是,如果您知道您正在发送角色,则可以将其与正确的类型进行比较:
if ( data == '1' ) {
true
}现在,char 1实际上是31 ,比较将起作用。在Hardware2NodeJS示例文件夹中,您会找到示例代码,以解释实践差异。
在Internet上,发送数据的两个最受欢迎的协议是TCP和UDP。您会看到人们在名称的末尾添加 /IP。 IP代表(Internet协议),简而言之,您可以将其视为Internet的地址系统。这意味着您不仅可以在Internet上使用TCP或UDP,因为TCP和UDP是包装数据的方式,您使用的地址系统取决于您。
TCP和UDP是协议,现在您应该知道这个词意味着规则,而这两个协议无非是说明如何打包数据的规则。另一端了解相同的规则,可以解开接收到的信息,反之亦然。
大多数Internet都使用TCP,因为我们希望确保我们发送的内容将在另一端全部收到。例如,如果您发送文档,则不希望丢失字母或单词。有了许多格式,如果标头缺少零件,该零件告诉系统如何理解文件,则系统将通知您文件已损坏,无法读取。
当然,有一些格式更具弹性,并且不需要100%的数据。例如,某些电影,图像和音乐格式可能会缺少一些内容,而我们只是忍受。图像或电影可能有一些怪异的文物。音乐可能会有一些斑点和噪音。
从硬件产品发送数据时,该协议非常有用。假设我们正在使用蜂窝调制解调器从许多设备收集传感器数据,我们必须为发送的每个字节付费。在这种情况下,我们应该考虑以下内容:为我们对TCP的更高保真度支付更多费用是值得的吗?还是最好接受一些测量结果,但为我们的数据传输付出少付的钱?
通常,我会默认使用TCP,但是如果您有很好的理由不使用它,则UDP是您的下一个最佳选择。
我希望这个存储库可以帮助您更好地了解什么是插座。如果不清楚,请在Twitter上打我,我将尝试修复项目中不清楚的任何积分。
我要感谢所有帮助我完成该项目的好人,包括:
如果您喜欢这个项目,请考虑给它?并查看我的GitHub帐户,在这里您会发现可能会发现有用或有趣的其他资源。
该项目由0x4447 LLC带给您,这是一家专门在AWS之上构建自定义解决方案的软件公司。请按照此链接了解更多信息:https://0x4447.com。或者,将电子邮件发送至[email protected]。