LoRa节点开发——代码详解修改LoRaWAN相关参数

2020-09-27 16:01:10 浏览数 (2)

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——————

0 人点赞