1 前言
从2013年Semtech公司发布第一代商用LoRa芯片以来,LoRa技术经受住了物联网行业的考验,凭借其低功耗远距离等技术优势,近几年在全球物联网无线通信的细分市场上攻城拔寨,并一直保持着高速发展的态势。特别是在智能表计、智能烟感等民用公有事业领域得到广泛应用与认可,已经成为一种主流的物联网连接技术。
除了私有LoRa被广泛应用外,在LPWAN技术领域,相比其他LPWAN技术(NB-IoT、Sigfox等),LoRa技术在LPWAN市场赢得了领先地位,基于LoRa定制的LoRaWAN标准也逐步成为低功耗广域网(LPWAN)的事实标准。
来自IHS Markit报告的一组市场数据:
- 2017年出货量超过3200万个LoRa节点,
- 2018年则增长到了5700万个LoRa节点以上
- 截止2019年4月,全球已部署超过 9000万个LoRa节点 和 超过24.5万个LoRa网关
- 到2020年,在所有低功耗广域网公用网络中,超过50%都有望使用基于LoRa网络的设备
- LPWA连接预测,LoRaWAN 2014年到2021年复合增长率(CAGR)= 158%
学习无线通信协议,Sniffer工具不能少,尤其是入门阶段与产品前期开发阶段,通过Sniffer可以深入了解协议本身,同时有助于快速发现可能的问题点,排查原因。
为了更深入学习当前非常火热的LPWAN技术——LoRaWAN,本文设计了一个LoRaLoRaWAN的协议分析工具——LW-Sniffer。接下来详细说明设计LW-Sniffer的相关内容,LW-Sniffer当前主要用于解析LoRa/LoRaWAN空口数据包等。主要涉及内容有TencentOS Tiny(内核组件)、shell、LoRaWAN(LoRa终端设备、LoRa网关SX1301、LoRaWAN协议规范等)、TCP/IP/UDP(Ethernet、WiFi-ESP8266)、Wireshark抓包工具等。
2 LoRaWAN协议简介
LoRaWAN是LoRa联盟于2015年1月正式对外发布的基于LoRa的开放LPWAN标准。
- LoRa联盟定义了LoRaWAN体系架构与LoRaWAN规范(LoRaWAN Specification1.0.x、1.1...)。
- LoRaWAN体系架构,是一个典型的物联网系统架构 —— 云 管 端
- 按照OSI7层参考模型,LoRaWAN规范目前只定义到了MAC层(即数据链路层的下层,没有上层LLC)
- LoRaWAN MAC 协议规范主要定义了设备类型(Class ABC...)及其工作机制、报文帧类型与格式、MAC命令、 安全加密方式、数据出错校验(MIC)、网络访问等
入网是LoRaWAN通信的开始,OTAA激活方式下,OTAA设备通过发送Join Request(入网请求)来申请加入目标LoRaWAN网络,只有正确加入LoRaWAN网络的设备,才能进行数据通信。
OTAA入网流程当前主要包含了两个消息:
- Join Request
- Join Accept
数据通信阶段用于传递物联网设备的数据信息与网络的MAC命令等。
根据数据消息是否有显性应答,数据消息分为确认帧(Confirmed-data message)与非确认帧(Unconfirmed-data message)
- 确认帧 :接收端必须应答
- 非确认帧 :接收端不要求应答
2.1 LoRaWAN协议帧格式
帧结构是通信协议的核心设计内容。设计MAC层的非常重要的工作之一就是帧数据结构的设计。
LoRaWAN规范(LoRaWAN Speicification)虽然只定义到了数据链路层(无上层LLC层,只有下层MAC层),但是LoRaWAN空口帧结构作为LoRaWAN规范的核心知识要点,设计精简,是学习无线通信协议的很好参考。
LoRaWAN协议规范自下而上设计,充分发挥了LoRa的硬件优势(远距离、低功耗),LoRaWAN空口帧结构非常精简,如下图所示。这样最大化优化了物联网终端的功耗,降低整体系统的复杂度、系统成本等。
下图基本涵盖了LoRaWAN1.0.x空口传输的主体信息。
LoRaWAN物理层主要是LoRa物理层(部分Regional Parameter有采用FSK,作为高速应用的补充,比如EU868)
- LoRa物理层采用LoRa有头模式(Explicit Header Mode)(PS:除了Class B Beacon,其采用了Implicit Header)
- LoRaWAN上行带硬件CRC,下行不带硬件CRC。
- 采用的同步字是0x34(公网同步字,有别于现有市场的私有LoRa的同步字0x12)。
LoRaWAN空口帧的MAC层按照消息类型(MTypes)来看,LoRaWAN1.0.x当前主要有6个消息类型:
- 入网 2个
- 0x00 - Join Request
- 0x02 - Join Accept
- 数据通信 4个
- 0x04 - Unconfirmed Data Up
- 0x06 - Unconfirmed Data Down
- 0x08 - Confirmed Data Up
- 0x0A - Confirmed Data Down
LoRaWAN1.0.x 针对Class AC当前主要有如下MAC命令。MAC命令属于LoRaWAN MAC协议层数据,主要用于实现网络的运维与管理、网络动态优化等。
斜体MAC命令为设备端发起(即CID = 0x02、0x0D),其他CID由服务器发起
CID | MAC命令 | 描述 |
---|---|---|
0x02 | LinkCheck | 可用于设备端进行LoRaWAN链路的可达性测试 |
0x03 | LinkADR | 用于NS服务器进行ADR提速与调整功率 |
0x04 | DutyCycle | 用于NS服务器进行占空比配置 |
0x05 | RxParamSetup | 用于NS服务器进行Rx速率参数(RX1RX2)调整 |
0x06 | DevStatus | 用于NS服务器获取设备电池信息与无线链路余量Margin |
0x07 | NewChannel | 用于NS服务器新增删除修改信道 |
0x08 | RxTimingSetup | 用于NS服务器进行RX1窗口时间(RX1Delay)的调整 |
0x09 | TxParamSetup | 用于NS服务器进行TX功率、驻留时间的调整 |
0x0A | DIChannel | 用于NS服务器对RX1窗口频率的特殊设定 |
0x0D | DeviceTime | 可用于设备端获取全网时间,辅助Class B Beacon 同步等 |
3 LW-Sniffer系统架构
LW-Sniffer当前主体功能是监听空口的LoRaLoRaWAN数据包(来自LoRaWAN终端设备),数据解包后,可根据需要选择通过串口EthernetWiFi三种方式之一,传送到PC端。在PC端通过串口调试助手Wireshark来进一步查看获取的空口包。
3.1 LW-Sniffer系统框图
LW-Sniffer系统硬件部分主要包括:
- 电源:使用5V1A的电源连接顶部SX1301扩展模组的miniUSB接口;
- 串口:连接Nucleo板的miniUSB-COM口;
- 网口:LAN8742A
- 天线:CN470频段 天线;
- LoRa网关射频板:SX1301
- WIFI模块:ESP8266
注:先给SX1301射频板供电
3.1.1 主要硬件接口 - SX1301接口(SPI)
PIN NAME | PIN Description |
---|---|
VIN | Power supply to Nucleo-F746ZG Board from External 5V |
PE11-CSN (SPI4) | CSN of SPI for SX1301 |
PE13-MISO (SPI4) | MISO of SPI for SX1301 |
PE12-SCK (SPI4) | SCK of SPI for SX1301 |
PE14-MOSI (SPI4) | MOSI of SPI for SX1301 |
PF12-RST (GPIO) | Reset for SX1301 |
SX1301 SPI接口
3.1.2 主要硬件接口 ESP8266接口(USART2)
杜邦线连接到ESP8266串口模块。
注:ESP8266与MCU的串口线需要交叉
3.2 LW-Sniffer软件框架
LW-Sniffer软件架构,主要包括以下内容:
- 应用层
- LoRaWAN协议解析串口协议UDP ClientShell命令处理...
- RTOS层
- TencentOS tiny内核内核组件ATKVLwIPSAL…
- 基于TencentOS tiny提供的组件与实例,可以非常快速高效的搭建应用产品开发。
- 硬件抽象层
- STM32F746ZG HALSPI串口EthernetSX1301驱动库…
4 LW-Sniffer主体功能实现
LW-Sniffer当前主要有以下功能:
- LoRaWAN协议捕获与解析
- 支持对LoRaWAN上行与或下行数据监听
- 支持8-CH LoRaWAN网络
- LoRa私有协议
- 支持对LoRa私有数据包进行抓包分析
- shell
- 支持shell命令设定lw-sniffer工作参数
- LoRaWAN协议呈现方式
- 本地直显
- 支持通过串口与PC串口助手进行LoRaWAN协议分析
- 支持Wireshark协议解析
- 支持通过串口与PC Wireshark进行LoRaWAN协议分析
- 支持通过网口与PC Wireshark进行LoRaWAN协议分析
- 支持通过WIFI与PC Wireshark进行LoRaWAN协议分析
- 本地直显
4.1 参数配置
LW-Sniffer支持通过串口Shell命令来进一步配置LW-Sniffer的运行参数。
LW-Sniffer shell功能当前基于TencentOS tiny shell组件与开源软件letter-shell开发,由于TencentOS tiny shell当前不支持串口shell直接交互,因此后期主要基于letter-shell搭建新功能。letter-shell也比较方便跟TencentOS tiny shell组件兼容。
letter-shell github地址 https://github.com/NevermindZZT/letter-shell
LW-Sniffer shell 当前定义了两种命令输入方式。
- 串口shell工具输入
- 键盘按键输入
4.1.1 Shell命令使用要求- 串口通信参数
- 115200N81
- Shell命令格式
- 命令 rn结束
- 115200N81
- 命令 rn结束
4.1.2 Shell命令集
当前支持的Shell命令如下所示:
序号 | shell命令 | 命令说明 |
---|---|---|
1 | help | 打印当前支持的shell命令 |
2 | ps | 打印当前系统的所有任务 |
3 | reboot | 重启系统 |
4 | loramac <public>,<rx_iq_invert>,<crc> | 设置LoRaMac解析方式等 |
5 | radio <radio_chain>,<enable>,<freq> | 设置LoRa射频参数等 |
6 | sniffer <operation mode> <cfg> | 设置LW-Sniffer协议解析方式 |
7 | deveui <deveui_index> <deveui> <appkey> | 设置解密设备及其秘钥 |
8 | save | 保存参数到FLASH |
4.1.2.1 help命令
help命令用于显示当前支持的shell命令集与每个命令的说明信息。
例如:
4.1.2.2 ps命令
ps命令用于显示系统任务及其任务状态等
例如:
4.1.2.3 loramac命令
loramac命令用于设置LoRaMac解析方式
loramac <public> <rx_iq_invert> <crc> <devaddr_filter>
- public 设置LoRa同步字
- 0 - 私有LoRa ( 缺省为 LoRa同步字0x12 )
- 1 - 公网LoRa ( LoRa同步字为0x34 )
- rx_iq_invert 设置RX IQ是否反转
- 0 - 不反转,接收LoRaWAN上行数据
- 1 - 反转,接收LoRaWAN下行数据
- crc_filter 设置CRC过滤方式
- 0 - CRC only,只输出CRC正确的包(LoRaWAN上行数据)
- 1 - no CRC only,输出没有CRC的包 ( LoRaWAN下行数据)
- 2 - CRC and no CRC,输出CEC正确与没有CRC的包( LoRaWAN上行 下行数据)
- 3 - CRC all and bad,输出所有包(CRC正确、没有CRC、CRC错误的包)
- devaddr_filter,是否按照devaddr过滤
- 0 - 不过滤(显示全部)
- 非0 - 只显示设置的devaddr
例如
// LoRaWAN方式,rx_iq反转,CRC缺省 LORAMAC 1 0rn
2 读取参数
loramac
4.1.2.4 radio命令
radio命令用于设置SX1301 LoRa射频参数
- 设置参数
radio <radio_chain> <enable> <freq>
- radio 选择SX1301的radio通道
- 0 - radio0
- 1 - radio1
- 2 - 自动选择并设置radio0 与 radio1
- enable 设置是否使能SX1301 Radio通道
- 0 - 不使能
- 1 - 使能
- freq,设置SX1301工作频率,单位Hz
- 当 radio_chain = 0 1,freq为radio0radio1的中心频率fc
- radio0radio实际工作的信道频率 = fc - 300kHz,fc - 100kHz,fc 100kHz,fc 300kHz
- 当 radio_chain = 2,freq为8个信道的起始频率,lw-sniffer内部自动生成实际信道表
- 当 radio_chain = 0 1,freq为radio0radio1的中心频率fc
示例1 // 设置SX1301工作在起始频率为471.5开始的8个信道,则设置radio0 = 471.8 ,radio1 = 472.6 方式1: radio 0 1 471800000 radio 1 1 472600000 方式2: radio 2 1 471500000 上述两种方式是等效的,可根据实际情况来灵活设置
- 读取参数
radio
4.1.2.5 deveui命令
设置解密设备及其秘钥
deveui <deveui_index> <deveui> <appkey>
例如
设置deveui = 1122334455667788,appkey = 00112233445566778899AABBCCDDEEFF
deveui 0 1122334455667788 00112233445566778899AABBCCDDEEFF
4.1.2.6 sniffer命令
sniffer命令用于设置LoRaWAN协议的解析方式
sniffer <operation mode> <cfg>
- operation mode 为 LoRaWAN协议解析方式
- 0 - 串口直显模式
- 1 - 串口 Wireshark模式
- 2 - Ethernet Wireshark模式
- 3 - WiFi Wireshark模式
- <cfg> 配置Ethernet与WiFi是否使能
- bit0 - Ethernet
- 0 - 不使能
- 1 - 使能
- bit 1 - WiFi
- 0 - 不使能
- 1- 使能
- bit0 - Ethernet
4.1.2.7 save命令
save命令用于将参数保存到内部Flash,以实现掉电存储。重新上电后,LW-Sniffer以保存后的参数运行
例如
4.1.3 Shell键盘按键命令
键盘按键输入,当前主要定义了以下功能
- TAB键
- 用于打印shell命令及其帮助信息
- ESC键
- 用于退出sniffer模式与恢复sniffer模式
- 便于命令操作,有效避免sniffer工作过程中,大量输出的串口信息的影响。
- 用于退出sniffer模式与恢复sniffer模式
4.2 LoRaWAN协议解析
4.2.1 串口直显模式
串口直显模式是指通过串口与PC串口调试助手工具,直接显示解析后的LoRaWAN数据包。
接下来内容,结合LW-Sniffer捕获的空口包,简要分析下LoRaWAN协议。
4.2.1.1 入网
4.2.1.1.1 Join Request
Join Request(入网请求)包含了两个EUI号,数据长度都是8 Byte,分别是DevEUI与AppEUI。
- DevEUI遵循EUI-64命名规范,是设备的全球唯一标识。
- AppEUI命名规则根据实际运营网络而定。
- DevNonce为2 Byte的随机数,用来防止JOIN的重播攻击。
- NS服务器会跟踪记录每次JOIN Request中的DevNonce,只有在接收到第一条上行后,在删除该DevNonce
- NS服务器能够通过DevNonce值来识别出重播攻击,拒绝响应Join Accept。
- MIC(4 Byte)是对Join Request的完整性检查
- 只有拥有根秘钥AppKey,才能计算得到有效mic值,否则将被NS服务器拒绝,因此可以防止伪造节点。
4.2.1.1.2 Join Accept
Join Accept(入网接受包)是NS服务器对设备的入网许可回复。入网接受包通过Appkey来加密。
- AppNonce若为3 Byte的随机数,可(与DevNonce)每次派生出不同两个会话秘钥AppSKey、NwkSKey
- NetID(3 Btye)标识网络ID,用于区别同一地理区域内可能存在的多个不同运营商的LoRaWAN网络,全球性的NetID,LoRa Alliance已执行了新的管理办法。
- DevAddr(4 Byte)标识设备在网络内的短地址。
- DLSettings(1 Byte)用于NS服务器侧调整RX1,RX2的速率。可以根据不同地区,网关可支持的最大功率来调整,以实现上行与下行无线链路预算的平衡。
- RxDelay(1 Byte)用于NS服务器侧调整RX1窗口开启延时
- CFList(16 Byte)是可选的频率表字段,NS服务器可根据Reginal Parameters与实际部署需要,决定是否携带频率表信息。
- MIC是对Join Accept的完整性检查。
4.2.1.1.3 Join Request & Join Accept测试
- join request为明文传输,但MIC受appkey秘钥保护
- join accept内容部分为加密信息
- 若输入DevEUI与Appkey,则LW-Sniffer会对JoinAccept进行解密与解析,并计算得到NwkSKey与AppSKey。
- 若为输入DevEUI与Appkey,LW-Sniffer不会输出[INFO]信息
4.2.1.2 数据通信
数据通信遵循统一的帧格式
- DevAddr是入网后,获取的网内短地址标识。
- Fctl(1 Byte)是网络控制字节,按位来标识ADR、ACK、Fpending、Class B、Foptslen等网络控制信息
- Fcnt(2 Byte)是帧计数器,由发送端维护,即终端侧FCntUp与服务器侧FCntDown,LoRaWAN支持2 Byte与4 Byte的Fcnt。
- 4 Byte的Fcnt具有更大线性计数空间,相应的也具备更好安全性,但是需要发送端进行相应的计数器向上溢出、掉电上电保护等。
- 2 Byte的Fcnt则可以直接拿来就用,无需特殊保护。这次方式基本不太用。
- Fport(1 Byte)是应用端口号,用于指示FRMPayload的数据属性。Fport=0,FRMPayload用于传输MAC命令。Fport=224,FRMPayload用于传输LoRaWAN联盟定义认证测试应用。1~233 可根据实际情况,自定义使用。
- FRMPayload为应用数据。最大数据包长度受限于通信速率。
4.2.1.2.1 Data Unconfirm Up测试 & Data Unconfirm Down测试
- 终端设备上报一个非确认帧数据
- 服务器同时下发已缓存的用户数据(如果服务器有数据的话)
4.2.1.2.2 Data Confirm Up & Data Unconfirm ACK(down)测试
- 终端设备上报一个确认帧数据
- 服务器回复一个ACK(此处无用户数据,若有用户数据,则服务器会同时带下用户数据)
- 若在入网前,输入具体设备的DevEUI与AppKey,LW-Sniffer将会解密接收到的数据包
- 接收到下行用户数据,并进行数据解密的情况,如下图所示
4.2.1.2.3 Data Confirm Down & Data Unconfirm ACK(up)测试
- 服务器下发一个确认帧数据,比如MAC命令 CID=0x06 - 查询设备状态
- 终端设备回复ACK(此处Fport = 0,mac命令回复放在FRMPayload中)
4.3 LoRa私有协议解析
LoRa私有协议,需要关闭loramac公网设置,即设置同步字为0x12
loramac 0
4.2.1.3 小结
- 入网请求包(Join Request)是明文发送,但是受MIC(消息完整性检查)保护。(LoRaWAN的所有消息类型都受MIC保护)。
- 入网接受包(Join Accept)是密文发送。需要通过根秘钥AppKey解密得到。
- 入网可以实现会话秘钥(AppSKey、NwkSKey)的动态更新。
- 具备一定的防重播攻击、防伪节点的能力。
- MAC层网络开销是13字节,在没有FRMPayload的情况下,实际网络开销是12字节,即缺省情况下,未发送Fport.
4.2.2 Wireshark解包模式
Wireshark是抓包工具里面使用最为广泛的开源工具,截止到2019.4.8,Wireshark 最新版本3.0.1目前已支持3000 多种协议。不仅仅支持TCP、UDP等经典网络协议,还支持多种无线网络协议ZIGBEE、BLE、6LowPAN,LoRaWAN等等。
(1)LW-sniffer连接Wireshark主要实现原理:
- LW-sniffer将接收到LoRaWAN数据包,添加上LoRaTap的包头,以便进一步显示每包数据的射频参数信息。
- 如果监听到LoRa数据包通过串口接口发送给Wireshark,则需要使用到Wireshark extcap功能,使用python等脚本工具转换数据为wireshark的pcap数据包格式。
- 如果监听到LoRa数据包通过Ethernet或者WiFi接口,则直接使用UDP协议
(2)Wireshark主要设置
1. wireshark工具栏 -> "分析" -> "启用的协议" "Enabled Protocols",勾选使用LoRaTap、LoRaWAN来解析。
2. 在Wireshark接收到数据包后,wireshark工具栏 ->"分析" -> 选择实际使用端口,比如当前应用使用UDP port = 5000 -> 当前下拉框中选择 LoRaTap或者LoRaWAN。
3. 如果希望解密接收到数据,则在wireshark工具栏 -> "分析" -> "首选项" -> Protocol 找到LoRaWAN,点击"Edit"
4. 然后从网络服务器等获取设备DevAddr、NwkSKey、AppSKey、AppEUI并写入。
(3)UDP客户端与服务器测试
同时也可以使用IPOP.exe工具来测试,是否接收到UDP数据。实际使用的时候,IPOP.exe UDP服务端可不开启。
4.2.2.1 传输方式 - 以太网
通过shell命令配置传输模式为以太网:
sniffer 2
- 非确认帧下行包(因为没有用户数据,服务器少发Fport,提示格式不对,但是属于有效包)
4.2.2.2 传输方式 - WIFI
通过shell命令配置传输模式为WiFi:
sniffer 3
5 LW-Sniffer固件升级
STLink V2.1是CMSIS DAP的变种:
- Nucleo链接到电脑则会识别出STlink、串口、U盘!
- 直接将bin文件拖动到U盘,Daplink会自动烧入到目标芯片Flash,就可以实现程序的更新。非常的方便
注:需要先给 SX1301网关板子供电。
6 参考
- LoRa联盟
- https://lora-alliance.org/
- TencentOS tiny官网
- https://cloud.tencent.com/product/tos-tiny
- TencentOS tiny代码
- https://github.com/Tencent/TencentOS-tiny
- TencentOS tiny 开发指南
- https://cloud.tencent.com/document/product/1098/36351
- TencentOS tiny SDK文档
- https://cloud.tencent.com/document/product/1098/36330
- Semtech LoRa芯片产品
- https://www.semtech.com/lora/lora-products.
- Semtech LoRa transceivers芯片
- https://www.semtech.com/products/wireless-rf/lora-transceivers
- Semtech 射频前端transceivers芯片
- https://www.semtech.com/products/wireless-rf/lora-gateways/sx1255
- 强大的开源串口shell letter-shell
- https://github.com/NevermindZZT/letter-shell
7 作品PPT
8 作品演示视频
链接:https://pan.baidu.com/s/1tCAN_0srFcX-FMljFdOznw
提取码:g7qm