LoRaWAN协议解析 第5章 MAC命令

2020-04-17 14:42:13 浏览数 (1)

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.


0 人点赞