通信协议设计注意事项

来源:互联网 发布:疯狂淘宝李涛收费 编辑:程序博客网 时间:2024/06/16 02:42

设计自定义通信协议有几个需要注意的情况:

  1回执问题

   2防堵塞设计

  3超时


 1回执问题

     为了准确获取下发的命令的后续执行情况,就必须设计一种机制反馈命令的执行情况。例如手机短信可以开启短信是否发送成功的的提示。这其实就是一种回执,由于是异步的,自然不能使用返回值之类的简单方法了。当然还有更复杂的设计例如,下发一个修改时间的命令,下位机是否收到命令,时间是否修改成功,就需要两类回执,一类是下位机是否收到命令,一类是时间是否修改成功。

  为了表示是一个整体过程,则需要把把这几类命令串联起来,设计思想其实有点想web程序的session,整个过程需要一个编号,表示是一个命令的执行过程的一部分。如果发送了两条修改时间的命令,返回一条修改成功的回执,如何知道是哪一次的修改成功呢?因此设计的命令session就应该解决此类问题。根据发送命令的时间和设备编号生成 session 编号。

  2防堵塞设计

   有时为了防止硬件故障,或者软件错误,导致反复发送一条命令,进而导致整个系统故障,需要设计防堵塞设计,给每一个命令根据时间生成一个编号。这样既可以区分同一个命令,又可以避免故障。

 3超时

   既然是异步,命令的执行结果不能马上知道,必然需要处理超时,例如发送了一条设置时间命令,只收到了下位机收到命令的回执,但没有收到是否执行成功的回执,如何知道时间是否修改成功。这就需要设计超时,超过一定时间没有回执,则认为命令执行失败。具体时间应该有多大,就要根据实际情况了。


 private static DateTime lastTimeStamp = DateTime.Now;        public static string CreateQn(){            var time = DateTime.Now;            if (time <= lastTimeStamp){                time = lastTimeStamp += TimeSpan.FromMilliseconds(1);                return time.ToString("yyyyMMddHHmmssfff");            }            lastTimeStamp = time;            return time.ToString("yyyyMMddHHmmssfff");        }




1 0