通信协议设计注意事项
Posted xuexiaodong2009
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通信协议设计注意事项相关的知识,希望对你有一定的参考价值。
设计自定义通信协议有几个需要注意的情况:
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");
以上是关于通信协议设计注意事项的主要内容,如果未能解决你的问题,请参考以下文章