LoRaWAN 节点多播(广播)处理过程

2023-10-16 21:20

本文主要是介绍LoRaWAN 节点多播(广播)处理过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、实现方法

关于LoRaWAN标准的所有东西,基本在LoRaWAN规范里面都可以查到,截取关于Class C多播部分如下:

多播地址及相关网络会话密钥和应用程序会话密钥必须来自应用程序层。

上面描述的意思就是说这些参数都需要我们自己定义。 

2、限制

  • 它们不允许携带MAC命令,无论是在FOpt字段中,还是在端口0上的有效负载中都不允许,因为多播下行链路不具有与单播帧相同的身份验证健壮性。
  • ACK和ADRACKReq位必须为零。MType字段必须保留未确认数据的值。
  • FPending位表示需要发送更多的多播数据。假定C类设备在大多数时间内保持其接收器处于活动状态,那么FPending位不会触发终端设备的任何特定行为。

3、节点实现过程

节点协议栈中关于多播的处理过程截取static void OnRadioTxDone( void ) 函数中的部分代码如下:

static void OnRadioTxDone( void )
{……  //没有截取的代码部分log_info(loglevel,"\r\nRecv data:%d byte,rssi:%d,snr:%d,data[",size,rssi,snr);for(uint8_t i=0;i<size;i++){log_info(loglevel," %02x",payload[i]);}log_info(loglevel,"]\r\n");//以上代码是将射频收到的数据、rssi、snr打印出来…… //没有截取的代码部分if( address != LoRaMacDevAddr ) //多播判断{curMulticastParams = MulticastChannels;  //MulticastChannels是一个多播参数指针while( curMulticastParams != NULL ) //遍历多播参数{if( address == curMulticastParams->Address )//判断当前收到的短地址是否与多播的地址相等,若相等,则使用当前的多播参数,解密数据{log_info(loglevel,"\r\nmulticast address:0x%x\r\n",address);//添加的调试信息,打印收到的多播的短地址multicast = 1;nwkSKey = curMulticastParams->NwkSKey;appSKey = curMulticastParams->AppSKey;downLinkCounter = curMulticastParams->DownLinkCounter;break;}curMulticastParams = curMulticastParams->Next;}if( multicast == 0 ){//We are not the destination of this frame.McpsIndication.Status = LORAMAC_EVENT_INFO_STATUS_ADDRESS_FAIL;PrepareRxDoneAbort( );return;}}else{multicast = 0;nwkSKey = LoRaMacNwkSKey;appSKey = LoRaMacAppSKey;downLinkCounter = DownLinkCounter;}……  //没有截取的代码部分if( multicast == 1 ){McpsIndication.McpsIndication = MCPS_MULTICAST;//标记当前数据为多播数据if( ( curMulticastParams->DownLinkCounter == downLinkCounter ) &&( curMulticastParams->DownLinkCounter != 0 ) )//判断当前的数据帧号,接收到的数据帧号要大于记录的数据帧号,否则,抛弃当前数据{McpsIndication.Status = LORAMAC_EVENT_INFO_STATUS_DOWNLINK_REPEATED;McpsIndication.DownLinkCounter = downLinkCounter;PrepareRxDoneAbort( );return;}curMulticastParams->DownLinkCounter = downLinkCounter;}…… //没有截取的代码部分
}

以上都是协议栈中的代码,在我们需要使用多播的时候,还需要我们定义多播参数,我们使用静态创建的方法简单定义如下:

MulticastParams_t MulticastChannels1,MulticastChannels2; //定义多播参数变量MulticastChannels1和MulticastChannels2static uint8_t appskey_1[]={0x2d,0xc5,0x8c,0x7f,0xc6,0xcb,0xc3,0x4d,0x08,0x09,0xfb,0x56,0x50,0x06,0xff,0xea};
static uint8_t newskey_1[]={0x2d,0xc5,0x8c,0x7f,0xc6,0xcb,0xc3,0x4d,0x08,0x09,0xfb,0x56,0x50,0x06,0xff,0xeb};static uint8_t appskey_2[]={0x2d,0xc5,0x8c,0x7f,0xc6,0xcb,0xc3,0x4d,0x08,0x09,0xfb,0x56,0x50,0x06,0xff,0xec};
static uint8_t newskey_2[]={0x2d,0xc5,0x8c,0x7f,0xc6,0xcb,0xc3,0x4d,0x08,0x09,0xfb,0x56,0x50,0x06,0xff,0xed};  void MultcastParamInit(void)
{MulticastChannels=&MulticastChannels1;      //多播参数头指针指向多播参数1,MulticastChannels1.Next=&MulticastChannels2;//多播参数2指向MulticastChannels2.Next=NULL;MulticastChannels1.Address=0xfffffffa;     //多播参数1的短地址设置为0xfffffffamemcpy(MulticastChannels1.AppSKey, appskey_1, 16);  //多播参数1的应用会话密钥memcpy(MulticastChannels1.NwkSKey, newskey_1, 16);  //多播参数1的网络会话密钥MulticastChannels2.Address=0xfffffffb;     //多播参数1的短地址设置为0xfffffffbmemcpy(MulticastChannels2.AppSKey, appskey_2, 16);  //多播参数2的应用会话密钥memcpy(MulticastChannels2.NwkSKey, newskey_2, 16);  //多播参数2的网络会话密钥//以上几个参数和server约定好就行
}

void MultcastParamInit(void) 这个函数就是我们在初始化多播参数,这里我初始化了两个多播参数,我们在初始化协议栈函数LoRaMacStatus_t LoRaMacInitialization( LoRaMacPrimitives_t *primitives, LoRaMacCallback_t *callbacks, LoRaMacRegion_t region )里面调用一下就行。

4、下发数据

需要平台支持多播下发,测试使用的是内部开发的平台是支持的,我们这里不做过多展开。

5、节点接收数据测试

节点处理应用数据的回调函数如下:

static void McpsIndication( McpsIndication_t *mcpsIndication )
{if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK ){return;}switch( mcpsIndication->McpsIndication ){case MCPS_UNCONFIRMED:{log_info(loglevel,"unconfirmed\r\n"); // log打印break;}case MCPS_CONFIRMED:{log_info(loglevel,"confirmed\r\n");  // log打印  break;}case MCPS_PROPRIETARY:{log_info(loglevel,"proprietary\r\n");  // log打印 break;}case MCPS_MULTICAST:{log_info(loglevel,"multicast\r\n");  // log打印break;}default:break;}if(mcpsIndication->BufferSize!=0){		log_info(loglevel,"user data:");for(uint8_t i=0;i<mcpsIndication->BufferSize;i++){log_info(loglevel," %02x",mcpsIndication->Buffer[i]);}		log_info(loglevel,",port:%d\r\n",mcpsIndication->Port);}…… //没有截取的代码部分
}

可以看到,我们使用端口2,多播地址为0xfffffffb下发的数据05 04 03 02 01;
 

可以看到,我们使用端口20,多播地址为0xfffffffa下发的数据 01 02 03 04 05 。

这篇关于LoRaWAN 节点多播(广播)处理过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/220858

相关文章

chart 完成拓扑图单节点拖拽不影响其他节点位置

就是做这种的功能,箭头原本是可以动态重复移动的,但不知道哪里问题导致没箭头了,然后补了个edgeSymbol: ['','arrow'], 字段,才增加了箭头。 拖拽某个节点,只有关联到的线条会跟着变动其他的节点位置不变。 参考 https://gallery.echartsjs.com/editor.html?c=x8Fgri22P9 https://echarts.baidu.com/exa

XMG 触摸事件的处理过程

1.自己本身并不处理,顺着响应者链条向上传递,将事件交给响应者进行处理 2.touches默认做法:把事件传递到上一个响应者 3. super是父类不是父控件

(13)DroneCAN 适配器节点(一)

文章目录 前言 1 特点 2 固件  3 ArduPilot固件DroneCAN设置 4 DroneCAN适配器节点 前言 这些节点允许现有的 ArduPilot 支持的外围设备作为 DroneCAN 或 MSP 设备适应 CAN 总线。这也允许扩展自动驾驶仪硬件的功能。如允许 I2C 设备(如罗盘或空速)距离自动驾驶仪 1m 以上,并实现多达 32 个伺服输出通道。

LoRaWAN在嵌入式网络通信中的应用:打造高效远程监控系统(附代码示例)

引言 随着物联网(IoT)技术的发展,远程监控系统在各个领域的应用越来越广泛。LoRaWAN(Long Range Wide Area Network)作为一种低功耗广域网通信协议,因其长距离传输、低功耗和高可靠性等特点,成为实现远程监控的理想选择。本文将详细介绍LoRaWAN的基本原理、应用场景,并通过一个具体的项目展示如何使用LoRaWAN实现远程监控系统。希望通过图文并茂的讲解,帮助读

leetcode刷题(36)——24.两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3 题解: 这个题目有2种解法,一个是比较容易想到的循环求解,另外一个是比较难想到的递归求解 解法1:循环求解 关键点在于设置一个pre节点指向链表的头节点,很多链表题目的技巧都是这样设置一个pre

玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)

关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?id=-1', //向后台传送id,获取根节点lines:true,onBeforeExpand:function(node,param){ $('#tree').tree('options'

带你学习Mybatis之mybatis的sql节点

mybatis的sql节点 mybatis的mapper映射文件中的sql节点在初始化时会被解析成MappedStatement对象,其中sql语句会被解析为SqlSource对象,sql语句中定义的动态sql节点、文本节点等则由SqlNode接口的相应实现类表示 SqlSource public interface SqlSource {  BoundSql getBoundSql(Objec

kafka 集群 Controller 节点和 zookeeper 集群 leader 节点有何区别联系?

kafka 集群 Controller 节点和 zookeeper 集群 leader 节点有何区别联系? Kafka 集群中的 Controller 节点和 ZooKeeper 集群中的 Leader 节点在角色和功能上有明显的区 别,但它们之间也有一定的联系。以下是它们的详细区别和联系: Kafka 集群中的 Controller 节点 角色和功能: 管理任务: Kafka Con

kafka 管理节点 Controller 角色分析

kafka 管理节点 Controller 角色分析 kafka controller 如何管理分区的创建、状态监测、故障切换、内容复制、如何管控分区副本的状态检测故障切换、数据同步、learder 选举? Kafka Controller 是 Kafka 集群中的一个关键组件,负责管理分区的创建、状态监测、故障切换、内容 复制等任务。它通过 ZooKeeper 协调和管理这些任务,确保 K

数据链路层的广播信道

广播信道可以进行一对多的通信。局域网使用的就是广播信道。 计算机与外界局域网的连接是通过通信适配器进行的。适配器本来是在主机箱内插入的一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡(个人计算机存储器卡口适配器))。这种接口板又称为网络接口卡NIC,或简称为“网卡”。在这种通信适配器上面装有处理器和存储器(包括RAM和ROM)。适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行