13.端点、簇、属性

news2024/12/23 17:28:23

源码地址: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, // 簇ID
                   1,// 消息数据的长度
                   (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, // 簇ID
                       1,// 消息数据的长度
                       (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, // 簇ID
                       1,// 消息数据的长度
                       (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, // 簇ID
                       1,// 消息数据的长度
                       (byte *)&theMessageData, // 字符串内容数组首地址
                       &TestAPP_TransID,// 发送次数计数
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS); 
     }
      
     return (events ^ TestAPP_EVT);
  }

接收模块

  1. 定义一个变量

image-20231127231733432

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

image-20231127231641888

  //端点7
  TestAPP_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 AF
  afRegister( &TestAPP_epDesc );
  
  //端点8
  TestAPP_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 AF
  afRegister( &TestAPP_epDesc_8 );
  1. void TestAPP_MessageMSGCB( afIncomingMSGPacket_t *pkt )函数中的内容换成下面的
void TestAPP_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
   // 端点7
   if(7 == pkt->endPoint){
      switch(pkt->clusterId){// 判断是哪个簇
         case 0x0001:
            LS164_BYTE(pkt->cmd.Data[0]);
            P1SEL &=0XFE;//1111 1110  LED1
            P1DIR |=0X01;//
            P1_0 ^=1;
            break;
           
         case 0x0002:
            LS164_BYTE(pkt->cmd.Data[0]);
            P0SEL &=0XFD;// 1111 1101;
            P0DIR |=0X02;
            P0_1 ^=1;
            break;
      }
   }
   
   // 端点8
   if(8 == pkt->endPoint){
      switch(pkt->clusterId){
         case 0x0001:
            LS164_BYTE(pkt->cmd.Data[0]);
            P0SEL &=0XEF;// 1110 1111 LED3
            P0DIR |=0X10;
            P0_4 ^=1;
            break;
      }
   }
}

image-20231127232237859

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

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

相关文章

「Linux」git的安装与使用

💻文章目录 📄前言安装git的使用配置git初始化 git 仓库提交文件推送到远端使用HTPPS方式:SSH方式 📓总结 📄前言 git是一款多平台的版本管理器,用于对代码进行版本控制,如果你还不知如何安装gi…

Git指定分支或文件回退到指定版本

文章目录 一、分支回滚1.1、使用 git reset 命令1.2、使用 git revert 命令1.3、使用 git checkout 命令 二、文件回滚2.1、回滚未提交文件2.2、回滚已提交文件2.2.1、首先查看文件的历史版本2.2.2、找到你想要还原的版本2.2.3、将文件还原到你想要还原的版本2.2.4、提交代码 三…

【数据结构初阶(5)】链式队列的基本操作实现

文章目录 队列的定义初始化队列队尾入队列队头出队列取队头元素取队尾元素获取队列有效元素个数判断队空销毁队列 因为队列比较简单,关于队列的概念就不过多赘述了,本文只讲链队的基本操作实现 队列的定义 定义队列结点结构 链队中的每个结点都应该包…

RK3568平台开发系列讲解(Linux系统篇)pinctrl api介绍及实验

🚀返回专栏总目录 文章目录 一、pinctrl函数介绍二、设备树案例三、驱动案例 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍pinctrl api及其使用案例 。 一、pinctrl函数介绍 ①获取设备对应的 pinctrl…

在Matlab里安装gurobipy怎么安装教程

在Matlab 里安装gurobipy 先在CMD里激活, 然后添加系统环境变量 GRB_LICENSE_FILEC:\gurobi10.2\gurobi.lic 然后输入 addpath(D:\gurobi1003\win64\matlab) addpath(C:\gurobi1003\win64\matlab) addpath(C:\gurobi1002\win64\matlab) C:\gurobi1003\win64\m…

多功能智慧路灯系统整体解决方案介绍

在不改变现有城市景观的前提下,利用现有路灯改造,或新建多功能叁仟智慧路灯的方法,可实现城市无线网络、视频监控、物联传感网络、新能源充电系统、网格信息化管理的全覆盖,有效解决信息化设备选址难、取电难等问题。在目前无线通…

可以免费使用的Axure在线版来了

Axure作为一种功能强大的原型设计工具,一直受到设计师的青睐。然而,其高昂的价格可能成为一个门槛,限制了一些设计师的选择。但不用担心,现在有一个免费的Axure在线工具即时设计,功能更完整,更划算&#xf…

智能优化算法应用:基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于飞蛾扑火算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.飞蛾扑火算法4.实验参数设定5.算法结果6.参考…

小程序如何进行版本回退

当商家决定回退小程序版本时,可能是因为新版本出现了一些问题或者不符合预期,需要恢复到之前的稳定版本。下面具体介绍怎么回退小程序的版本。 在小程序管理员后台->版本设置处,点击版本回退。确认后,小程序会回退到上一次的版…

基于springboot-“有光”摄影分享网站系统(2023年☆全网唯一)【附源码|数据库|表结构|万字文档(LW)|技术文档|说明文档】

主要功能 前台登录: 注册用户:用户账号、密码、姓名、手机号、身份证号、性别、邮箱 用户: ①首页、公告资讯展示、图片素材展示、活动展示、视频素材展示、查看更多 ②论坛、发布帖子、活动、活动标题、活动类型、公告资讯、公告标题、公告…

Day43力扣打卡

打卡记录 子数组的最小值之和(乘法原理 单调栈) 大佬的题解 class Solution:def sumSubarrayMins(self, arr: List[int]) -> int:n len(arr)# 左边界 left[i] 为左侧严格小于 arr[i] 的最近元素位置(不存在时为 -1)left, s…

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一(暴力求解)代码实现: 思路二(数列的思想)代码实现: 思路三(异或的运用)代码实现: 二、轮转数组 思路一(暴力求解&#xff09…

viple模拟器使用(三):unity模拟器中实现沿右墙迷宫算法

沿右墙迷宫算法 引导 线控模拟可以使得通过用户手动操作,实现机器人在模拟环境下在迷宫中行走(即:运动),算法可以使得机器人按照一定的策略自动行走,沿右墙迷宫算法就是其中的一种策略。 目的 运行程序后&…

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口,其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框,第二个按钮点击时会执行一个特定的操作(在这个例子中,仅打印一条调试信息)。 功能描述: 创建窗口和布局:…

RT-DETR改进 | 2023小目标改进 | InnerEIoU、InnerSIoU、InnerWIoU、InnerDIoU等二十余种损失函数

论文地址:官方Inner-IoU论文地址点击即可跳转 官方代码地址:官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址: 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其AlphaIoU变种结合起来可以达到二十…

【大家的项目】Tran 简洁, 快速, 划词翻译

技术栈: rusttaurisolidjstypescript 欢迎萌新参与练手, 也欢迎大手子来魔改, ⭐star 当然是多多益善啦, ヾ(≧▽≦*)o Tran 简洁, 快速, 划词翻译 Keep it simple,stupid. 功能 划词翻译划过固定 划过关闭划过复制 快捷键: Alt X 构建 To \ FormZHJAZH…

中间件安全:Weblogic 漏洞.(使用工具可以利用多种类型漏洞)

中间件安全:Weblogic 漏洞.(使用工具可以利用多种类型漏洞) WebLogic 是美国 Oracle 公司出品的一个 application server,确切的说是一个基于 JAVA EE 架构的中间件,WebLogic 是用于开发、集成、部署和管理大型分布式…

【JAVA学习笔记】72 - 满汉楼 - 餐饮管理系统

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter26 一、需求说明 满汉楼项目功能多,界面复杂,涉及到复杂的awt和swing技术和事件编程,做如下调整: 1.去掉界面和事件处理(工作中使用很少),使…

OpenCvSharp从入门到实践-(03)像素

目录 像素 1、确定像素位置 2、获取像素的BGR值 3、修改像素的BGR值 像素 图像数字化是指用数字表示图像,每一幅数字图像都是有M行N列的像素组成的,其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别,这256个灰…

小航助学题库蓝桥杯题库stem选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSD…