zigbee笔记、十五、组播通信原理

一、zigbee四种通讯

        1、单播(略)

        2、广播(略)

        3、组播:在zigbee网络中,模块可以用分组来标记,发送的模块如果发送的组号和网络里面标记接收模块的组号相对应,那么这些模块就可以拿到这些无线数据包(组播通信与广播通信相似,单个发送设备可以同时向多个接收设备发送数据)。

        4、绑定(略)

二、组播相关概念

        1、分组中的组编号占用2个字节。例如:0x0001。

        2、组编号是和模块里已经定义了的端点相关联,即如果一个模块被标记为组1,那么这个模块里至少有1个定义了的可用端点和组0x0001相关联。

        3、发送模块按照组的方式发送数据时,需要指定的内容包含 目标模块的组标号端点,原则上只有当接收模块的这3个参数匹配上了,才能拿到和处理这样一个无线数据包。

        例如:发送模块A发送了一个无线数据包,无线数据包中指定了接收者要满足:组号为0x0001、端点号为10、簇为0x0001,因此通过判断只有模块B的10号端点最终成功接收到了数据包。

        4、组标记中,同一个模块定义的一个组编号可以关联多个可用的端点(一个组标记可以使使用多个端点),同一个端点也可以关联多个组编号(即一个模块可以同时是组1和组2的模块,同属于2个组)。

三、组播实验

        1、发送端数据发送设置

        (1)例如发送数据:组编号号为0x0001,端点号10,簇为0x0001,内容是“Hello world”


char theMessageData[] = "Hello World";  //定义发送内容
smartHomeApp_DstAddr.addrMode = (afAddrMode_t)AddrGroup; //指定发送模式,组播模式
/*
enum
{AddrNotPresent = 0,AddrGroup = 1,Addr16Bit = 2,Addr64Bit = 3,AddrBroadcast = 15
};
*/
smartHomeApp_DstAddr.addr.shortAddr = 0x000;  //组播模式下,该参数表示为组编号
smartHomeApp_DstAddr.endPoint = 10;   //指定接收模块端点号
//smartHomeApp_DstAddr结构体无论是在单播、广播还是组播中都是用来指定描述接收模块的一些信息
AF_DataRequest( &smartHomeApp_DstAddr, &smartHomeApp_epDesc,smartHomeApp_CLUSTERID,   //指定接收模块的簇(byte)osal_strlen( theMessageData ) + 1,  //表示发送字节个数//   1, (byte *)&theMessageData,//发送的数组的首地址&smartHomeApp_TransID,AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
        2、接收模块设置

        在应用层初始化函数中默认挂钩了端点号10,同样簇的编号也被默认定义了0x0001,我们也不需要动。

       (1) 组播通信中接收模块需要关联组

        标记组的话,首先要定义一个组的结构体变量aps_Group_t smartHomeApp_Group;组的结构体和相关函数可以在aps_groups.h中找到。因此我们需要在应用处理函数所在源文件中引入aps_groups.h头文件,如下图。

        (2)关联端点与组编号

        首先定义组结构体,给组结构体的第一个成员变量ID赋值为组编号0x0001(第二个参数name可以不用,name的作用就相当于一个注释,给组起个别名,最多不能超过16个字节)。

        然后我们调用函数ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group );(也在组头文件中有声明),它的作用是将我们的端点与组关联起来。(第一个参数为关联的端点号,第二个参数是组结构体的地址)。

        在关联之前我们还需要调用函数extern uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID );,它的作用时去除当前端点所关联的组编号。来确保只有一个组与我们的10号端点关联。(第一个参数是我们要取消关联的端点,第二个参数是取消关联的组号)。

//...
aps_Group_t smartHomeApp_Group;//定义一个组相关结构体
smartHomeApp_Group.ID=0x0001;//组相关结构体的ID值赋0x0001
aps_RemoveGroup(10,0x0002);//如果10号端点关联了0x0002,那么就取消组2的关联;如果没有关联,就不做处理。
//aps_RemoveGroup(uint8 endpoint, uint16 groupID )函数用来解端点与组的关联
StarryApp_Group.ID=0x0001;
aps_AddGroup(10,&smartHomeApp_Group);//将端点与组关联起来。(第一个参数为关联的端点号,第二个参数是组结构体的地址)
//.../*
其他组相关函数// Remove all groups for endpoint
extern void aps_RemoveAllGroup( uint8 endpoint );
更多组相关函数参考头文件aps_groups.h*/
        (3)数据接收

        消息处理函数要修改成适合组播的接收处理程序,其中pkt结构体变量的groupId成员,如果为0,表示收到的数据包不是通过组播发送的,而是通过单播或者广播等。

static void smartHomeApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{if(pkt->groupId==0x0001){if(pkt->endPoint==10){switch(pkt->clusterId){case 0x0001://...  处理内容代码break;}}}if(pkt->groupId==0x0002){if(pkt->endPoint==10){switch(pkt->clusterId){case 0x0001://...  处理内容代码break;}}}
}

参考链接

        (1)lesson10组播通信原理_哔哩哔哩_bilibili

        (2)lesson10 Zigbee组播通信原理-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408653.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿,推荐…

innodb_buffer_pool_size在线缩小操作

一、背景 测试数据库内存32G,只有MySQL数据库,但是innodb_buffer_pool_size设置了24G,导致经常出现lack of memory问题、lack of swap问题。 因为使用了MySQL5.7.36版本,利用innodb_buffer_pool_size参数值可在线调整的新特性&…

C++函数调用栈从何而来

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页: rainInSunny | 个人专栏: C那些事儿、 Qt那些事儿 文章目录 写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结 写在前面 程序员对函数调用栈是再熟悉不过了,无论是使用IDE…

基于cubemx的STM32的freertos的串口通信

1、任务描述 使用freertos系统实现电脑调试助手和正点原子开发板STM32F103ZET6的串口通信。 2、cubemx设置 3、程序代码 (1)添加usart1.c #include "usart1.h"#include "usart.h"/**********重定义函数**********/struct __FILE …

阵列信号处理2_阵列信号最优处理常用准则(CSDN_20240825)

目录 最小均方误差(Minimum Square Error,MSE)准则 最大信噪比(Maximum Signal Noise Ratio,MSNR)准则 极大似然(Maximum Likehood, ML)准则 最小方差无损响应(Minim…

速通教程:如何使用Coze+剪映,捏一个爆款悟空视频

程哥最近做了一个和黑神话悟空有关的视频,没想到就火了,视频主打一个玉石风格,就是下面这个视频。 视频请移步飞书观看:黑神话悟空玉石版 制作过程不算很复杂,全程只需要用到Coze智能体和剪映这两个工具。 智能体用…

【JVM】亿级流量调优(一)

亿级流量调优 oop模型 前面的klass模型,它是Java类的元信息在JVM中的存在形式。这个oop模型是Java对象在JVM中的存在形式 内存分配策略: 1.空闲列表2.指针碰撞(jvm采用的) 2.1 top指针:执行的是可用内存的起始位置 2.2 采用CAS的方式3.TLAB 线程私有堆4.PLAB 老年…

使用DropZone+SpringBoot实现图片的上传和浏览

经常在项目中需要使用上传文件功能,找了不少前端上传组件,都不是很好用,今天尝试了一下DropZone,发现不错,顺便记录一下使用过程,方便后续查阅。在做开发的时候,经常需要调研一些技术&#xff0…

C# 运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,分为一下六类: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 C# 支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值…

安全面试常见问题任意文件下载

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 1.1 任意文件下…

旅游社交小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理,美食推荐管理,酒店推荐管理,周边推荐管理 微信端账…

《数据结构》顺序表+算法代码+动画演示-C语言版

目录 顺序表概念 顺序表初始化 顺序表销毁 顺序表尾插 顺序表尾删 顺序表头删 顺序表头插 顺序表pos位置插入 顺序表pos位置删除 顺序表全部代码如下: 顺序表概念 顺序表是用一段 物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下…

多个程序监听不同网卡的相同端口、相同网卡不同IP的相同端口

1 概述 一个主机上的多个程序监听同一个端口,是否一定存在冲突?如果是多网卡、单网卡多IP的情景下,多个程序是可以独立监听的。 2 多个程序监听不同网卡的相同端口 3 多个程序监听同一个网卡不同IP的相同端口 4 小结 多个程序监听同一个网…

【C语言】常见文件操作

文件的常见操作 #include<stdio.h>// 由于devc代码编码为ANCI&#xff0c;故读取的文件中若有中文&#xff0c;请设置文件编码为ANCI&#xff0c;否则会乱码 // 读文件 void test1() {char ch;FILE *fp; // 创建文件指针fp fopen("./file.txt", "r"…

pycharm修改文件大小限制

场景&#xff1a; 方法&#xff1a; 打开pycharm 安装目录下的idea.properties 增加配置项&#xff1a;idea.max.intellisense.filesize99999

java后端请求与响应总结

get 请求&#xff1a;将参数写在请求路径中&#xff08;请求路径跟一个&#xff1f;后面跟参数多个参数之间用&连接&#xff09; post 请求&#xff1a;将参数写在请求体中中 一、请求 1.简单参数 如 传一个或两个字符串、整数等 例如串一个用户名和密码 如果传入的数…

【自动驾驶】控制算法(四)坐标变换与横向误差微分方程

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

从法律风险的角度来看,项目经理遇到不清楚或不明确问题时的处理

大家好&#xff0c;我是不会魔法的兔子&#xff0c;在北京从事律师工作&#xff0c;日常分享项目管理风险预防方面的内容。 序言 在项目开展过程中&#xff0c;有时候会遇到一些不清楚或不明确的状况&#xff0c;但碍于项目进度的紧迫性&#xff0c;不得不硬着头皮做决策&…

Golang | Leetcode Golang题解之第368题最大整除子集

题目&#xff1a; 题解&#xff1a; func largestDivisibleSubset(nums []int) (res []int) {sort.Ints(nums)// 第 1 步&#xff1a;动态规划找出最大子集的个数、最大子集中的最大整数n : len(nums)dp : make([]int, n)for i : range dp {dp[i] 1}maxSize, maxVal : 1, 1fo…

CMake构建学习笔记4-libjpeg库的构建

libjpeg是一个广泛使用的开源库&#xff0c;用于处理JPEG&#xff08;Joint Photographic Experts Group&#xff09;图像格式的编码、解码、压缩和解压缩功能&#xff0c;是许多图像处理软件和库的基础。 libjpeg本身的构建没什么特别的&#xff0c;不过值得说道的是libjpeg存…