LoRaWAN协议解析 第5章 MAC命令
2017-03-14 00:02
232 查看
1 前言
我正在陆续对《LoRaWAN102》即LoRaWAN协议规范 V1.0.2 版本(2016年7月定稿)协议的各个章节进行翻译。译文之外还对LoRaWAN协议和源码进行了解析,可点此查看帖子LoRa学习笔记_汇总。欢迎同行朋友们留言交流。
本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/
2 梳理解析
从LoRaWAN第4章的帧格式可以得到如下信息:MAC命令,要么使用FPort0来单独传输,要么使用非零的FPort来和数据一起传输。LoRaWAN第5章,LoRaWAN出于网络管理需要,提出了9条MAC命令,这个章节是对9条命令进行具体的描述。
说个题外话,CLAA(中国LoRa应用联盟)在9条命令以外还扩充了一些MAC命令。现阶段协议还不能公开,所以我就不多说了。中兴目前作为LoRa联盟董事会成员,也许以后会把这些拓展MAC命令引入到LoRaWAN协议也说不准,大家暂且当个课外知识了解下就好。
3 代码位置
MAC命令枚举
/*! * LoRaMAC mote MAC commands * * LoRaWAN Specification V1.0.1, chapter 5, table 4 */ typedef enum eLoRaMacMoteCmd { /*! * LinkCheckReq */ MOTE_MAC_LINK_CHECK_REQ = 0x02, /*! * LinkADRAns */ MOTE_MAC_LINK_ADR_ANS = 0x03, /*! * DutyCycleAns */ MOTE_MAC_DUTY_CYCLE_ANS = 0x04, /*! * RXParamSetupAns */ MOTE_MAC_RX_PARAM_SETUP_ANS = 0x05, /*! * DevStatusAns */ MOTE_MAC_DEV_STATUS_ANS = 0x06, /*! * NewChannelAns */ MOTE_MAC_NEW_CHANNEL_ANS = 0x07, /*! * RXTimingSetupAns */ MOTE_MAC_RX_TIMING_SETUP_ANS = 0x08, }LoRaMacMoteCmd_t; /*! * LoRaMAC server MAC commands * * LoRaWAN Specification V1.0.1 chapter 5, table 4 */ typedef enum eLoRaMacSrvCmd { /*! * LinkCheckAns */ SRV_MAC_LINK_CHECK_ANS = 0x02, /*! * LinkADRReq */ SRV_MAC_LINK_ADR_REQ = 0x03, /*! * DutyCycleReq */ SRV_MAC_DUTY_CYCLE_REQ = 0x04, /*! * RXParamSetupReq */ SRV_MAC_RX_PARAM_SETUP_REQ = 0x05, /*! * DevStatusReq */ SRV_MAC_DEV_STATUS_REQ = 0x06, /*! * NewChannelReq */ SRV_MAC_NEW_CHANNEL_REQ = 0x07, /*! * RXTimingSetupReq */ SRV_MAC_RX_TIMING_SETUP_REQ = 0x08, }LoRaMacSrvCmd_t;
MAC命令的接收处理
OnRadioRxDone()携带着MAC帧进来,经过层层筛选,最终到达ProcessMacCommands()来处理MAC命令。这里代码中涉及的两种处理方式,可以跟协议对应起来:port = 0时,MAC命令放在FRMPayload中,需要先解密再处理;port非零时,MAC命令放在fopts中。
if( port == 0 ) { if( fCtrl.Bits.FOptsLen == 0 ) { LoRaMacPayloadDecrypt( payload + appPayloadStartIndex, frameLen, nwkSKey, address, DOWN_LINK, downLinkCounter, LoRaMacRxPayload ); // Decode frame payload MAC commands ProcessMacCommands( LoRaMacRxPayload, 0, frameLen, snr ); } } else { if( fCtrl.Bits.FOptsLen > 0 ) { // Decode Options field MAC commands. Omit the fPort. ProcessMacCommands( payload, 8, appPayloadStartIndex - 1, snr ); } }
MAC命令的发送及回复
MAC命令的发送及回复处理都在这个函数中,AddMacCommand()。协议栈对MAC命令发送的处理还是比较简单的,都是放在Fopts中来传输,都在这个15字节的MacCommandsBuffer中。
End
That’s all.![](http://7xkqvo.com1.z0.glb.clouddn.com/wechat_mp_qrcode_other.png)
相关文章推荐
- LoRaWAN协议中文版_第5章 MAC命令
- FTP协议命令+返回值+返回值解析
- 在mac下使用终端命令通过ssh协议连接远程linux系统,代替windows的putty
- HSRP协议track命令的解析
- mysql 协议的退出命令包及解析
- mysql 协议的删除DB命令包及解析
- LoRaWAN协议解析 第6章 终端激活
- 协议森林16 Mac OS X网络诊断命令
- mysql 协议的shutdown命令包及解析
- mysql 协议的processInfo命令包及解析
- LoRaWAN协议解析 第3章 PHY帧格式
- mysql 协议的创建DB命令包及解析
- mysql 协议的statistics命令包及解析
- FTP协议命令+返回值+返回值解析
- mysql 协议的初始化DB命令包及解析
- mysql 协议的FieldList命令包及解析
- DICOM命令集和数据集解析
- [流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[2]
- 经常用的一些开源协议的详细解析
- LINUX: 常用命令解析和技巧整理