专栏首页物联网思考LoRa节点开发——代码详解修改LoRaWAN相关参数

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

本文分享自微信公众号 - 物联网思考(everythinglink),作者:everythinglink

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LoRa节点开发——LoRaWAN节点入网代码详解

    本文主要结合LoRaNode SDK v4.4.2和LoRaWAN规范1.0.3来展开。

    ManInRoad
  • LoRa终端设备ASR6505驱动DHT11

    DHT11是一款比较典型的温湿度传感器,温度0-50°±2°,湿度:20-90%RH。几乎是开发板绕不开的东西,读写时序也是比较经典的。

    ManInRoad
  • 5块钱的PCB真香

    前言:最近在浏览github发现了一些非常不错的项目,刚好身边也有相应的模块,索性画板,打几块PCB玩玩。

    ManInRoad
  • Android访问网络,使用HttpURLConnection还是HttpClient?

    最近在研究Volley框架的源码,发现它在HTTP请求的使用上比较有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在A...

    用户1158055
  • Magicodes.IE编写多框架版本支持和执行单元测试

    很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE就出现了以下问题:

    心莱科技雪雁
  • 构建高可用VMware vSphere 5.X虚拟化架构

    《构建高可用VMware vSphere 5.X虚拟化架构》以VMware vSphere 5.1版本为例,介绍在企业应用平台上,如何构建高可用ESXi主机、高...

    用户3157710
  • 深度学习三人行(第12期)----CNN经典网络之ResNet

    接下来我们一起学习下关于CNN中的另一个比较经典的网络ResNet的相关知识,学习的路上我们多多交流,共同进步。本期主要内容如下:

    智能算法
  • 详解如何使用Spark和Scala分析Apache访问日志

    首先需要安装好Java和Scala,然后下载Spark安装,确保PATH 和JAVA_HOME 已经设置,然后需要使用Scala的SBT 构建Spark如下:

    砸漏
  • 3小时搞定一个简单的MIS系统案例Northwind,有视频、有源代码下载、有真相

    一、瞎扯框架、架构      楼主自从1998年从C语言、MASM、Foxbase开始学计算机开始接触这个行当16年以来,2001年干第一份与程序、软件、然后是...

    魏琼东
  • Leetcode 42题 接雨水(Trapping Rain Water)

    https://leetcode-cn.com/problems/trapping-rain-water/

    code随笔

扫码关注云+社区

领取腾讯云代金券