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

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

OpenStack离线Train版安装系列—3控制节点-Keystone认证服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—1控制节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—10.控制节点-Heat服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack Victoria版——7.2计算节点-Neutron网络服务组件

7.2计算节点-Neutron网络服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 文章目录 一、安装相关软件二、配置公共组件三、配置网络