嵌入式PIC微控制器与互联网服务器通信的最佳协议是什么?

3
首先,感谢您抽出时间阅读这篇文章。
我打算使用Microchip PIC18或PIC32系列嵌入式微控制器和Microchip的TCP/IP堆栈开发一个TCP/IP设备。然而,我目前对网络的了解非常基础,这也是我写这篇文章的原因。
有人能推荐我用哪种协议使我的TCP/IP嵌入式设备能够与数据中心的服务器通信吗?我打算将嵌入式设备放在远程位置,通过互联网与服务器通信,并下载如温度计探针读数等数据,以存储到数据库中。我还希望数据中心的服务器能够重新配置远程设备的设置和变量(如果需要)。
我目前的协议研究结果有以下几种选择:
SNMP v3(由于加密和认证采用第三版)
UDP(虽然我了解说这可能不可靠但很快)
TCP(我对此并不太了解)
能否给我提供建议,指导我该走什么方向?我并不期望您为我提供详细的答案,但我真的想要一个关于要研究和了解哪些协议/主题的想法。
我的意图是在互联网上部署许多这样的嵌入式设备,它们所有的数据都将发送回服务器。
我假设远程嵌入式设备将连接到服务器而不是反之,因为服务器将具有静态IP地址或DNS名称,而远程设备地址将是未知的。
如有建议,请不要犹豫。如果我在这篇文章中漏掉了任何重要信息,请告诉我。
非常感谢。
Rob
*更新* 有人指出我可能误用了Web服务器这个术语,所以我修改了我的文章,改为提到数据中心的服务器。谢谢您指出这一点。

1
我使用了UDP。它是低级的,不需要对PIC施加太多负担。听起来你的服务器会ping PIC。我认为从服务器向PIC发送UDP数据包并让PIC用另一个UDP消息响应数据包中的命令没有问题。如果服务器在一段时间内没有收到响应,则重新发送命令。 - kenny
1
最好的解决方案需要您更精确地确定您的要求;但是,您应该考虑使用TLS安全协议(如https)或ssh。我不建议您尝试编写自己的协议,除非您准备学习一些极其深奥的数学,例如椭圆曲线和/或生成极大的伪素数。 - Elliott Frisch
1
我认为你对此有正确的理解。通常情况下,服务器不能/不应该依赖客户端在线或始终在相同的地址上可用。只有当客户端与服务器建立安全连接后,它们的通信才应该受到信任。这是一个问题吗? - Alfie
1
@RobHurd 如果PIC没有收到ping,则可以通过UDP向服务器发送注册命令。注册将包含PIC的IP地址。 - kenny
1
是的,基本上都是正确的。然而,这并不总是对协议规范成立。例如,在HTTP中,客户端可以指定连接是否应该是持久性的(或不持久)。如果不是,则连接在初始事务完成后就关闭了(服务器不会等待更多数据)。在您确认客户端已连接时,您可以在它们之间发送/接收任何您喜欢的内容;如何验证这一点是关键。向服务器/客户端请求发送确认消息也有助于维护客户端/服务器关系。 - Alfie
显示剩余11条评论
3个回答

1
如果目标是Web服务器,你别无选择,必须使用运行在TCP上的HTTP协议。否则你就误用了“Web服务器”这个术语。

谢谢您的迅速回复。那么 SNMP 只是一种本地网络协议,不能在互联网上使用吗? - RobHurd
抱歉,我所说的Web服务器只是指连接到互联网的数据中心中设置了静态IP / DNS的服务器。 - RobHurd
1
SNMP的使用完全取决于同行之间是否开放了相关的UDP端口(161-2)。实际上,所有其他协议也是如此。 - user207421
感谢 @EJP 的建议。 - RobHurd

1
在很多方面,这取决于您具体的需求。TCP/IP能够提供相当可靠的连接,因为它提供了一种方式来确定客户端是否已连接、何时连接以及何时断开连接。UDP是无连接的,因此服务器会打开一个端口并侦听数据,但没有自动连接管理,因此客户端需要显式地“告诉”服务器他们何时到达或离开(这也意味着您需要自己制定超时机制)。
此外,如果您的内存/处理资源非常有限,值得记住的是,UDP是一种成本较低的协议,因为它避免了TCP由于其内置连接管理而产生的许多开销。
虽然这些都是协议,但它们实际上只是处理连接本身。您可能仍然需要创建自己的协议来管理数据本身。例如,当您通过TCP或UDP发送数据时,发送的字节可能不会同时全部到达服务器。这意味着您需要一种方法来验证每个接收到的数据包,以确保您已经全部拥有它。通常可以通过校验和和表示发送数据总大小的字节的组合来实现此目的。

感谢您的回复,@Alfie。我会再多了解一下发送和接收TCP和UDP数据的相关知识。问题在于,我对网络编程完全不熟悉,所以我正在努力理清头绪。 - RobHurd
1
不了解你正在做什么的更多信息,很难建议最佳策略,但为了帮助澄清协议方面的问题:你可以将HTTP视为“数据传输协议”;它定义了有关使用的端口、需要发送的数据格式以及需要包含的内容(例如数据长度或字符编码)的规则。然而,HTTP使用TCP [连接协议]。FTP使用TCP(端口21),POP/SMTP(等等)也是如此,但这些也都是自己的协议。UDP通常与在线游戏或效率至上时一起使用。 - Alfie
谢谢@Alfie。我认为我需要阅读关于HTTP作为数据传输协议以及其他提到的所有内容。我只是想设计一个嵌入式设备,记录温度读数、时间戳和唯一ID以在远程位置识别设备,然后安全地通过互联网将数据发送到服务器以存储在数据库中。 - RobHurd
1
我不会真的去烦恼那个,除非只是为了看看几个现有协议是如何工作的。HTTP 很可能对你需要的内容来说过于臃肿了。在制定协议时,您需要从最大潜在复杂性开始考虑。如果您的“数据包”很小且固定,则此操作非常简单。例如,您以一致的格式发送温度和时间戳,以字符 $ 作为起始字符:$001.002013-12-23(其中温度总是按格式 XXX.XXX 给出),您的服务器只需监听以 $ 开头、长度为 17 字节的数据包即可。 - Alfie
1
没错,就是这个 :) HTTP数据包使用约250字节来描述它们所包含的数据。通常这比你想让PIC处理的要多得多。如果您可以使用TCP,我会更喜欢这个选项。如果您需要/非常/实时的更新或正在快速传输数据,则UDP可能更好。如果您无法保证您的数据始终以简单格式存在,或者如果您需要更多的灵活性,请查看流行的Fletcher校验和(http://en.wikipedia.org/wiki/Fletcher's_checksum)。使用此方法,我将以唯一字符开头,后跟数据包长度开始所有数据包。 - Alfie
显示剩余2条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接