使用C语言开发物联网网关时,经常需要通过串口、485接口等方式读取一些传感器的数据,因为网关设备和传感器复杂多样,电磁干扰往往会破坏传输的数据。为了保证传输数据的可靠性,通常采用一些策略。常用的策略是:数据校验+超时重传。具体过程如下:当发送方发送数据时,在发送方的基础上加入校验数据形成请求数据包(datapack),然后发送请求数据包,并启动保护定时器(GuardTimer)。接收方收到请求数据包后,采用与发送方相同的算法计算元数据,得到验证数据,然后与接收到的验证数据进行比较。如果相同,说明数据可靠,可以使用;否则,说明数据直接销毁丢弃。如果数据可靠,接收方将以相同格式的响应包回复发送方;如果发现数据损坏,接收方将不会回复任何数据。如果发送方在守卫定时器超时前正确接收到接收方回复的响应包,则停止守卫定时器并进行后续处理;如果在保护定时器超时时发送方还没有收到接收方回复的数据包,则在“1.”中重新发送数据包,以此类推,直到正确发送或达到重传次数。步骤1~3的重点是描述如何保证可靠的数据传输。实际场景中为了正确断包(识别数据包),数据包通常按照如下结构定义:包起始标识:通常使用固定数据,如0xFA、0xAA、0xA5等;metadatalength:根据元数据的长度,报文被破坏。例如:元数据长度占1字节,验证数据占2字节。当元数据长度为10时,数据包大小为14字节;metadata:发送或接收的,具有一定格式或意义的应用数据;校验数据:根据一定的校验算法(如checksum、crc等)计算得到的值。#defineMAX_DATA_LEN100/*假设元数据的最大长度为100字节*/typedefstructtag_data_pack{uint8_tsop;/*包起始标识符,(StartOfPack)*/uint8_tlen;/*元数据长度,假设为1字节*/uint8_tdatas[MAX_DATA_LEN+2];/*元数据+2字节的校验和数据*/}data_pack_t;在总线型通信中,通常会在数据包中加入目标设备的地址,以明确数据发送给了总线上的哪个设备,数据包的参考结构如下:用C语言描述如下:#defineMAX_DATA_LEN100/*假设元数据的最大长度为100字节*/typedefstructtag_data_pack{uint8_tsop;/*包起始标识符,(StartOfPack)*/uint8_taddr;/*目标设备地址,假设为1个字节*/uint8_tlen;/*元数据长度,假设为1个字节*/uint8_tdatas[MAX_DATA_LEN+2];/*元数据+2个字节的校验和数据*/}data_pack_t;
