本文来源公众号【物联网思考】

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

查看《lorawan_regional_parameters_v1.0.3reva_0.pdf》文档,每个地区对应的信道都不一样,在SDK中,不同的地区以不同的文件实现:

查看文档,CN470频段,支持96个上行通道,48个下行通道。

国内主要是CN470,因此主要看RegionCN470这个文件。

发送频率设置

SDK在函数void RegionCN470InitDefaults( InitDefaultsParams_t* params )中初始化信道参数:

void RegionCN470InitDefaults( InitDefaultsParams_t* params )
{Band_t bands[CN470_MAX_NB_BANDS] ={CN470_BAND0};switch( params->Type ){case INIT_TYPE_INIT:{// Initialize bandsmemcpy1( ( uint8_t* )NvmCtx.Bands, ( uint8_t* )bands, sizeof( Band_t ) * CN470_MAX_NB_BANDS );// Channels// 125 kHz channelsfor( uint8_t i = 0; i < CN470_MAX_NB_CHANNELS; i++ )//CN470_MAX_NB_CHANNELS是一个宏定义,取值是96{NvmCtx.Channels[i].Frequency = 470300000 + i * 200000;NvmCtx.Channels[i].DrRange.Value = ( DR_5 << 4 ) | DR_0;NvmCtx.Channels[i].Band = 0;}// Initialize the channels default maskNvmCtx.ChannelsDefaultMask[0] = 0xFFFF;NvmCtx.ChannelsDefaultMask[1] = 0xFFFF;NvmCtx.ChannelsDefaultMask[2] = 0xFFFF;NvmCtx.ChannelsDefaultMask[3] = 0xFFFF;NvmCtx.ChannelsDefaultMask[4] = 0xFFFF;NvmCtx.ChannelsDefaultMask[5] = 0xFFFF;// Update the channels maskRegionCommonChanMaskCopy( NvmCtx.ChannelsMask, NvmCtx.ChannelsDefaultMask, 6 );break;}case INIT_TYPE_RESTORE_CTX:{if( params->NvmCtx != 0 ){memcpy1( (uint8_t*) &NvmCtx, (uint8_t*) params->NvmCtx, sizeof( NvmCtx ) );}break;}case INIT_TYPE_RESTORE_DEFAULT_CHANNELS:{// Restore channels default maskRegionCommonChanMaskCopy( NvmCtx.ChannelsMask, NvmCtx.ChannelsDefaultMask, 6 );break;}default:{break;}}
}

可以看到,通过for循环给96个信道赋值,从470.3M开始,以200K的步长增加,并且把信道掩码全部赋值为0xffff。

其中NvmCtx是一个结构体变量,查看其定义如下:

// Definitions
#define CHANNELS_MASK_SIZE              6/*!* Region specific context*/
typedef struct sRegionCN470NvmCtx
{/*!* LoRaMAC channels*/ChannelParams_t Channels[ CN470_MAX_NB_CHANNELS ];/*!* LoRaMac bands*/Band_t Bands[ CN470_MAX_NB_BANDS ];/*!* LoRaMac channels mask*/uint16_t ChannelsMask[ CHANNELS_MASK_SIZE ];/*!* LoRaMac channels default mask*/uint16_t ChannelsDefaultMask[ CHANNELS_MASK_SIZE ];
}RegionCN470NvmCtx_t;

可以看到,CN470信道掩码是一个uint16_t的数组,数组有6个元素,16*6=96bit刚好对应96个上行信道,既就是每个信道对应一个bit。在上面初始化的时候,信道通过for循环遍历,信道掩码全部设置为了0xffff,既SDK中默认开启了所有的信道。

通常情况下LoRaWAN网关(sx1301/2/8)只支持8个上行通道1个下行通道,既只可以同时接收8路数据。因此我们需要修改让节点只用8个信道上报数据,这8个信道与网关保持一致。

我们参考上面的把不需要的信道频率设置为0,或对应的掩码位置设为0,剩下的就是我们需要的信道。

假设,我们要设置的8个频点为:


uint32_t UserFreq[8]={471900000,472100000,472300000,472500000,472700000,472900000,473100000,473300000};

那么只需在void RegionCN470InitDefaults( InitDefaultsParams_t* params )函数默认的信道初始化后加入如下代码:

    NvmCtx.ChannelsDefaultMask[0] = 0x0000;NvmCtx.ChannelsDefaultMask[1] = 0x0000;NvmCtx.ChannelsDefaultMask[2] = 0x0000;NvmCtx.ChannelsDefaultMask[3] = 0x0000;NvmCtx.ChannelsDefaultMask[4] = 0x0000;NvmCtx.ChannelsDefaultMask[5] = 0x0000;for( uint8_t i = 0,j=0; i < 8; i++ ){j=(UserFreq[i].Frequency-470300000 )/200000;//计算信道号NvmCtx.Channels[j].Frequency = UserFreq[i].Frequency ;NvmCtx.Channels[j].DrRange.Value=( DR_5 << 4 ) | DR_0; NvmCtx.Channels[j].Band = 0;NvmCtx.ChannelsDefaultMask[j/16]|=1<<(j%16);//相应的信道掩码位设置为1}// Update the channels maskRegionCommonChanMaskCopy( NvmCtx.ChannelsMask, NvmCtx.ChannelsDefaultMask, 6 );

上面代码中,最关键的两句话,计算信道号相应的信道掩码位设置为1

接收频率设置

还是查看《lorawan_regional_parameters_v1.0.3reva_0.pdf》文档

可以看出,下行通道rx1等于上行通道号与48取余,rx2是固定的,默认为505.3MHZ。

SDK中在函数bool RegionCN470RxConfig( RxConfigParams_t* rxConfig, int8_t* datarate )实现了接收频率的设置:

bool RegionCN470RxConfig( RxConfigParams_t* rxConfig, int8_t* datarate )
{int8_t dr = rxConfig->Datarate;uint8_t maxPayload = 0;int8_t phyDr = 0;uint32_t frequency = rxConfig->Frequency;if( Radio.GetStatus( ) != RF_IDLE ){return false;}if( rxConfig->RxSlot == RX_SLOT_WIN_1 ){// Apply window 1 frequencyfrequency = CN470_FIRST_RX1_CHANNEL + ( rxConfig->Channel % 48 ) * CN470_STEPWIDTH_RX1_CHANNEL;//计算rx1的频率}// Read the physical datarate from the datarates tablephyDr = DataratesCN470[dr];Radio.SetChannel( frequency );// Radio configurationRadio.SetRxConfig( MODEM_LORA, rxConfig->Bandwidth, phyDr, 1, 0, 8, rxConfig->WindowTimeout, false, 0, false, 0, 0, true, rxConfig->RxContinuous );if( rxConfig->RepeaterSupport == true ){maxPayload = MaxPayloadOfDatarateRepeaterCN470[dr];}else{maxPayload = MaxPayloadOfDatarateCN470[dr];}Radio.SetMaxPayloadLength( MODEM_LORA, maxPayload + LORA_MAC_FRMPAYLOAD_OVERHEAD );*datarate = (uint8_t) dr;return true;
}

其中,最重要的一句代码:

// Apply window 1 frequencyfrequency = CN470_FIRST_RX1_CHANNEL + ( rxConfig->Channel % 48 ) * CN470_STEPWIDTH_RX1_CHANNEL;
//计算rx1的频率

通过发射信道号,计算rx1的接收信道。可见,如果发射信道固定了,那么rx1(接收1)的信道也就固定了。

因此,我们在CN470频段,只需要修改发射信道即可完成发射和接收的设置。

                                                                          ——————END——————

关注公众号:“物联网思考”,获取更多开发资料、经验。

LoRa节点开发:6、代码详解修改发射和接收信道(频率)相关推荐

  1. 家用电器用户行为分析与事件识别代码详解+修改后运行无误的代码

    运行环境: ubuntu16.04 64位 pycharm python3.5.2 相关软件列表: cycler (0.10.0) graphviz (0.7.1) h5py (2.7.0) Kera ...

  2. 《STM32从零开始学习历程》——CAN通讯代码详解

    <STM32从零开始学习历程>@EnzoReventon CAN通讯代码详解 相关链接: <STM32从零开始学习历程>--CAN通讯协议物理层 CAN-bus规范 V2.0版 ...

  3. LoRa节点开发:5、代码详解LoRaWAN中的几种数据包(发送与接收数据)

    本文来源微信公众号[物联网思考] 本文主要结合LoRaNode SDK v4.4.2和LoRaWAN规范1.0.3来展开. 1.数据包类型 LoRaWAN规范中有不同的数据包,通过MType字段区分, ...

  4. LoRa节点开发:4、代码详解 LoRaWAN节点入网

    本文主要结合LoRaNode SDK v4.4.2和LoRaWAN规范1.0.3来展开. 1.入网(激活)方式 可以看出,两种入网(激活)方式: OTAA(Over-The-Air Activatio ...

  5. Qt开发技术:Q3D图表开发笔记(二):Q3DBar三维柱状图介绍、Demo以及代码详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130150728 各位读者,知识无穷而人力有穷,要么改需 ...

  6. Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130264470 各位读者,知识无穷而人力有穷,要么改需 ...

  7. android生命周期_Android开发 View的生命周期结合代码详解

    咱们以TextView控件为例: /** * Created by SunshineBoy on 2020/9/23. */ public class TestTextView extends and ...

  8. Qt开发技术:QCharts(三)QCharts样条曲线图介绍、Demo以及代码详解

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/108022984 各位读者,知识无穷而人力有穷 ...

  9. FPGA项目开发:204B实战应用-LMK04821代码详解(二)

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

最新文章

  1. 实现数据集多( 高 )维可视化(附代码)
  2. 欺诈网站都注重用户体验!你,还在等什么?!
  3. Windows下使用Visual Studio Code搭建Go语言环境
  4. NHibernate Inheritance Mapping 继承映射
  5. ZOJ 3985 2017CCPC秦皇岛 E:String of CCPC
  6. HDU 6134 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)
  7. bzoj1295 最长距离
  8. pdf2htmlex 中的字体嵌入
  9. uni-app 官网教程
  10. plecs使用C-Script模块建立PI传递函数模型
  11. java web 登陆验证 弹窗_带你玩转JavaWeb开发之四 -如何用JS做登录注册页面校验
  12. 【高数】极限运算法则+两个重要极限
  13. 公司企业邮箱怎么开通注册?仅需2步,教大家公司企业邮箱怎么弄
  14. 大数据计算的四支精干队伍,你造吗
  15. 取消双Shift全局搜索
  16. [NCTF 2018]签到题
  17. python之解释性语言
  18. 嵌入式STM32深入之RTOS编程
  19. QT命令行编译时出现'mingw32-make'不是内部或外部命令,也不是可运行的程序或批处理文件
  20. 香港主机托管:什么是主机服务器托管?

热门文章

  1. 10个SEO 写作的必读小技巧!包你读完写更好创作
  2. 学霸都在用的学习神器,绝对能让你提升学习效率
  3. linux platform 设备驱动
  4. 简单vsftpd安装配置和 ftp客户端操作笔记
  5. android 动画 图片从指定位置飞到指定位置
  6. 记录云打印小程序搭建及运营心得。
  7. 金鸽智慧农业解决方案
  8. 浪潮服务器性能测试,内存、IO子系统性能测试_浪潮服务器_服务器评测与技术-中关村在线...
  9. Linux 下文件的查询与搜索
  10. [译]什么是FTP MLSD命令