前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LoRaWAN协议解析 第5章 MAC命令

LoRaWAN协议解析 第5章 MAC命令

作者头像
twowinter
发布2020-04-17 14:42:13
6070
发布2020-04-17 14:42:13
举报
文章被收录于专栏:twowintertwowinter

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命令枚举

代码语言:javascript
复制
/*!
 * 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中。

代码语言:javascript
复制
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.


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 前言
  • 2 梳理解析
  • 3 代码位置
    • MAC命令枚举
      • MAC命令的接收处理
        • MAC命令的发送及回复
        • End
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档