从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,本文设计了一个LoRa\LoRaWAN的协议分析工具——LW-Sniffer。接下来详细说明设计LW-Sniffer的相关内容,LW-Sniffer当前主要用于解析LoRa/LoRaWAN空口数据包等。主要涉及内容有TencentOS Tiny(内核\组件)、shell、LoRaWAN(LoRa终端设备、LoRa网关SX1301、LoRaWAN协议规范等)、TCP/IP/UDP(Ethernet、WiFi-ESP8266)、Wireshark抓包工具等。
LoRaWAN是LoRa联盟于2015年1月正式对外发布的基于LoRa的开放LPWAN标准。
入网是LoRaWAN通信的开始,OTAA激活方式下,OTAA设备通过发送Join Request(入网请求)来申请加入目标LoRaWAN网络,只有正确加入LoRaWAN网络的设备,才能进行数据通信。
OTAA入网流程当前主要包含了两个消息:
数据通信阶段用于传递物联网设备的数据信息与网络的MAC命令等。
根据数据消息是否有显性应答,数据消息分为确认帧(Confirmed-data message)与非确认帧(Unconfirmed-data message)
帧结构是通信协议的核心设计内容。设计MAC层的非常重要的工作之一就是帧数据结构的设计。
LoRaWAN规范(LoRaWAN Speicification)虽然只定义到了数据链路层(无上层LLC层,只有下层MAC层),但是LoRaWAN空口帧结构作为LoRaWAN规范的核心知识要点,设计精简,是学习无线通信协议的很好参考。
LoRaWAN协议规范自下而上设计,充分发挥了LoRa的硬件优势(远距离、低功耗),LoRaWAN空口帧结构非常精简,如下图所示。这样最大化优化了物联网终端的功耗,降低整体系统的复杂度、系统成本等。
下图基本涵盖了LoRaWAN1.0.x空口传输的主体信息。
LoRaWAN物理层主要是LoRa物理层(部分Regional Parameter有采用FSK,作为高速应用的补充,比如EU868)
LoRaWAN空口帧的MAC层按照消息类型(MTypes)来看,LoRaWAN1.0.x当前主要有6个消息类型:
LoRaWAN1.0.x 针对Class A\C当前主要有如下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速率参数(RX1\RX2)调整 |
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 同步等 |
LW-Sniffer当前主体功能是监听空口的LoRa\LoRaWAN数据包(来自LoRaWAN终端设备),数据解包后,可根据需要选择通过串口\Ethernet\WiFi三种方式之一,传送到PC端。在PC端通过串口调试助手\Wireshark来进一步查看获取的空口包。
LW-Sniffer系统硬件部分主要包括:
注:先给SX1301射频板供电
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接口
杜邦线连接到ESP8266串口模块。
注:ESP8266与MCU的串口线需要交叉
LW-Sniffer软件架构,主要包括以下内容:
LW-Sniffer当前主要有以下功能:
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命令如下所示:
序号 | 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 |
help命令用于显示当前支持的shell命令集与每个命令的说明信息。
例如:
ps命令用于显示系统任务及其任务状态等
例如:
loramac命令用于设置LoRaMac解析方式
loramac <public> <rx_iq_invert> <crc> <devaddr_filter>
例如
// LoRaWAN方式,rx_iq反转,CRC缺省 LORAMAC 1 0\r\n
2 读取参数
loramac
radio命令用于设置SX1301 LoRa射频参数
radio <radio_chain> <enable> <freq>
示例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
设置解密设备及其秘钥
deveui <deveui_index> <deveui> <appkey>
例如
设置deveui = 1122334455667788,appkey = 00112233445566778899AABBCCDDEEFF
deveui 0 1122334455667788 00112233445566778899AABBCCDDEEFF
sniffer命令用于设置LoRaWAN协议的解析方式
sniffer <operation mode> <cfg>
save命令用于将参数保存到内部Flash,以实现掉电存储。重新上电后,LW-Sniffer以保存后的参数运行
例如
键盘按键输入,当前主要定义了以下功能
串口直显模式是指通过串口与PC串口调试助手工具,直接显示解析后的LoRaWAN数据包。
接下来内容,结合LW-Sniffer捕获的空口包,简要分析下LoRaWAN协议。
Join Request(入网请求)包含了两个EUI号,数据长度都是8 Byte,分别是DevEUI与AppEUI。
Join Accept(入网接受包)是NS服务器对设备的入网许可回复。入网接受包通过Appkey来加密。
数据通信遵循统一的帧格式
LoRa私有协议,需要关闭loramac公网设置,即设置同步字为0x12
loramac 0
Wireshark是抓包工具里面使用最为广泛的开源工具,截止到2019.4.8,Wireshark 最新版本3.0.1目前已支持3000+多种协议。不仅仅支持TCP、UDP等经典网络协议,还支持多种无线网络协议ZIGBEE、BLE、6LowPAN,LoRaWAN等等。
(1)LW-sniffer连接Wireshark主要实现原理:
(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服务端可不开启。
通过shell命令配置传输模式为以太网:
sniffer 2
通过shell命令配置传输模式为WiFi:
sniffer 3
STLink V2.1是CMSIS DAP的变种:
注:需要先给 SX1301网关板子供电。
链接:https://pan.baidu.com/s/1tCAN_0srFcX-FMljFdOznw
提取码:g7qm
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。