LoRaWAN实战 LinkADR命令的源码分析

本文详细解析了LoRaWAN网络管理中的LinkADRReq命令,包括DataRate_TXPower、ChMask、Redundancy等字段的解析流程,并介绍了如何根据地区规定处理这些字段,最后更新参数并回复MAC命令。

前言

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  = 0
	AddMacCommand( MOTE_MAC_LINK_ADR_ANS, 0, 0 );
	macIndex += 3;  // Skip over the remaining bytes of the request
	break;
}

如果终端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 channels
		for( 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 channel
				status &= 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命令 LinkADRAns

AddMacCommand( MOTE_MAC_LINK_ADR_ANS, status, 0 );

突然发现 AddMacCommand 的形参只有CID加2字节的回复,我是太无聊,把终端所有MAC命令都翻了一遍,确认所有payload确实是小于2字节。再次赞扬LoRaWAN协议的精简作风。

End


标题 "lora-mesh-master" 暗示我们正在探讨LoRa Mesh网络的源代码库。LoRa(Long Range)是一种远距离、低功耗的无线通信技术,常用于物联网(IoT)应用。"Mesh"指的是网络拓扑结构,其中每个设备不仅与中央网关通信,还能够与其他设备通信,形成自组织网络,增强了网络的可靠性和覆盖范围。描述 "LORA MESH开发" 涉及如何开发基于LoRa的Mesh网络,开发者需要了解LoRa的基本原理,包括调制方式、频率计划以及数据速率选择,这些都是确保LoRa设备之间有效通信的关键因素。标签 "Mesh lora-mesh meshlora LORA节点源码 lora" 进一步细化了主题。"lora-mesh" 和 "meshlora" 可能是特定的LoRa Mesh实现或库,"LORA节点源码" 提示有实际的代码可以研究,这将帮助理解如何在硬件上构建LoRa节点并实现Mesh网络功能。"lora" 是对整个技术的提及,确保讨论的核心是LoRa通信。压缩包中的 "lora-mesh-master" 文件很可能是项目的主要源代码仓库,包含了构建和运行LoRa Mesh网络所需的全部代码。通常,这样的代码库会包含以下部分:README文件、源代码文件、配置文件、示例脚本、库依赖、编译和构建工具、测试用例。在深入研究LoRa Mesh开发时,需要理解以下关键概念:LoRa扩频技术、LoRaWAN、Ad-hoc网络、路由算法、功耗管理。通过研究这个项目,可以学习如何创建一个自组网、自修复的LoRa网络,以及如何在不同节点之间有效地传输数据,包括设置网络拓扑、处理冲突、优化传输效率。需要确保有适当的硬件环境,如LoRa模块、微控制器以及必要的开发工具。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值