C# 设计与Arduino通信的协议';s通过TCP

C# 设计与Arduino通信的协议';s通过TCP,c#,c++,tcp,arduino,C#,C++,Tcp,Arduino,我希望我的公寓(前门、恒温器、灯等)能使用arduino通过TCP进行通信,实现自动化。我想制作一个易于解析的字符串消息协议,例如使用开始字节和停止字节。我不想使用最终可以用于字符串或命令的字符,所以我想使用一些ASCII控制字符 服务器将用C#编写,客户端将是带有以太网屏蔽的arduino(特别是更便宜的HR91105A模块) 从技术上讲,我的消息永远不应该被分解(它们将小于1KB),但我想在我决定进行分解的情况下设置一些消息组装机制。我是不是想得太多了?我应该相信我会得到全部信息吗 这是我第

我希望我的公寓(前门、恒温器、灯等)能使用arduino通过TCP进行通信,实现自动化。我想制作一个易于解析的字符串消息协议,例如使用开始字节和停止字节。我不想使用最终可以用于字符串或命令的字符,所以我想使用一些ASCII控制字符

服务器将用C#编写,客户端将是带有以太网屏蔽的arduino(特别是更便宜的HR91105A模块)

从技术上讲,我的消息永远不应该被分解(它们将小于1KB),但我想在我决定进行分解的情况下设置一些消息组装机制。我是不是想得太多了?我应该相信我会得到全部信息吗


这是我第一次设计系统通信协议(即使这只是一个小规模),我想知道是否有人有任何最佳实践

您绝对不应该依赖于一次调用receive函数就可以获得整个消息。TCP是一种字节流协议,句号为。它不会将信息粘在一起,并试图假装它几乎总是以痛苦告终


您可以使用一个简单的
name=value[,name=value]
类型协议。

设计协议需要考虑的事项

  • 可扩展性:协议规范应能够在需要时扩展自身。e、 g.今天一个命令只返回20字节,明天可能是50字节,因此始终尝试在发送和接收规范中包含请求字节数和响应字节数字段。Modbus是一个很好的例子,它一次提供多个寄存器读取

  • 错误检查和正确的错误代码定义[CRC]或错误代码保留字节总是有帮助的。在解析数据之前,您可以检查错误代码并决定如何处理此数据包。在串行通信中,它非常重要,在以太网中,它也变得非常有用,有助于测试

  • 日期-时间作为协议的一部分:这不是严格的要求,但它总是好的,因此在任何时候,客户端都应该知道服务器何时处理了数据,数据将始终准确,并与设备时间戳同步。数据刷新时的实时通信变得非常重要


  • 给我2美分

    我会使用换行符作为消息分隔符(您需要转义的唯一字符是该字符)。通过这种方式,例如,您可以使用StreamReader的ReadLine-WriteLine方法向另一端发送命令。其中
    T
    可以是您想要发送或接收的任何对象。您能提供一些TCP不可靠的参考吗?我的工作假设是,我将按照字节传输的顺序来传输字节,但要注意的是,我的连接将无限期暂停或可能关闭。我的假设有什么错误吗?TCP是可靠的。您将按照传输顺序获得传输的字节。但是,您认为您的邮件不会被拆分的假设是不合理的。TCP是一种字节流协议,它不保留应用程序消息边界、周期。
    TCP在通过IP网络进行通信的主机上运行的应用程序之间提供可靠、有序且经错误检查的八位字节流传递。
    这是来自。错了吗?我真的很想知道我的想法是否错了。你能给我指一些信息吗?这些信息是关于消息被分解的,这样我就能更好地理解了。史蒂夫·维基百科是对的。注意它说的是“八位字节流”。不是八位组。不是信息。小溪。流在组之间没有边界。TCP不是消息协议。TCP中没有“消息”。所以没有什么可以“分手”的。如果您指的是应用程序发送的字节块,那么它们没有特殊的边界。TCP只是不是一个消息协议。