13.端点、簇、属性

源码地址:13.端点、簇、属性

端点(endPoint)

一个端点就是一个应用

  1. 一个字节编号,数据收和发送的基本单元,在模块通信的时候,发送模块必须指定收发双方模块的网络地址和端点。
  2. 端点要使用必须要和模块里的某个任务挂钩定义;

首先每一个端点可以看成是一个1个字节数字编号的开有一扇门的房间,数据最终的目标是进入到无线数据包指定的目标端点房间,而取无线数据这个相关的代码在任务事件处理函数里,TI协议栈有那么多的任务事件处理函数,所以必须要指定在哪个任务事件处理函数 来取这个无线数据包里面的有用数据。

3、一个端点只能挂钩在一个任务上,而一个任务可以挂钩多个端点,且端点对所有的任务是公用的,定义一个少一个。

一个端点加入可以挂钩在多个任务上,那么接收模块接到无线数据时候,这个时候同一个端点有多个任务事件处理函数去处理,不合理;一个任务上挂多个端点(6 7 挂应用层任务),发送给协调器模块的6 7端点的数据都会进入到应用层任务事件处理函数里来,仅仅做个判断到底是投递到6房间还是7号房间就可以了。

簇(ClusterID)

  1. 一类应用会包含多个应用,每个应用都有独特的属性和命令,通常按照应用把最相关的一些属性和命令归到一起,称为簇(Cluster)

  2. 簇就是相当于端点房间里面的人,是接收最终的目标。这东西是2个字节编号,在射频发送的时候,必须要指定接收模块的簇,发送模块不需要指定。

属性

属性就是在应用层有用的数据载荷,做专门规定最小单元

结合发送代码分析

端点定义

image-20231127225321299

  SDApp_epDesc.endPoint = SDApp_ENDPOINT;//端点编号SDApp_epDesc.task_id = &SDApp_TaskID; // 和应用层任务挂钩SDApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&SDApp_SimpleDesc;//更加详细的描述这个端点一些情况就像我们定义一个编号房间,描述房间里大概有多少人之类的信息。SDApp_epDesc.latencyReq = noLatencyReqs;//同上,也是描述信息afRegister( &SDApp_epDesc );//这个函数必须要调用才能完成整个挂钩操作

发送

 if(0==P1_1){/*按钮3按下*/char theMessageData[] = {3};TestAPP_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //设置为16位地址模式  TestAPP_DstAddr.addr.shortAddr = 0x0000; // 目标网络地址TestAPP_DstAddr.endPoint = 7; //目标端点 AF_DataRequest(&TestAPP_DstAddr, //目标地址&TestAPP_epDesc, // 端点描述0x0001, // 簇ID1,// 消息数据的长度(byte *)&theMessageData, // 字符串内容数组首地址&TestAPP_TransID,// 发送次数计数AF_DISCV_ROUTE, AF_DEFAULT_RADIUS);  }

抓包分析

image-20231127225506265

  • APS Dest. Endpoint : 0x07 【目标地址7号端点】
  • APS Cluster Id:0x0001 【7号端点的0001簇】
  • APS Src. Endpoint : 0x0C 【源地址11号端点】

单播发送案例

案例描述

  • 终端模块:应用层绑定端点11,有三个按键
    • 按键1:按下后向协调器、端点7、簇1,发送字符3
    • 按键2:按下后向协调器、端点7、簇2,发送字符4
    • 按键3:按下后向协调器、端点8、簇1,发送字符5
  • 协调器模块:在无线数据接收时间处理函数中,处理终端发送的数据包,判断端点、簇,然后做出响应
    • 端点7,簇1:LED1亮灭
    • 端点7,簇2:LED2亮灭
    • 端点8,簇1:LED3亮灭

image-20231127230753825

实现代码

在之前【Z-stack协议栈使用】的代码基础上,完成本次案例

发送模块

将之前在UINT16 TestAPP_ProcessEvent( byte task_id, UINT16 events )函数中,自己新添加的TestAPP_EVT事件响应的内容替换为下面的内容

image-20231127232124339

if ( events & TestAPP_EVT ){if(0==P1_1){/*按钮3按下*/char theMessageData[] = {3};TestAPP_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //设置为16位地址模式  TestAPP_DstAddr.addr.shortAddr = 0x0000; // 目标网络地址TestAPP_DstAddr.endPoint = 7; //目标端点 AF_DataRequest(&TestAPP_DstAddr, //目标地址&TestAPP_epDesc, // 端点描述0x0001, // 簇ID1,// 消息数据的长度(byte *)&theMessageData, // 字符串内容数组首地址&TestAPP_TransID,// 发送次数计数AF_DISCV_ROUTE, AF_DEFAULT_RADIUS);  }if(0==P2_0){/*按钮4按下*/char theMessageData[] = {4};TestAPP_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //设置为16位地址模式  TestAPP_DstAddr.addr.shortAddr = 0x0000; // 目标网络地址TestAPP_DstAddr.endPoint = 7; //目标端点 AF_DataRequest(&TestAPP_DstAddr, //目标地址&TestAPP_epDesc, // 端点描述0x0002, // 簇ID1,// 消息数据的长度(byte *)&theMessageData, // 字符串内容数组首地址&TestAPP_TransID,// 发送次数计数AF_DISCV_ROUTE, AF_DEFAULT_RADIUS); }if(0==P0_5){/*按钮5按下*/char theMessageData[] = {5};TestAPP_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //设置为16位地址模式  TestAPP_DstAddr.addr.shortAddr = 0x0000; // 目标网络地址TestAPP_DstAddr.endPoint = 8; //目标端点 AF_DataRequest(&TestAPP_DstAddr, //目标地址&TestAPP_epDesc, // 端点描述0x0001, // 簇ID1,// 消息数据的长度(byte *)&theMessageData, // 字符串内容数组首地址&TestAPP_TransID,// 发送次数计数AF_DISCV_ROUTE, AF_DEFAULT_RADIUS); }return (events ^ TestAPP_EVT);}

接收模块

  1. 定义一个变量

image-20231127231733432

  1. 端点绑定,在TestAPP_Init函数中,做如下修改

image-20231127231641888

  //端点7TestAPP_epDesc.endPoint = 7; //TestAPP_ENDPOINT;TestAPP_epDesc.task_id = &TestAPP_TaskID;TestAPP_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&TestAPP_SimpleDesc;TestAPP_epDesc.latencyReq = noLatencyReqs;// Register the endpoint description with the AFafRegister( &TestAPP_epDesc );//端点8TestAPP_epDesc_8.endPoint = 8; //TestAPP_ENDPOINT;TestAPP_epDesc_8.task_id = &TestAPP_TaskID;TestAPP_epDesc_8.simpleDesc= (SimpleDescriptionFormat_t *)&TestAPP_SimpleDesc;TestAPP_epDesc_8.latencyReq = noLatencyReqs; // Register the endpoint description with the AFafRegister( &TestAPP_epDesc_8 );
  1. void TestAPP_MessageMSGCB( afIncomingMSGPacket_t *pkt )函数中的内容换成下面的
void TestAPP_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{// 端点7if(7 == pkt->endPoint){switch(pkt->clusterId){// 判断是哪个簇case 0x0001:LS164_BYTE(pkt->cmd.Data[0]);P1SEL &=0XFE;//1111 1110  LED1P1DIR |=0X01;//P1_0 ^=1;break;case 0x0002:LS164_BYTE(pkt->cmd.Data[0]);P0SEL &=0XFD;// 1111 1101;P0DIR |=0X02;P0_1 ^=1;break;}}// 端点8if(8 == pkt->endPoint){switch(pkt->clusterId){case 0x0001:LS164_BYTE(pkt->cmd.Data[0]);P0SEL &=0XEF;// 1110 1111 LED3P0DIR |=0X10;P0_4 ^=1;break;}}
}

image-20231127232237859

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

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

相关文章

MFC添加窗体菜单栏和消息响应

在资源视图右键,添加资源,选择Menu,新建 添加的菜单在资源菜单的Menu目录下 双击直接编辑输入菜单 之后在要添加菜单的窗体的属性Menu里面填写菜单的ID就可以了 如何给菜单添加点击响应? OnCommand是MFC中的一个消息处理函数,用于处理在窗口或控件被激活时发出的WM_CO…

java.sql.SQLException: No suitable driver 问题解决

问题出现 自己在写一个连接C3P0数据库连接池库的测试类,运行该类后出现了下图这个问题 这是我写的测试类 package demo;import com.mchange.v2.c3p0.ComboPooledDataSource;import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLExcept…

竞赛选题 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

Unity Meta Quest 一体机开发(八):实现 Hand Grab 扔物体功能

文章目录 📕教程说明📕设置刚体和碰撞体📕给物体添加 Physics Grabbable 脚本📕给手部添加 Hand Velocity Calculator 物体 此教程相关的详细教案,文档,思维导图和工程文件会放入 Seed XR 社区。这是一个高…

Open Feign 源码解析(一) --- FactoryBean的妙用

什么是Open Feign? OpenFeign 是 Spring Cloud 全家桶的组件之一, 其核心的作用是为 Rest API 提供高效简洁的 RPC 调用方式 搭建测试项目 服务接口和实体 项目名称 cloud-feign-api 实体类 public class Order implements Serializable {private Long id;p…

Vue3的项目创建到启动

Vue3的项目创建 检查node版本创建 npm init vuelatest 安装依赖 项目启动 启动成功

java学习part15单例模式

107-面向对象(高级)-单例设计模式与main()的理解_哔哩哔哩_bilibili 1.单例 就是说在某些开发场景中,某个类只要有一个对象就足够使用了,不需要重复创建。 (理解:比如说是数据库对象,使用时创建一个可以处理所有的数…

苍穹外卖项目笔记(5)——Redis

1 入门 1.1 Redis 简介 Redis 是一个基于内存的 key-value 结构数据库,官网链接(中文):https://www.redis.net.cn 特点: 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻&am…

C语言进阶-程序环境和预处理

目录 ​编辑 翻译环境 编译过程 预定义符号 #define #define 定义标识符 #define 定义宏 注意 例1 例2 提醒 #和## ##的作用 ​编辑 #的作用 ​编辑 带副作用的宏参数 预处理结果 输出结果 宏和函数对比 宏的缺点 命名约定 #undef 文件包含 本地文件包含 库文件包含…

C#,《小白学程序》第九课:堆栈(Stack),先进后出的数据型式

1 文本格式 /// <summary> /// 《小白学程序》第九课&#xff1a;堆栈&#xff08;Stack&#xff09; /// 堆栈与队列是相似的数据形态&#xff1b;特点是&#xff1a;先进后出&#xff1b; /// 比如&#xff1a;狭窄的电梯&#xff0c;先进去的人只能最后出来&#xff1…

oracle第一部分答疑

基础知识&#xff1a;第一章 视频总结&#xff1a; 1.体系结构&#xff1a; 1.1 oracle server 包括 instance/database instance包括&#xff1a; 2.内存结构&#xff1a; sga pga 3.进程结构&#xff1a; databse包括&#xff1a; 1.参数文件&#xff1a; pfile spfile 2…

西南科技大学(数据结构A)期末自测练习一

一、填空题(每空0.5分,共5分) 1、数据结构是指( A )。 A、数据元素的组织形式 B、数据类型 C、数据存储结构 D、数据定义 2、数据结构被形式地定义为(D,R),其中D是( B )的有限集合,R是D上( D )的有限集合。 (1)A.算法B.数据元素C.数据操作D.逻辑结构 (2)A.操作B.…

C++二分查找或并集查找:交换得到字典序最小的数组

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 0 开始的 正整数 数组 nums 和一个 正整数 limit 。 在一次操作中&#xff0c;你可以选择任意两个下标 i 和 j&#xff0c;如果 满足 |nums[i] - nums[j]| < limi…

Sass基础知识详细讲解【附带表图】

文章目录 前言使用 SassRack / Rails / Merb插件缓存选项语法选择编码 Sass CSS扩展Sass 注释输出 Sass 脚本Sass -规则和指令Sass 控制指令和表达式 Sass 混入指令Sass 功能指令命名约定Sass 输出样式:nested:expanded:compact:compressedSass 扩展缓存存储自定义导入 后言 前…

Python爬虫之代理IP与访问控制

目录 前言 一、代理IP 1.1.使用代理IP的步骤 1.2.寻找可用的代理IP 1.3.设置代理IP 1.4.验证代理IP的可用性 二、访问控制 2.1.遵守Robots协议 2.2.设置访问时间间隔 2.3.多线程爬取 总结 前言 在进行Python爬虫过程中&#xff0c;代理IP与访问控制是我们经常需要处…

贪吃蛇小游戏基本简单布局

代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Layui贪吃蛇小游戏</title> <link rel"stylesheet" href"https://cdn.bootcdn.net/ajax/libs/layui/2.5.7/css/layui.…

如何与死锁斗争!!!

其他系列文章导航 Java基础合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、死锁场景现场 二、死锁是如何产生的 三、死锁排查思路 四、sql模拟死锁复现 五、死锁的解决方案 前言 为避免影响业务&#xff0c;应尽可能避…

Django回顾【一】

一、Web应用程序 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件。应用程序有两种模式C/S、B/S。 C/S&#xff1a;客户端<----->服务端 例如My…

分类预测 | Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测

分类预测 | Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-KELM北方苍鹰算法优化核极限学习机分类预测&#xff08;完…

App的测试,和传统软件测试有哪些区别?应该增加哪些方面的测试用例?

从上图可知&#xff0c;测试人员所测项目占比中&#xff0c;App测试占比是最高的。 这就意味着学习期间&#xff0c;我们要花最多的精力去学App的各类测试。也意味着我们找工作前&#xff0c;就得知道&#xff0c;App的测试点是什么&#xff0c;App功能我们得会测试&#xff0…