【问题标题】:Guidelines for designing forward compatible communication protocols?设计前向兼容通信协议的指南?
【发布时间】:2010-06-23 18:20:31
【问题描述】:

我正在研究嵌入式设备之间的通信协议。该协议将来肯定需要新的命令和字段。我需要做些什么来确保我不会把自己画到角落里?

【问题讨论】:

    标签: embedded protocols


    【解决方案1】:

    这是一个悬而未决的问题。以下是一些关于它的随机想法:

    1. 留下备用。
    2. 使用带有“要遵循的字节数”字段的非常基本的标头。
    3. 如果有枚举消息类型,请确保类型字段可以容纳 增长。
    4. 如果您使用位标志,请留下备用。
    5. 可能包含“原始数据”消息,可用于包装后代想到的任何协议。

    总之,留下备用。

    【讨论】:

      【解决方案2】:

      如果可能的话,让电缆一端的人弄清楚电缆的另一端是什么。 理想情况下,一个人可以连接一个哑终端并按三下键盘(Enter Question-mark Enter),然后会返回一条长而详细的消息,描述它是什么类型的机器,它的型号是什么,名称和构建它的组织的电话号码和网站、“官方”协议版本号和非官方构建时间:

      __DATE__ ": " __TIME__
      

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

      如果可能,请尝试设计您的协议,以便拥有哑终端的人可以与您的设备交谈。 HTTP 就是这样一种人类可读的协议,我怀疑这是它受欢迎的原因之一。 除其他外,人类可读意味着:

      • 限制自己使用人类可以阅读和输入的字符。 避免使用特殊的控制字符。利用the power of plain text
      • 始终在每个数据包的末尾发送 CR+LF(许多 Internet 协议都规定)。
      • 接受任何速率的字符,从 PC 的最大文件上传速度到非触摸打字的人慢慢敲击键盘。

      您可能还想浏览common protocols for embedded systems 的列表。 也许一个已经满足您的要求? 有什么理由使用比标准Netstring format 更难解码的东西吗?

      【讨论】:

        【解决方案3】:

        这个问题有点过于笼统,无法给出明确的答案。嵌入式系统可能需要在很多方面进行通信;

        它需要与多少对等方进行通信? 它需要通信多少数据? 系统需要多紧密同步? 协议的物理介质是什么,带宽限制和易错性考虑因素是什么?

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

        【讨论】:

        • 我不是在寻求关于整个设计的建议,只是在寻求使其面向未来的建议。也许一个更好的问题是,“我应该避免哪些具体的事情来制定向前兼容的通信协议?”
        【解决方案4】:

        我会使用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 这样的网络堆栈。 HDLC 是data link layerRPC and command handling is the Application Layer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-07
          • 2014-01-02
          • 1970-01-01
          • 2012-03-09
          • 2010-12-20
          • 1970-01-01
          相关资源
          最近更新 更多