Semtech提供了LoraWan节点端的源代码,目前只有ClassA和ClassC两种协议。github地址:https://github.com/Lora-net/LoRaMac-node。示例中的MCU为STM32,节点开发板可以从ST网站购买。
如果平台是STM32,直接在工程上修改添加自己的应用,或者把相应的文件复制到已有的工程,根据芯片的不同简单修改即可。如果需要在其他平台上实现,需要修改一些底层文件进行适配。
本人是在nrf51系列上移植了LoRaWAN的协议栈,对调试中遇到的问题和关键点进行介绍,
sx1276.c的需要修改几个函数以适应不同的平台:
根据GPIO pin脚不同和对应的平台操作函数进行修改
主要的修改文件是sx1272-board.c;spi-board.c;rtc-board.c
void SX1272SetAntSw( uint8_t opMode );设置天线发送接收,根据实际硬件进行设置
这个文件是RTC相关的,并且为LoRaWAN MAC层提供时间基准。根据自己的平台进行修改。
这个是SPI操作相关的文件。
其他的文件例如adc,gps,eeprom根据实际需要加入修改
实现LoRaWAN协议里的定时器功能,协议里面的接收窗口定时,延时发送等功能都会用到。
TimerTime_t TimerGetElapsedTime( TimerTime_t past );这个功能是计算当前时间和past这个时间点的时间差。如果这个不准确会导致发送失败或者节点发送过于频繁导致网络拥堵。51822中使用RTC作为计算依据,需要考虑RTC counter溢出的问题。
这个文件主要是配置LoRaWAN网络的相关参数,具体参数含义后面详细介绍
#define OVER_THE_AIR_ACTIVATION0 //入网方式,ABP或者OTAA,调试阶段可以先设置为ABP。
#define IEEE_OUI 和 #define LORAWAN_DEVICE_EUI 共同定义了设备的EUI
#define LORAWAN_APPLICATION_EUI //应用的EUI
#define LORAWAN_APPLICATION_KEY //应用的KEY,OTAA用来入网用的
#define LORAWAN_DEVICE_ADDRESS //设备地址,可以随机生成,也可以由OTAA入网后,由服务器分配
#define LORAWAN_NWKSKEY //网络会话的加密KEY
#define LORAWAN_APPSKEY //应用会话的加密KEY
LoRaWAN使用了3个 AES-128Key对数据通讯进行加密和解密----AppKey、NwkSKey、AppSKey
上图左边的节点类型按应用划分,有宠物使用的的,速度检测的等。Gateway是网关,不对数据进行解析只做数据转发功能。NS是LoRaWAN的网络服务器,对终端进行地址分配,数据接收发送,速率调整等功能,按照LoRaWAN协议对终端控制。Application服务器,对入网许可,应用数据等进行处理。
这个key事先保存在终端(node)和应用服务器(AS)两边,网络服务器(NS)并不知道,主要的作用是在设备入网时用来解析服务器发送过来的join accept帧里的payload,然后通过里面的AppNonce、NetID、pad16生成私有的AppSKey和NwkSKey
NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad16)
AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce | pad16)
理论上某一类应用里所有的终端---例如温度传感应用终端,每一个终端的AppKey都是不同的,是由某个根AppKey衍生出来分配给该类应用下的终端。这样的好处在LoRaWAN Spec里的注释是
Since all end-devices end up with unrelated application keys specific for each end-device,extracting the AppKey from an end-device only compromises this one end-device.
即使某一个终端的AppKey被破解出来,也只会损害这一个终端的数据,不会对该类应用下的所有终端的数据解析破解。
这个Key在OTAA方式用到,在ABP下不使用。
NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad16)
这个Key同由AS生成,直接分发给NS,终端node则直接由AppKey解密AS的frame,根据公式计算得出。在join accept时得到并存储在终端和NS两端,ABP方式直接写到终端里。
这个Key的作用范围是在node和NS两端,一个是对当Fport=0时的MAC commands 进行加密,在NS端解密
if( framePort == 0 )
{
LoRaMacPayloadEncrypt( (uint8_t* ) payload, LoRaMacTxPayloadLen, LoRaMacNwkSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, &LoRaMacBuffer[pktHeaderLen] );
}LoRaMacComputeMic( LoRaMacBuffer, LoRaMacBufferPktLen, LoRaMacNwkSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, &mic );
LoRaMacComputeMic( LoRaMacBuffer, LoRaMacBufferPktLen, LoRaMacNwkSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, &mic );
用在应用会话层,终端对应用层面上的数据进行加密,例如温度,位置等数据。NS层不会对应用数据进行解密,因为没有AppSKey,所以应用数据在网络传输阶段是安全的,最终在AS端对数据进行解密。downlink数据在node端进行解密。
if( framePort == 0 )
{
LoRaMacPayloadEncrypt( (uint8_t* ) payload, LoRaMacTxPayloadLen, LoRaMacNwkSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, &LoRaMacBuffer[pktHeaderLen] );
}
else
{
LoRaMacPayloadEncrypt( (uint8_t* ) payload, LoRaMacTxPayloadLen, LoRaMacAppSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, &LoRaMacBuffer[pktHeaderLen] );
}
采用3个加密KEY的优势可以更好的保证数据传输的安全性,终端和应用服务商可以选择多个NS提供商而不用担心应用数据被网络服务商窃听。
提供NS的服务商有国外的loriot这个是用的比较多的,国内的有NPLINK、八月科技、华立、唯传、门思、未来宽带等,国内主要以整个方案提供为主,包括node,Gateway,NS。
下一节继续介绍LoRaWAN网络的相关参数