LoRaWAN实战 LinkADR命令的源码分析
前言LinkADR是LoRaWAN网络管理中相当重要的一个MAC命令,其解析占用了183行。索性专门写篇源码解析,记录下。阅读此文前,最好再把第五章的这个命令好好翻一翻,代码和协议才能对应上。我正在陆续对协议的各个章节进行翻译,具体其他章节的译文,以及译文之外的代码解析,可点此查看帖子LoRa学习笔记_汇总。本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/LinkADRReq 的源码解析按照代码思路走一遍。1.解析 DataRate_TXPower 字段datarate = payload[macIndex++];txPower = datarate & 0x0F;datarate = ( datarate >> 4 ) & 0x0F;if( ( AdrCtrlOn == false ) &&( ( LoRaMacParams.ChannelsDatarate != datarate ) || ( LoRaMacParams.ChannelsTxPower != txPower ) ) ){ // ADR disabled don't handle ADR requests if server tries to change datarate or txpower// Answer the server with fail status// Power ACK = 0// Data rate ACK = 0// Channel mask = 0AddMacCommand( MOTE_MAC_LINK_ADR_ANS, 0, 0 );macIndex += 3; // Skip over the remaining bytes of the requestbreak;}如果终端ADR没开,那么就立即丢弃本命令处理。这里的macIndex += 3是对应LinkADRReq的剩余命令长度3而言的。2.解析 ChMask 字段chMask = ( uint16_t )payload[macIndex++];chMask |= ( uint16_t )payload[macIndex++] << 8;3.解析 Redundancy 字段nbRep = payload[macIndex++];chMaskCntl = ( nbRep >> 4 ) & 0x07;nbRep &= 0x0F;if( nbRep == 0 ){nbRep = 1;}把字段中的 chMaskCntl 和 nbRep 都给解析了出来。4.按地区规定处理 chMaskCntl ,及判断 ChMask 有效性#elif defined( USE_BAND_470 )if( chMaskCntl == 6 ){// Enable all 125 kHz channelsfor( uint8_t i = 0, k = 0; i < LORA_MAX_NB_CHANNELS; i += 16, k++ ){for( uint8_t j = 0; j < 16; j++ ){if( Channels[i + j].Frequency != 0 ){channelsMask[k] |= 1 << j;}}}}else if( chMaskCntl == 7 ){status &= 0xFE; // Channel mask KO}else{for( uint8_t i = 0; i < 16; i++ ){if( ( ( chMask & ( 1 << i ) ) != 0 ) &&( Channels[chMaskCntl * 16 + i].Frequency == 0 ) ){// Trying to enable an undefined channelstatus &= 0xFE; // Channel mask KO}}channelsMask[chMaskCntl] = chMask;}如果 chMaskCntl 为6,则所有信道都使能。如果 chMaskCntl 为7,则由于未定义返回失败。其他有效 chMaskCntl 情况下,先检查是否有未定义的频点,如果没问题则更新对应的channelsMask。5.判断速率有效性if( ValidateDatarate( datarate, channelsMask ) == false ){status &= 0xFD; // Datarate KO}6.判断发射功率有效性if( ValueInRange( txPower, LORAMAC_MAX_TX_POWER, LORAMAC_MIN_TX_POWER ) == false ){status &= 0xFB; // TxPower KO}7.全部判断通过后更新参数if( ( status & 0x07 ) == 0x07 ){LoRaMacParams.ChannelsDatarate = datarate;LoRaMacParams.ChannelsTxPower = txPower;memcpy1( ( uint8_t* )LoRaMacParams.ChannelsMask, ( uint8_t* )channelsMask, sizeof( LoRaMacParams.ChannelsMask ) );LoRaMacParams.ChannelsNbRep = nbRep;}8.回复MAC命令 LinkADRAnsAddMacCommand( MOTE_MAC_LINK_ADR_ANS, status, 0 );突然发现 AddMacCommand 的形参只有CID加2字节的回复,我是太无聊,把终端所有MAC命令都翻了一遍,确认所有payload确实是小于2字节。再次赞扬LoRaWAN协议的精简作风。End了解详情台湾清华大学黄能富教授《LoRaLAN 私有物联网网路技术与应用实习》课程介绍
文字资料看累了?那让小萝拉带你来看看台湾清华大学黄能富教授《LoRaLAN 私有物联网网路技术与应用实习》课程的视频吧,其中关于LoRa应用的案例介绍更加直观和印象深刻。【如果您的浏览器不支持直接播放下列视频,可以点击此处下载播放】了解详情唯传LoRa网关路由器测试结果惊人,稳定传输可达21.5公里
近日,唯传科技应客户需求,对GW5000网关路由器(城市级)进行了长距离测试。因客户所处区域在戈壁滩上,准备在20 公里范围内安装1200个探测设备,选用基站进行远距离数据监测和传输。考虑到客户实际需求,唯传决定在深圳区域寻找大范围空旷地带模拟客户需求环境进行现场测试。此前半年,唯传也已经多次进行LoRa最大空空通讯距离的测试,测试结果得到了Semtech公司的高度认可。7月29日,唯传公司将GW...了解详情花费200欧元打造自己的LoRa网关
本文来源https://github.com/isiot/diy_LoRa_gateway本教程介绍一个便宜的LoRa网关的制作步骤,然后让节点、网关和云在一起运行。注:本文仅翻译自github,并未亲测part1硬件选择我要介绍的LoRa网关,运行在sx1301之上,该芯片不能单独出售,只出售给符合条件的客户。唯一的办法就是购买一个成品的网关板。目前市场基于sx1301的LoRa网关板有:Semtech LoRa物联网入门套件,只出售给符合条件的客户IMST iC880A,约189欧元:Multitech mCard-LoRa, 约156欧元:Link Labs LoRaWAN Raspberry Pi(树莓蒎) Gateway Board, 225美元:Cisco LoRa card, sold with Cisco IR900 router only(思科LoRa板卡,只提供思科IR900路由器):只有Multitech mCard-LoRa符合我们的预算,而剩下的其他硬件就很便宜了。mCard LoRa是一个为Multitech MultiConnect Conduit router定制的插件板,这个Mini-PCIe card没有使用文档可以提供,因为它是即插即用的。但是如果我们想把用它在其他的硬件环境下,我们应该对它进行逆向拆解。余下的硬件则需要一个嵌入式Linux主机像Raspberry Pi,25欧元:以及一个 USB to Mini-PCIe转换器, 5欧元:对了,别忘了还有电源适配器、电缆和天线。进入第2部分我们将探讨对mCard LoRa硬件上的修改。part2硬件改造mCard LoRa是一个Mini-PCIe规格的板卡。包含有一个sx1301基带芯片和两个sx1257 I/Q调制收发器(1 TX 2 RX) ,都集成在一个很小的板上。图中,射频链用蓝色线画出,包含发送通道上的“平衡-不平衡转换器”BALUN,声表面波滤波器saw,功率放大器PA,滤波器和开关接收通道上的声表面波滤波器saw,低噪声放大器LNA,声表面波滤波器saw在另一层有一个FTDI SPI转USB转换器FT232,以及一些电源芯片请看USB转Mini-PCIe板卡的电源引脚,GND引脚连接到地,3.3V的电源引脚(2,24,52)连接到了一些电源芯片的输入上(用于为数字部分供电)。但是为模拟部分供电的电源芯片的输入接到了引脚23和25。3个LDO器件lp38502sd-adj用于模拟供电并调整到3.3V输出,所以它们 的输入电压应该大于3.52v,因为它们工作时的最小压差是220mv,总之,我决定为迷你PCIe连接器的23和25脚提供5V电压,这个5V电压从 USB接口处取得。我推荐你使用一个质量好的USB接口供电.树莓蒎2有USB电流限制以防止集线器启动,可以修改启动文件/boot/config.txt,增加max_usb_current = 1来增大USB电流。part3软件编译Raspberry Pi足够强大,Raspbian(Raspbian,树莓派自带的基于debian的OS)系统自带了GCC,Git…这样我们就可以在Raspberry Pi里面进行软件编译,而不需要在桌面PC上编译后上传二进制文件到Raspberry Pi。打开一个控制台或SSH会话,默认的用户名是“pi”和密码“raspberry”。首先我们需要FTDI芯片FT232HQ的驱动(libmpsse.so),不要试图在网上找到它,因为它是依赖于平台的,所以最好是从源码编译:现在我们可以继续关于LoRa网关的部分了:下载源代码和编译,一旦完成编译,就把他们复制到 ~/lora/exec:最后,我们执行的LoRa gateway:本节我使用了这些链接作为参考资料:https://github.com/Lora-net/lora_gateway/blob/v3.1.0/libloragw/install_ftdi.txthttps://github.com/Lora-net/packet_forwarder/wiki/Use-with-Raspberry-Pipart4软件修改LoRa网关的软件部分本来应该做适当修改再进行编译的,但本教程第3部分用来编译的代码是我从原始lora_gateway代码fork的一个分支并做了必要的修改,所以你不需要修改任何文件如果你想知道我所做的修改,请阅读下文并查看我提交的commits。我第一次编译时,软件并没有运行起来,我意识到USB驱动没有被识别,因为我手上的mCard与LoRa开发套件(即与 https://github.com/Lora-net/lora_gateway 配套的套件)使用了不同的FTDI USB to SPI转换芯片FT232H,每个FT232H都有不同的PID(Product IDentification),我修改了源文件中的以下文件:loragw_spi.ftdi.c99-libftdi.rules为了使用FTDI SPI,我们必须做以下修改library.cfg现在,板子可以被正确识别但是还不能与SX1301通信,因为板子还处于复位状态,复位引脚是由主机通过FTDI的GPIO引脚来控制的,修改以下文件:loragw_spi.ftdi.c现在sx1301似乎开始工作但没有读寄存器,这是因为sx1301没有时钟源,两个sx1257通过共享的TCXO进行时钟驱动,sx1257具有时钟输出,用于驱动sx1301时钟, 查看schematic的文档,我发现是radio_0的时钟输出而不是radio_1的被连接到了sx1301的时钟输入,所以修改以下文件:global_conf.json完工!!!Note:写完本教程以后,MultiTech公开发布了具有相同补丁的的GIT库文件,地址在http://git.multitech.net/cgi-bin/cgit.cgi/lora_gateway.git/commit/?h=1.7.0-mts了解详情LoRaWAN协议(七)–完整数据流程
以下的GW指Gatewa所用指令tcpdump -i lo -nn -x 'length>100入网流程OTAA入网流程,ABP方式入网则不需要NS ->AS ->NS ->AS ->NS->GW Join_accept messGW ->数据通讯流程GW->NS ->AS ->AS ->app.userdata.payload bas...了解详情LoRaWAN协议(六)–OTAA KEY生成过程
前言通过OTAA方式入网的设备,通讯时使用的KEY需要通过服务器获得,在入网之间,设备无法通讯。相关的OTAA入网流程已经在上一章中讲解过了,有兴趣的可以去看看*LoRaWAN协议(五)__OTAA入网方式详述**这一章讲解的是OTAA中的密钥生成过程。其中使用到的库函数都是从semtech的官方库中来的,官方库代码链接:LoRaMac-node。详解设备在通讯时,会使用的密钥有NwkSKey 和AppSKey。生成的公式如下:NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad16)AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce | pad16)可以看到相关的参数一共有四个:1.AppNonce2.NetID3.DevNonce4.pad16其中AppNonce、NetID、pad16 是产生于服务器的,DevNonce产生于node设备本身。还是使用LoRaWAN协议(五)这篇文章中使用的包数据来进行分析。这里,我们调用官方库的接口,因为我们这里只是熟悉协议,并不是要研究Key的生成算法。如果不明白数据协议的,可以去看LoRaWAN协议(五)这篇文章提取DevNonce1.GW->NS JSON包,从中提取出来DevNonce,data为MAC层数据,为join_request message,其数据包格式为MHD | APPEU | DevEU | DevNonc | MI |
---|---|---|---|---|
1字节 | 8字节 | 8字节 | 2字节 | 4字节 |
字段 | 内容 |
---|---|
MHD | \x0 |
AppEU | \x01 \x00 \x00 \x20 \x00 \xc5 \x26 \x2 |
DevEU... |