【IoT应用创新大赛】基于TencentOS tiny与LoRa SX1301的LoRaWAN协议分析工具

2020-05-06 11:46:11 浏览数 (1)

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体系架构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空口帧结构LoRaWAN空口帧结构

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来进一步查看获取的空口包。

LW-Sniffer设计规划LW-Sniffer设计规划

3.1 LW-Sniffer系统框图

LW-Sniffer系统框图LW-Sniffer系统框图
系统硬件连接系统硬件连接

LW-Sniffer系统硬件部分主要包括:

  • 电源:使用5V1A的电源连接顶部SX1301扩展模组的miniUSB接口;
  • 串口:连接Nucleo板的miniUSB-COM口;
  • 网口:LAN8742A
  • 天线:CN470频段 天线;
  • LoRa网关射频板:SX1301
  • WIFI模块:ESP8266

注:先给SX1301射频板供电

3.1.1 主要硬件接口 - SX1301接口(SPI)

SX1301射频板与nucleo-F746连接SX1301射频板与nucleo-F746连接

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接口SX1301接口

SX1301 SPI接口

使用CubeMX进行SX1301引脚配置使用CubeMX进行SX1301引脚配置

3.1.2 主要硬件接口 ESP8266接口(USART2)

nucleo-stm32f746ZG CN9nucleo-stm32f746ZG CN9

杜邦线连接到ESP8266串口模块。

注:ESP8266与MCU的串口线需要交叉

3.2 LW-Sniffer软件框架

LW-Sniffer软件框架LW-Sniffer软件框架

LW-Sniffer软件架构,主要包括以下内容:

  • 应用层
    • LoRaWAN协议解析串口协议UDP ClientShell命令处理...
  • RTOS层
    • TencentOS tiny内核内核组件ATKVLwIPSAL…
    • 基于TencentOS tiny提供的组件与实例,可以非常快速高效的搭建应用产品开发。
  • 硬件抽象层
    • STM32F746ZG HALSPI串口EthernetSX1301驱动库…

4 LW-Sniffer主体功能实现

LW-Sniffer1.0主体功能LW-Sniffer1.0主体功能

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 当前定义了两种命令输入方式。

  1. 串口shell工具输入
  2. 键盘按键输入
    全能终端调试工具全能终端调试工具

4.1.1 Shell命令使用要求
  • 串口通信参数
    • 115200N81
  • Shell命令格式
    • 命令 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射频参数

  1. 设置参数

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内部自动生成实际信道表

示例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 上述两种方式是等效的,可根据实际情况来灵活设置

  1. 读取参数

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- 使能
4.1.2.7 save命令

save命令用于将参数保存到内部Flash,以实现掉电存储。重新上电后,LW-Sniffer以保存后的参数运行

例如

KV数据存储KV数据存储

4.1.3 Shell键盘按键命令

键盘按键输入,当前主要定义了以下功能

  • TAB键
    • 用于打印shell命令及其帮助信息
  • ESC键
    • 用于退出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,分别是DevEUIAppEUI

  • 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 & Join Accept测试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测试
  • 终端设备上报一个非确认帧数据
  • 服务器同时下发已缓存的用户数据(如果服务器有数据的话)
Data Unconfirm Up测试 & Data Unconfirm Down测试Data Unconfirm Up测试 & Data Unconfirm Down测试
4.2.1.2.2 Data Confirm Up & Data Unconfirm ACK(down)测试
  • 终端设备上报一个确认帧数据
  • 服务器回复一个ACK(此处无用户数据,若有用户数据,则服务器会同时带下用户数据)
Data Confirm Up & Data Unconfirm ACK(down)测试Data Confirm Up & Data Unconfirm ACK(down)测试
  • 若在入网前,输入具体设备的DevEUI与AppKey,LW-Sniffer将会解密接收到的数据包
确认帧上行,解密数据确认帧上行,解密数据
  • 接收到下行用户数据,并进行数据解密的情况,如下图所示
服务器ACK,同时包含下行用户数据,解密数据服务器ACK,同时包含下行用户数据,解密数据
4.2.1.2.3 Data Confirm Down & Data Unconfirm ACK(up)测试
  • 服务器下发一个确认帧数据,比如MAC命令 CID=0x06 - 查询设备状态
  • 终端设备回复ACK(此处Fport = 0,mac命令回复放在FRMPayload中)
Data Confirm Down & Data Unconfirm ACK(up)测试Data Confirm Down & Data Unconfirm ACK(up)测试

4.3 LoRa私有协议解析

LoRa私有协议,需要关闭loramac公网设置,即设置同步字为0x12

loramac 0

LoRa私有数据包LoRa私有数据包
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主要实现原理:

  1. LW-sniffer将接收到LoRaWAN数据包,添加上LoRaTap的包头,以便进一步显示每包数据的射频参数信息。
  2. 如果监听到LoRa数据包通过串口接口发送给Wireshark,则需要使用到Wireshark extcap功能,使用python等脚本工具转换数据为wireshark的pcap数据包格式。
  3. 如果监听到LoRa数据包通过Ethernet或者WiFi接口,则直接使用UDP协议

(2)Wireshark主要设置

1. wireshark工具栏 -> "分析" -> "启用的协议" "Enabled Protocols",勾选使用LoRaTap、LoRaWAN来解析。

使能Wireshark解析的目标协议使能Wireshark解析的目标协议

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服务端可不开启。

IPOP UDP测试IPOP UDP测试

4.2.2.1 传输方式 - 以太网

通过shell命令配置传输模式为以太网:

sniffer 2

join request数据包join request数据包
join accept数据包join accept数据包
确认帧上行包确认帧上行包
确认帧上行包(续)确认帧上行包(续)
确认帧下行包确认帧下行包
非确认帧上行包非确认帧上行包
非确认帧下行(12字节)非确认帧下行(12字节)
  • 非确认帧下行包(因为没有用户数据,服务器少发Fport,提示格式不对,但是属于有效包)
4.2.2.2 传输方式 - WIFI

通过shell命令配置传输模式为WiFi:

sniffer 3

join request数据包join request数据包

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

基于TencentOS tiny与LoRa SX1301的LoRaWAN协议分析工具(LW-Sniffer1.0) Rev1.2.pptx

8 作品演示视频

链接:https://pan.baidu.com/s/1tCAN_0srFcX-FMljFdOznw

提取码:g7qm

0 人点赞