背景
公司采购了基于lorawan协议的网关和传感器设备,需要做一个业务系统来对iot设备做统计和分析,并进行一些操作;主要包括电表,温湿度传感器,烟感等;
准备阶段
业务服务通过socker长连接和网关保持连接,通过约定的命令去主动或者被动发送和接收数据;
核心点是每类传感器的协议;
关键概念
协议数据采用16进制编码的二进制流返回,一次上报可能包含多个传感器的数据,需要手动拆包;
上行 |
由 LoRaWAN 传感器向上层发命令
|
下行 |
由上层向 LoRaWAN 传感器发命令
|
功能码 |
0100:主动上报命令
|
高位在前,地位在后 | |
大端数据 |
|
小端数据 |
开始解析
第一步 拆包
样例数据:a8 94 11 0c 00 02 ee ee ee ee ee ee 12 01 00 00 88 1d c1 07 6f 16 a8.........
上面是温湿度传感器上报的数据
根据协议,起始帧为a8 结束为16
将16进制的数据按a8和16拆包
第二步 解析控制码
第二个字节 94为控制码 94解析为二进制数据:10010100
高位第一位 1 则为上行数据 3~D0 0100 分析为主动上报命令,应为温湿度传感器主动上班的温湿度数据
第三步 获取数据域长度
根据协议 ,第三个字节为数据域长度 11H 转成10进制为17 说明数据域长度为17个字节
第四步 判断传感器类型
前两个字节 0c00代表传感器类型,由于采用的是高位在后,低位在前的编码方式 所以需要找000c对应的传感器
第五步 解析数据单元标识
数据单元标识的字节为02 ,根据文档02为传感器状态
第六步 获取数据单元,解析成想要的业务数据
数据单元的数据为ee ee ee ee ee ee 12 01 00 00 88 1d c1 07
根据文档 ee为无效码 所以实际的有效数据为12 01 00 00 88 1d c1 07
按照数据协议
12 01 00 00 低位在前 则为:00 00 01 12 转换为32位int 值为274 则光照度为274流明
88 1d 转换为int 值为 (7560 -5000)*0.01 =25.6摄氏度
湿度同理
来源:CSDN
作者:张大仙000
链接:https://blog.csdn.net/zhang_ming_xuan/article/details/103971591