LoRaWAN网络中有许多参数,诸如节点类型,发射率、ADR、信道掩码等,今天聊聊如何修改成自己想要的参数。
1、参数定义
LoRaWAN相关的参数,SDK中定义了一个结构体,通过这个结构体就可以了解到有哪些参数可以设置,以及对应的取值范围。
代码语言:javascript复制/*!
* LoRaMAC MIB-RequestConfirm structure
*/
typedef struct eMibRequestConfirm
{
/*!
* MIB-Request type
*/
Mib_t Type;
/*!
* MLME-RequestConfirm parameters
*/
MibParam_t Param;
}MibRequestConfirm_t;
这个结构体成员本身又是枚举体和联合体,Mib_t这个枚举体描述了有哪些参数可以设置,如下:
代码语言:javascript复制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是个联合体,对应于上面的各个参数对应的取值,如下:
代码语言:javascript复制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、设置参数
以下面的几个参数为例说明:
代码语言:javascript复制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 )这个函数,如下:
代码语言:javascript复制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——————