1.TLV简介
TLV :即Tag(Type)-Length-Value,它包含三个域,第一个Tag为要封装的数据的类型域,第二个Length为封装的总的数据长度,第三个Value为要装入数据的值。其实就是一个简单的自定义通信协议,将要传送的数据进行编码组织将其发送出去的过程。
这是基本的tlv报文格式,在实际应用中我们可能会碰见在传输过程中数据发生跳变,这时候我们需要在一个字节流末尾加一个CRC校验,传输前算一下字节流的大小,传输到另外一个端口后再算一下,对比前后两个CRC的值,如果相同,表示没有发生字节跳变,反之,则舍弃。
加工后tlv报文:
PACK_HEADE是自己定义的(0xFD),大小通常为一个字节;Tag也是自己定义,通常为一个字节;Length的大小要看你的数据所占用的字节大小,它的大小为包头大小+Tag大小+Length大小+校验和大小+数据字节大小,自身一般占用一个字节;crc校验和一般占两个字节。发送过程中如果不加头,发送的数据0x05 0x02 0x3c,在接收端就会以Tag(Type)-Length-Value顺序进行解析,正常情况下可以获取到正确的值,但是当发生数据跳变或者混入其他数据时,接收端按照之前的顺序解析就会出错,当我们加上头的时候,接收端解析的时候会先找到包头,然后按顺序解析,但是这样还是有出错的可那,但是加上crc校验和之后,crc根据接收到的数据计算出一个校验和,用来和装包装进去的校验和进行比较,如果相同说明这一帧数据正确,接收端才会开始解析数据,如果不正确就不解析。
2.TLV的封包
下面是我对获取到的温度进行装包的代码:
int packtlv_temp(char *buf, int size)
{
unsigned short crc16=0;
int pack_len = 0;
int data_len = 0;
int ofset = 0;
float temp;
char datatime[32];
int i,j;
if(!buf || size < TLV_MINI_SIZE)
{
printf("Invalid input adgument\n");
return 0;
}
/* Packet head */
buf[ofset]=HEAD;
ofset +=1;
/* Tag */
buf[ofset]=TAG_TEMP;
ofset