LoRa节点开发——代码详解修改LoRaWAN相关参数
LoRaWAN网络中有许多参数,诸如节点类型,发射率、ADR、信道掩码等,今天聊聊如何修改成自己想要的参数。
1、参数定义
LoRaWAN相关的参数,SDK中定义了一个结构体,通过这个结构体就可以了解到有哪些参数可以设置,以及对应的取值范围。
/*!
* LoRaMAC MIB-RequestConfirm structure
*/
typedef struct eMibRequestConfirm
{
/*!
* MIB-Request type
*/
Mib_t Type;
/*!
* MLME-RequestConfirm parameters
*/
MibParam_t Param;
}MibRequestConfirm_t;
这个结构体成员本身又是枚举体和联合体,Mib_t这个枚举体描述了有哪些参数可以设置,如下:
typedef enum eMib
{
MIB_DEVICE_CLASS, //节点的Class类型,有Class A 、Class B、Class C三种类型
MIB_NETWORK_ACTIVATION, //激活方式,OTAA和ABP两种
MIB_DEV_EUI,//DEVEUI,8字节,与OTAA入网有关,也常用来标识设备
MIB_JOIN_EUI, //JOINEUI也叫APPEUI,8字节,与OTAA入网有关
MIB_ADR, //是否开启ADR,用于平台调整速率和发射功率,以节省功耗
MIB_NET_ID, //节点的网络ID
MIB_DEV_ADDR, //节点的短地址
MIB_GEN_APP_KEY,//加密密钥,16字节,与OTAA入网有关
MIB_PUBLIC_NETWORK, //是否公有网络
MIB_REPEATER_SUPPORT,//是否支持中继
MIB_CHANNELS,
MIB_RX2_CHANNEL,//接收窗口2
MIB_RX2_DEFAULT_CHANNEL,//接收窗口2的速率
MIB_RXC_CHANNEL,//Class C模式下的接收窗口
MIB_RXC_DEFAULT_CHANNEL,
MIB_CHANNELS_MASK, //信道掩码
MIB_CHANNELS_DEFAULT_MASK,//默认信道掩码
MIB_CHANNELS_NB_TRANS,//重发次数
MIB_MAX_RX_WINDOW_DURATION,
MIB_RECEIVE_DELAY_1, //接收窗口1打开的时间
MIB_RECEIVE_DELAY_2, //接收窗口2打开的时间
MIB_JOIN_ACCEPT_DELAY_1, //入网回复接收窗口1打开的时间
MIB_JOIN_ACCEPT_DELAY_2, //入网回复接收窗口2打开的时间
MIB_CHANNELS_DEFAULT_DATARATE,//默认的速率
MIB_CHANNELS_DATARATE,//速率
MIB_CHANNELS_TX_POWER,//发射功率
MIB_CHANNELS_DEFAULT_TX_POWER,//默认的发射功率
MIB_SYSTEM_MAX_RX_ERROR,//
MIB_MIN_RX_SYMBOLS,
MIB_ANTENNA_GAIN,//天线增益
MIB_DEFAULT_ANTENNA_GAIN,//默认的天线增益
//参数较多,只截取了一部分
}Mib_t;
MibParam_t是个联合体,对应于上面的各个参数对应的取值,如下:
typedef union uMibParam
{
DeviceClass_t Class;
ActivationType_t NetworkActivation;
uint8_t* DevEui;
uint8_t* JoinEui;
bool AdrEnable;
uint32_t NetID;
uint32_t DevAddr;
uint8_t* GenAppKey;
bool EnablePublicNetwork;
bool EnableRepeaterSupport;
uint16_t* ChannelsMask;
uint16_t* ChannelsDefaultMask;
uint8_t ChannelsNbTrans;
uint32_t MaxRxWindow;
uint32_t ReceiveDelay1;
uint32_t ReceiveDelay2;
uint32_t JoinAcceptDelay1;
uint32_t JoinAcceptDelay2;
int8_t ChannelsDefaultDatarate;
int8_t ChannelsDatarate;
int8_t ChannelsDefaultTxPower;
int8_t ChannelsTxPower;
McChannelParams_t MulticastChannel;
uint32_t SystemMaxRxError;
uint8_t MinRxSymbols;
float AntennaGain;
float DefaultAntennaGain;
//参数较多,只截取了一部分
}MibParam_t;
2、设置参数
以下面的几个参数为例说明:
uint8_t JoinEui[]={0x3C,0x9B,0x5F,0x76,0xE3,0x81,0x47,0xB1 };
uint8_t DevEui[]={0x00,0x01,0x01,0x0C,0xFF,0x00,0x00,0xE5};
uint8_t AppKey[]={0xc4,0x66,0x6e,0x42,0x54,0xc0,0x58,0x73,0x2c,0xf7,0xbc,0xe6,0x36,0x0d,0x07,0x27};
void UserConfig(void)
{
MibRequestConfirm_t mibReq;
mibReq.Type = MIB_JOIN_EUI;
mibReq.Param.JoinEui = JoinEui;
LoRaMacMibSetRequestConfirm( &mibReq );
mibReq.Type = MIB_DEV_EUI;
mibReq.Param.DevEui = DevEui;
LoRaMacMibSetRequestConfirm( &mibReq );
mibReq.Type = MIB_GEN_APP_KEY;
mibReq.Param.GenAppKey = AppKey;
LoRaMacMibSetRequestConfirm( &mibReq );
mibReq.Type = MIB_DEVICE_CLASS;
mibReq.Param.GenAppKey = CLASS_A;
LoRaMacMibSetRequestConfirm( &mibReq );
mibReq.Type = MIB_ADR;
mibReq.Param.GenAppKey = false;
LoRaMacMibSetRequestConfirm( &mibReq );
mibReq.Type = MIB_CHANNELS_DATARATE;
mibReq.Param.GenAppKey = DR_0;
//DR_0在Region.h里面定义了,这里DR_0对应的是SF12,DR_1对应的是SF11,依次类推
LoRaMacMibSetRequestConfirm( &mibReq );
// …………
//其他参数可参考上面的设置方法
}
在上面函数中,自定义函数void UserConfig(void)中,进行了参数的设置,方法很简单,先是表明设定的参数,再给对应的变量赋值。
再来看, LoRaMacMibSetRequestConfirm( MibRequestConfirm_t* mibSet )这个函数,如下:
LoRaMacStatus_t LoRaMacMibSetRequestConfirm( MibRequestConfirm_t* mibSet )
{
LoRaMacStatus_t status = LORAMAC_STATUS_OK;
ChanMaskSetParams_t chanMaskSet;
VerifyParams_t verify;
if( mibSet == NULL )
{
return LORAMAC_STATUS_PARAMETER_INVALID;
}
if( ( MacCtx.MacState & LORAMAC_TX_RUNNING ) == LORAMAC_TX_RUNNING )
{
return LORAMAC_STATUS_BUSY;
}
switch( mibSet->Type )
{
case MIB_DEVICE_CLASS:
{
status = SwitchClass( mibSet->Param.Class );
break;
}
case MIB_NETWORK_ACTIVATION:
{
if( mibSet->Param.NetworkActivation != ACTIVATION_TYPE_OTAA )
{
MacCtx.NvmCtx->NetworkActivation = mibSet->Param.NetworkActivation;
}
else
{ // Do not allow to set ACTIVATION_TYPE_OTAA since the MAC will set it automatically after a successful join process.
status = LORAMAC_STATUS_PARAMETER_INVALID;
}
break;
}
case MIB_DEV_EUI:
{
if( SecureElementSetDevEui( mibSet->Param.DevEui ) != SECURE_ELEMENT_SUCCESS )
{
status = LORAMAC_STATUS_PARAMETER_INVALID;
}
break;
}
case MIB_JOIN_EUI:
{
if( SecureElementSetJoinEui( mibSet->Param.JoinEui ) != SECURE_ELEMENT_SUCCESS )
{
status = LORAMAC_STATUS_PARAMETER_INVALID;
}
break;
}
case MIB_ADR:
{
MacCtx.NvmCtx->AdrCtrlOn = mibSet->Param.AdrEnable;
break;
}
…………
}
可以看到,参数传到这个函数之后,通过swicth语句来判断是什么参数,有的参数还进行了有效性判断,例如MIB_JOIN_EUI这个参数,如果返回值非LORAMAC_STATUS_OK的,那就需要检查参数的有效性了,再看MIB_NETWORK_ACTIVATION这个参数,直接赋值给了MacCtx.NvmCtx->NetworkActivation,这个值最终传到了sx127x的寄存器。Joineui、deveui、appkey这些就是纯协议栈的东西,就与sx127x没什么关系了。
3、参数有效性
关于参数的取值范围,各个频段的参数各不相同,参考《lorawan_regional_parameters_v1.0.3reva_0.pdf》文档,以CN470为例:
可以看到CN470,支持DR_0到DR_5;最大发射功率17dBm,文档中的是19.15dBm,默认的天线的增益是-2.15dBm。
其他参数的范围查看文档即可设置,其他频段蚕食设置也是相似的方法。
——————END——————
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试
- .Net 转战 Android 4.4 日常笔记(10)--PullToRefresh下拉刷新使用
- .Net 转战 Android 4.4 日常笔记(10)--ADT集成环境更新SDK
- Windows Server 2008R2 配置网络负载平衡(NLB)
- .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(38)-Easyui-accordion+tree漂亮的菜单导航
- .Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
- silverlight于javascript通信
- 微信上线小游戏:对流量基础入口应用商店革命
- Appium Desktop 使用
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(36)-文章发布系统③-kindeditor使用
- Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
- .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
- 丰富的silverlight控件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode119|转换小写字母
- LeetCode118|前K个高频单词
- LeetCode117|最小的k个数
- LeetCode116|移除元素
- LeetCode126|二叉树的后续遍历
- LeetCode125|二叉树的前序遍历
- LeetCode124|二叉树的中序遍历
- LeetCode123|二叉搜索树中第K小的元素
- LeetCode122|删除排序链表中的重复元素II
- LeetCode121|单值二叉树
- LeetCode120|二维数组中的查找
- LeetCode129|不用加减乘除做加法
- LeetCode128|二叉树的最大深度
- LeetCode127|检查平衡性
- 详解Android端与JavaWeb传输加密(DES+RSA)