<返回更多

C语言与物联网之简单通信协议

2020-06-24    
加入收藏

C语言物联网网关开发时,经常需要通过串口、485接口等从一些传感器读取数据,由于网关设备和传感器所处的环境复杂多样,电磁干扰等常常会破坏传输的数据,为了确保传输数据的可靠性,通常会采取一些策略,常用的策略:数据校验+超时重传,具体过程如下:

  1. 发送方在发送数据时,在元数据的基础上增加校验数据形成请求数据包(data pack),然后将请求数据包发送出去,并启动守卫计时器(Guard Timer)。
  2. 接收方在收到请求数据包后,以跟发送方相同的算法对元数据进行计算得到校验数据,然后跟收到的校验数据进行比较,若相同,则说明数据可靠,可以使用;反之,说明数据被破坏,直接丢弃掉。若数据可靠,接收方以同样的格式做成响应数据包回复给发送方;若发现数据被破坏,接收方不回复任何数据。
  3. 如果发送方在守卫计时器超时前正确地接收到了接收方回复的响应数据包,则停止守卫计时器,并进行后续的处理;若发送方在守卫计时器超时时仍未收到接收方回复的响应数据包,则重新发送"1."中的数据包,如此反复,直到正确发送或达到了重传次数。

步骤1~3重点为了讲述如何确保数据可靠传输,真实情景中为了能正确地断包(识别数据包),通常会按照如下结构来定义数据包:

C语言与物联网之简单通信协议

 

#define MAX_DATA_LEN  100     /* 假设元数据的最大长度为100字节 */
typedef struct tag_data_pack {
    uint8_t sop;                     /* 包起始标识,(Start Of Pack) */
    uint8_t len;                     /* 元数据长度,假设为1字节 */
    uint8_t datas[MAX_DATA_LEN + 2]; /* 元数据 + 2字节的校验数据 */
}data_pack_t;

总线式的通信中,通常还会在数据包中加入目标设备的地址,以便于确定数据是发往总线上的哪个设备,数据包的参考结构如下:

C语言与物联网之简单通信协议

 

用C语言描述如下:

#define MAX_DATA_LEN  100     /* 假设元数据的最大长度为100字节 */
typedef struct tag_data_pack {
    uint8_t sop;                     /* 包起始标识,(Start Of Pack) */
    uint8_t addr;                    /* 目标设备地址,假设为1字节 */
    uint8_t len;                     /* 元数据长度,假设为1字节 */
    uint8_t datas[MAX_DATA_LEN + 2]; /* 元数据 + 2字节的校验数据 */
}data_pack_t;

文中涉及的概念:

发送方、接收方、元数据、校验数据、请求数据包、响应数据包、守卫计时器。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>