代码之家  ›  专栏  ›  技术社区  ›  Ben Gartner

前向兼容通信协议设计指南?

  •  3
  • Ben Gartner  · 技术社区  · 16 年前

    我正在研究嵌入式设备之间的通信协议。未来协议肯定需要新的命令和字段。我需要做些什么来确保自己不会陷入困境?

    4 回复  |  直到 16 年前
        1
  •  6
  •   AShelly    16 年前

    1. 留下备件。
    2. 如果存在枚举消息类型,请确保类型字段可以容纳 增长。
    3. 可能包括一个“原始数据”消息,它可以用来包装下一代人想到的任何协议。

        2
  •  2
  •   David Cary    16 年前

    如果可能的话,让一个人在电缆的一端找出电缆的另一端是什么。 理想情况下,一个人可以连接一个哑终端,敲击键盘三次(输入问号回车),然后一条长而详细的信息会回来,描述它是什么样的机器,它的型号是什么,它的名称和电话号码以及建立它的组织的网站,“官方”协议版本号,以及非官方的构建时间:

    __DATE__ ": " __TIME__
    

    每次机器启动时也发送相同的详细信息。

    如果可能的话,试着设计你的协议,让一个有哑终端的人可以和你的设备通话。

    • 把你自己限制在人类可以阅读和打字的字符范围内。 the power of plain text .
    • 始终在每个数据包的末尾发送CR+LF(根据许多Internet协议的要求)。

    你可能还想浏览一下 common protocols for embedded systems . 有没有理由使用比标准更难解码的东西 Netstring format

        3
  •  0
  •   simon    16 年前

    这个问题有点笼统,无法得到明确的答案。嵌入式系统可能需要进行许多方面的通信;

    它需要与多少个对等方进行通信? 通信需要多少数据? 协议的物理介质是什么?带宽限制和易出错因素是什么?

    所有这些需求和资源限制肯定会限制系统,然后您就可以开始了解协议需要什么了。一旦你知道了这些问题,你就可以预测一些需求在将来是如何改变/扩展的。从那里您可以设计协议来适应(或不适应)最坏的用例。

        4
  •  0
  •   Rex Logan    16 年前

    我会用 HDLC . 我过去很幸运。我想要一个点对点的连载只要使用 Asynchronous framing

    除了使用HDLC对数据包进行成帧之外。我的数据包格式如下。这就是使用802.11传递选项的方式

    U8 cmd;
    U8 len;
    u8 payload[len];
    

    每个命令包的总大小是len+2

    #define TRIGGER_SENSOR 0x01
    #define SENSOR_RESPONSE 0x02
    

    另一个优点是,您可以添加新命令,如果您正确地设计解析器以忽略未定义的命令,那么您将具有一些向后兼容性。

    所以把它们放在一起,数据包会像下面这样。

     // total packet length minus flags len+4
     U8 sflag;   //0x7e start of packet end of packet flag from HDLC
     U8 cmd;     //tells the other side what to do.
     U8 len;     // payload length
     U8 payload[len];  // could be zero len
     U16 crc;
     U8 eflag;   //end of frame flag
    

    然后,系统将监视串行流中的标志0x7e,当它出现时,您将检查其长度是否为pklen>=4和pklen=len+4,并且crc有效。注意不要只依赖于crc的小数据包,你会得到很多误报也检查长度。如果长度或crc不匹配,只需重置长度和crc,然后开始解码新帧。如果是匹配的,则将数据包复制到新的缓冲区,并将其传递给命令处理函数。接收到标志时总是重置长度和crc。

    对于命令处理函数,抓取cmd和len,然后使用开关来处理每种类型的命令。我还要求某些事件发送响应,以便系统的行为类似于事件驱动的远程过程调用。

    因此,例如,传感器设备可以有一个计时器或响应一个命令来获取读数。然后,它将格式化一个数据包并将其发送到PC机,PC机将响应它已收到该数据包。如果没有,则传感器设备可以在超时时重新发送。

    另外,在进行网络传输时,应将其设计为网络堆栈,如 OSI modle data link layer 以及 RPC and command handling is the Application Layer .