项目中报文TLV格式

项目需求

这是我们的五月项目,我负责的是LoRa_Node 和 LoRa_AP部分

1.我要利用各种传感器采集相关消防节点数据,

2.然后我要利用STM8通过LoRa接受传感器节点的数据,

3.最后我要把节点数据通过串口发出去给IoT网关。

涉及到发送、接收数据,无论是用串口还是socket发送,一定都会要考虑到数据格式。数据格式有个人自定义的,也有市面上通用的、规定好的。郭工给我们说了一种比较好用的格式:TLV格式。


要求:
串口数据格式: 
Prefix(1B)     Tag(1B)   Length(1B)  Value(依赖L)  CRC16
Prefix:   0xFE
Tag:    0x01:  温度    0x02: 温湿度  0x03:  门开关
如果是温度:  length:  2B
如果是温湿度:  Length:  4B(2B温度+2B相对湿度)
如果是门开关:  Length: 1B
CRC16:   校验 Prefix~Value 


TLV格式

TLV是一种可变格式,意思为:Tag--类型, Lenght--长度,Value--值

Tag和Length的长度固定,一般那是2、4个字节(这里统一采用4个字节);

Value的长度由Length指定;


我采集的数据种类有1.温度  2.湿度  3.气压  4.水位 5...,这属于tag,一般为0x01 0x02 0x03 ..

假设:采集到的一组温度数据为34.12°C,温度传感器量程为:-55~125℃我要将这组数据用字节流发送出去,应该怎么规定呢?

T:采集温度类型的数据:0x01  

L: 温度的值为两个字节:0x02 

V:(1)温度有±,所以留出最高位为符号位,(0表示正温度,1表示负温度),即 (_ XXX XXXX)b 所以温度范围为-2^7---+2^7

即:-127~+127°C;(2)整数部分:34——32+2=>(0010 0010)=>0X22 ;小数部分:12——0x0C;

综上所述,这个TLV格式的温度数据为: 0x01 0x02 0X22 0x0C

为了防止数据丢失后全部乱套,一般采用添加加帧头数据0XFE,和最后的校验位CRC的方法。

即完整的一帧报文为:0XFE 0x01 0x02 0X22 0x0C CRC


我们获取数据可能的结果如下:

1.完美数据:0XFE 0x01 0x02 0X22 0x0C CRC

2.垃圾数据+完美数据:0x33 0XFE 0x01 0x02 0X22 0x0C CRC

3.继续接收是完美的数据(含TLV)中任意3个字节:0XFE 0x01 0x02 0X22 


那么我们怎么确定呢?读buf[]



猜你喜欢

转载自blog.csdn.net/luoyir1997/article/details/80219741