我希望使用通过TCP进行通信的arduino来自动化我的公寓(前门,恒温器,灯等)。我想制作一个易于解析的字符串消息协议,例如使用起始字节和停止字节。我不想使用最终可以在字符串中使用的字符或作为命令,所以我在想一些ASCII控制字符。
服务器将用C#编写,客户端将是带有以太网屏蔽的arduino(特别是更便宜的HR91105A模块)。
从技术上讲,我的消息永远不应该被分解(它们将小于1 kb)但是我想放置一些消息组装机制,以防我决定拥有它。我是否想过这个?我应该依靠它来获取整个信息吗?
这是我第一次设计系统通信协议(即使这只是一个小规模),我想知道是否有人有任何最佳实践?
答案 0 :(得分:1)
你绝对应该不依赖于你只需要一次调用接收函数就可以获得整个消息。 TCP是字节流协议,周期。它不会将消息粘合在一起,并试图假装它几乎总是以痛苦结束。
您可以使用简单的name=value[,name=value]<newline>
类型协议。
答案 1 :(得分:1)
设计要考虑的协议
可扩展性:协议规范应能够在需要时自行扩展。例如今天一个命令明天只返回20个字节,它可以是50个,所以总是尝试在发送和接收规范中有所需字节和响应字节的字段。 Modbus就是一个很好的例子,它可以一次性提供多个寄存器读取。
错误检查和正确的错误代码定义[CRC]或ERROR CODE保留字节总是有帮助的。在解析数据之前,您可以检查错误代码并决定如何处理此数据包。在串行通信中,它在以太网中非常重要,它变得有用并有助于测试
作为协议的一部分的日期时间:这不是严格的要求,但它始终是好的,因此客户端应该知道服务器何时处理数据将始终准确并与设备时间戳同步。数据刷新时的实时通信变得非常重要
我2美分