ZStack协议栈点对点通信

news2024/11/23 19:07:26

这里是zstack3.0安装包:链接:https://pan.baidu.com/s/1-N8FFQ86zenF1iq-wgkmJQ?pwd=2023
提取码:2023

新建自己的zstack工程这篇写得详细:新建
这个点对点通信主要是终端节点向协调器发送命令D1,协调器收到命令后判断数据是否为D1如果是则会调用闪烁LED的库函数。
协调器主要是收发终端节点的数据然后汇总这些数据,你可以把这些数据传给上位机等等,终端节点主要用来采集各种传感器数据,协调器首先创建网络,终端节点加入网络,这里面的具体细节还是很有趣的。
首先我们打开GenericApp的项目,然后remove掉GenericApp.c和GenericApp.h这两个文件

在这里插入图片描述
在这里插入图片描述
因为我们要模拟终端节点向协调器发送数据,协调器对发送的数据判断然后做相应的处理,所以添加Coordinator.c和Coordinator.h还有EndDevice.c和EndDevice.h四个文件
在这里插入图片描述
注意不同的设备状态必须把有的文件不要加载到里面,比如如果我现在是协调器
在这里插入图片描述
我就要把终端不能编译到项目里面,所以在想要不参加编译的文件右键option,勾选Override inheried seetting这个选项
在这里插入图片描述
然后代码
Coordinator.h:

#ifndef COORDINATOR
#define COORDINATOR
//群集个数
#define GENERICAPP_MAX_CLUSTERS 1
//输入簇ID
#define  GENERICAPP_CLUSTERID 0001
//端点ID
#define GENERICAPP_ENDPOINT 10
//profileid
#define GENERICAPP_PROFID             0x0F04
//设备id号
#define GENERICAPP_DEVICEID           0x0001
//版本号
#define GENERICAPP_DEVICE_VERSION     0
//保留位
#define GENERICAPP_FLAGS              0
//外部声明
void GenericApp_Init( byte task_id );
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events );

#endif

Coordinator.c:

//头文件
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "Coordinator.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
  #include "OnBoard.h"
#endif
#include "hal_led.h"

//输入簇
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
  GENERICAPP_CLUSTERID
};
//简单描述符
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
  GENERICAPP_ENDPOINT,              //  int Endpoint;
  GENERICAPP_PROFID,                //  uint16 AppProfId[2];
  GENERICAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  GENERICAPP_FLAGS,                 //  int   AppFlags:4;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;
  0,                                //  byte  AppNumInClusters;
  (cId_t *)NULL                     //  byte *pAppInClusterList;
};
//端点描述符
endPointDesc_t GenericApp_epDesc;
//任务ID号
byte GenericApp_TaskID;
//声明
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt );
//任务初始化函数
void GenericApp_Init( byte task_id )
{
  //身份证号码
  GenericApp_TaskID = task_id;
  //填写端点描述。
  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id = &GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;
  // 注册
  afRegister( &GenericApp_epDesc );
}
//应用层事件处理函数 当应用层任务有时间发生自动调用该函数
/*
task_id:发生事件的任务id号
events:事件
*/
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{
  //消息包指针
  afIncomingMSGPacket_t *MSGpkt;
  //是否是系统事件
  if ( events & SYS_EVENT_MSG )
  {
    //从消息队列里读取(接收)当前任务的消息
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        case AF_INCOMING_MSG_CMD:
          GenericApp_MessageMSGCB( MSGpkt );
          break;
        default:
          break;
      }
      // 释放空间
      osal_msg_deallocate( (uint8 *)MSGpkt );
      // 再次循环读取当前任务消息
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
  //用户事件

 
  // Discard unknown events
  return 0;
}
//事件处理函数
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  uint8 buffer[10];
  switch ( pkt->clusterId )
  {
    //终端节点发来的消息
    case GENERICAPP_CLUSTERID:
      osal_memcpy(buffer,pkt->cmd.Data,2);
      if(buffer[0]=='D'&&buffer[1]=='1'){
        HalLedBlink(HAL_LED_2,10,50,1000);
      }
      break;
    default:
      break;
  }
}

EndDevice.c:

//头文件
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "EndDevice.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
  #include "OnBoard.h"
#endif
#include "hal_led.h"


//终端节点发送数据 输出簇
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
  GENERICAPP_CLUSTERID
};
//简单描述符
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
  GENERICAPP_ENDPOINT,              //  int Endpoint;
  GENERICAPP_PROFID,                //  uint16 AppProfId[2];
  GENERICAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  GENERICAPP_FLAGS,                 //  int   AppFlags:4;
  0,                                //  byte  AppNumInClusters;
  (cId_t *)NULL,                    //  byte *pAppInClusterList;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList;
};
//端点描述符
endPointDesc_t GenericApp_epDesc;
//任务ID号
byte GenericApp_TaskID;
//设备状态
devStates_t GenericApp_NwkState;
//发送数据序号
byte GenericApp_TransID;


static void GenericApp_SendTheMessage(void);

//任务初始化函数
void GenericApp_Init( byte task_id )
{
  //保存系统分配的任务id
  GenericApp_TaskID = task_id;
  //设备未连接任何网络
  GenericApp_NwkState=DEV_INIT;
  GenericApp_TransID=0;
  //填写端点描述。
  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id = &GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;
  // 注册
  afRegister( &GenericApp_epDesc );
}

UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{
  //消息包指针
  afIncomingMSGPacket_t *MSGpkt;
  //是否是系统事件
  if ( events & SYS_EVENT_MSG )
  {
    //从消息队列里读取(接收)当前任务的消息
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        case ZDO_STATE_CHANGE:
          GenericApp_NwkState=(devStates_t)MSGpkt->hdr.status;
          if((GenericApp_NwkState==DEV_END_DEVICE)||(GenericApp_NwkState==DEV_ROUTER)){
            //向协调器发送
            GenericApp_SendTheMessage();
          }
          break;
        default:
          break;
      }
      // 释放空间
      osal_msg_deallocate( (uint8 *)MSGpkt );
      // 再次循环读取当前任务消息
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }
    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
  //用户事件

 
  // Discard unknown events
  return 0;
}

static void GenericApp_SendTheMessage(void){
  char theMessage[]="D1";
  afAddrType_t GenericApp_DstAddr;
  //协调器网络地址是0x0000
  GenericApp_DstAddr.addr.shortAddr=0x0000;
  GenericApp_DstAddr.addrMode=afAddr16Bit;
  GenericApp_DstAddr.endPoint=GENERICAPP_ENDPOINT;
  
  if(AF_DataRequest(&GenericApp_DstAddr,//目的地址
                 &GenericApp_epDesc,//源(发送端点号)
                 GENERICAPP_CLUSTERID,//命令号簇id
                 (uint16)osal_strlen(theMessage),//发送数据长度
                 (unsigned char*)theMessage,//消息内容
                 &GenericApp_TransID,//只想发送序号指针
                 AF_DISCV_ROUTE,
                 AF_DEFAULT_RADIUS)==afStatus_SUCCESS){
                    HalLedBlink(HAL_LED_1,10,50,1000);
                 }else{
                    HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
                 } 
}

EndDevice.h:

#ifndef ENDDEVICE_H
#define ENDDEVICE_H

#define  GENERICAPP_CLUSTERID 0001
//群集个数
#define GENERICAPP_MAX_CLUSTERS 1
//端点ID
#define GENERICAPP_ENDPOINT 10
//profileid
#define GENERICAPP_PROFID             0x0F04
//设备id号
#define GENERICAPP_DEVICEID           0x0001
//版本号
#define GENERICAPP_DEVICE_VERSION     0
//保留位
#define GENERICAPP_FLAGS              0


void GenericApp_Init( byte task_id );
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events );
#endif

下载程序可看到终端成功发送后灯闪烁,而协调器接收到后灯闪烁

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

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

相关文章

聚焦技术与体验极致提升,阿里云视频云连续5年领跑!

全球领先的IT市场研究和咨询公司IDC发布 《中国视频云市场跟踪(2022上半年)》 阿里云连续五年稳居 中国视频云整体市场份额第一 整体市场份额占比达25.4% 近日,全球领先的IT市场研究和咨询公司IDC发布的《中国视频云市场跟踪(…

算法训练营 day21 二叉树 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先

算法训练营 day21 二叉树 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先 二叉搜索树的最小绝对差 530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最…

《啊哈算法》第四章之深度优先搜索

✌好听的歌一起分享! 稻香 (女声版) - 余不不 - 单曲 - 网易云音乐 目录 模板 例子 1,关于遍历 2,关于边界 正文 1,概念 2,解救小哈 例子源码和题目 1,小学奥数 2,全排列 3&#x…

【自学Docker 】Docker inspect命令

Docker inspect命令 大纲 docker inspect教程 使用 docker inspect 命令可以用来获取 Docker容器 或者 Docker镜像 的元数据。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。 docker inspect语法 haicoder(www.haicoder.net)# docker inspect [OPTIONS] N…

python小知识

一、pip config list -v#pip在哪里寻找pip.conf文件 阿里云镜像: 二、安装anaconda(阿里云镜像库) 1、安装完成,命令行输入:conda config生成.condarc文件(运行期配置文件) 2、如果原本的源中的源地址是 https&…

webService速通教学(送源码)

什么是WebService webService是一种古老的互联网通讯方法。通过http通讯,将数据封装成XML的形式在网络中传输。习惯Java开发的伙伴肯定会对其嗤之以鼻,为什么不用Json传输,为什么不直接通过url拼参数?最大的两个因素是&#xff1…

Nginx基础03:配置文件nginx.conf(Part2)

上一篇文章概述与罗列了"全局配置块、events配置块、http全局块"的基本配置与属性,本篇文章将继续深入server块的配置项,以及相关应用。上篇文章地址:Nginx基础02:配置文件nginx.conf(Part1)如何…

从“工业报国为己任”到“科技创造优质生活”——华阳集团三十周年记

2022年10月28日,ADAYO华阳集团(002906.SZ)发布了一份“亮眼”的三季报。2022年1-9月公司实现营业收入40.08亿元,同比增长28.03%,实现归母净利润2.67亿元,同比增长28.28%。其中第三季度营业收入、净利润绝对值均为上市以来单季度最…

Android 深入系统完全讲解(23)

OpenGL 和 OpenGLES 简介 OpenGL(Open Graphics Library)意为开放图形库,是一个跨平台的图形 API,用于指定 3D 图 形处理硬件中的软硬件编程接口。OpenGL 一般用于图形工作站,PC 端使用。由于性能和可 移植性等各方面原因,在移动端…

分享72个PHP源码,总有一款适合您

PHP源码 分享72个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 72个PHP源码下载链接:https://pan.baidu.com/s/11BEwLdHiZF0DqB3Bhb3FaQ?pwdjoxq 提取码&#xff…

使用docker搭建版本控制系统-SVN

作者简介:一名Linux运维工程师,主要分享自己遇到的学习过程与遇到的问题。 座右铭:选择时尽心,行动时尽力,坚持时无怨,结束时无悔。 个人公众号:早九晚十二,欢迎大家留言交流…

day41|● 343. 整数拆分 ● 96.不同的二叉搜索树

题目链接:343. 整数拆分 1.代码 暴力做法&#xff1a;n前进行组合搜索得出二维数组result存放结果&#xff0c;然后对里面的元素进行乘积&#xff0c;谁最大就是结果 2.递归做法 class Solution { public:int integerBreak(int n) {vector<int>f(n 5, 0);f[2] 1;for …

LinkedList链表知识点概括

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE,数据结构领域博主 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望2023年迎来更优秀的自己&#xff01;希望跟大家一同进步~ 文章目录 前言 一、链表的基本概念 二、面试题实战 前言 顺序表/ArrayList:…

数据湖之Hudi基础:核心原理

继续Hudi核心概念 参考官网描述与尚硅谷hudi公开资料 文章目录基本概念时间轴TimeLine1.Instants action 在表上执行的操作类型2.Instant time3.State两个时间概念文件布局&#xff08;FileLayout&#xff09;索引 Index表类型&#xff08;Table Types&#xff09;Copy On Writ…

echarts:实现3D地图版块叠加动效散点效果

需求描述 如下图所示&#xff0c;展示3D效果的地图版块&#xff0c;并叠加显示动效散点&#xff1a; 实现思路 首先是3D地图版块效果的实现&#xff0c;可以参考广州3D地图&#xff1b;而动效散点的实现&#xff0c;可以参考地图发散分布。 这里再提一个经过尝试并不行的思…

【mmdeploy】mmseg转ONNX/TensorRT,附推理代码

目录 1.关于mmdeploy 2.环境安装 2.1预编译安装&#xff08;Linux-x86_64, CUDA 11.x, TensorRT 8.2.3.0&#xff09;&#xff1a; 2.2预编译安装&#xff08;Linux-x86_64, CUDA 11.x, ONNX&#xff09;&#xff1a; 3.mmseg工程torch转onnx 4.使用onnx模型文件进行推理…

Dubbo框架学习(第一章Dubbo简介)

由于在微服务领域有两大框架统治&#xff0c;一个是springCloud的全家桶&#xff0c;一个是Dubbo。我用Dubbo比较少&#xff0c;所以也是学习状态。Dubbo框架学习&#xff0c;资料来源于cn.dubbo.apache.org。第一章Dubbo简介Apache Dubbo 是一款 RPC 微服务框架&#xff0c;提…

字节跳动青训营--前端day2

文章目录前言一、css1. css的组成2. css三种使用方式3.css的工作方式二、 css选择器Selector1. 选择元素的方式2. 伪类&#xff08;pseudo-classes&#xff09;2.1 状态伪类2.1 结构伪类3.通过组合选择元素3.1 直接组合3.2 元素组合的拓展4. 选择器的特异度&#xff08;Specifi…

小型水库雨水情测报和安全监测解决方案

平升电子小型水库雨水情测报和安全监测解决方案辅助水利管理部门实现水库雨水情信息“全要素、全量程、全覆盖”自动测报。系统具备水库水位、雨量、现场图像/视频等水文信息采集、传输、处理及预警广播等功能&#xff0c;有效提升了雨水情信息的时效性和准确度&#xff0c;为保…

jmeter 使用beanshell 编写脚本

一、介绍 1.1 介绍 BeanShell是一个小型的、免费的、可嵌入使用Java编写的具有对象脚本语言特性的Java源码解释器。 动态执行所有Java语句、Java代码片段以及弱类型Java和附加的脚本的便利 透明地访问所有Java对象和API 四种运行模式&#xff1a;命令行、控制台、Applet、远…