lesson 12 Zigbee绑定通信

news2024/11/17 7:43:26

目录

Zigbee绑定通信

通信原理

实验过程

实现步骤

实验现象 

实验分析


Zigbee绑定通信

通信原理

1、Zigbee一共有五种通信方式:单播、广播、组播、MAC、广播

2、绑定是Zigbee的一种基本通信方式,具体绑定通信又分为三种模式,模式大同小异,在这里我只拿源绑定来说明

3、绑定通信:发送模块必须要知道接收模块(被绑定模块)的网络地址或者MAC地址、接收方的接收端点和接收簇。创建绑定的过程都由发送方来完成,是发送模块的一厢情愿,与接收方无关,

源绑定:

含义:在发送模块(源模块)里面创建了和它所绑定模块的绑定表。

注:单播、MAC、绑定最终发送的数据帧格式都是相同的。

在发送模块里,会调用一个函数,这个函数会创建一个结构体(绑定表)。绑定表里含有 发送模块的发送端点、接受模块的接受端点、接收模块的MAC和接收模块的接受簇。还必须保证发送模块的地址管理器中存有接收模块的MAC和网络短地址。

最后调用发送函数,以绑定的方式发送(绑定的时候发送指定函数中的配置信息有:接收模块的接收端点、接收簇,发送模块的发送端点,发送模块的网络地址。不指定接收模块的地址相关信息)。在发送时,首先查看绑定表,如果绑定表中的内容与发送函数中指定的信息相匹配,再去查看地址管理器的MAC与绑定表中的MAC是否一致,如果一致,就将地址管理器中的网络短地址作为目标地址,最后将数据包发送过去。

实验过程

实现步骤

我们使用上一节的MAC地址通信作为基础程序。(其中绑定内容只需要在发送模块终端中创建,接收模块协调器不用动)

1、首先我们创建一个接收模块MAC的地址相关信息结构体变量:destination,然后传入地址模式MAC和接收模块MAC地址。

然后调用函数:ZStatus_t APSME_BindRequest( byte SrcEndpInt, uint16 ClusterId,zAddrType_t *DstAddr, byte DstEndpInt);

其中函数的第一个参数是发送方端点,第二个参数是接收方簇,第三个参数是接收模块MAC的地址相关信息结构体地址,第四个变量是接收方的端点。

调用这个函数,不会发出任何无线数据包,它只是发送模块用来本地创建一个绑定表的结构体。

2、然后我们调用函数ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);

这个函数在前面的MAC通信中提到过。作用是将携带目标模块的MAC地址的数据包广播出去到Zigbee网络中,网络中的其它模块接收到数据包后判断数据包里面携带的MAC地址是否与自己一致,如果一致,就将自己的网络短地址发送给发送模块。这样发送模块收到网络短地址后就会成功将接收模块的地址相关信息添加到本地的地址管理器。

接着调用定时器触发事件函数,30s后执行发送事件

3、最后我们创建目标模块地址结构体变量,并只要配置绑定方式AddrNotPresent即可,不需要传入地址,然后调用数据发送函数发送。到此绑定通信配置完成。

4、程序

创建绑定表

      uint8 DestMac[8]={0xFD,0xE7,0x59,0x2A,0x00,0x4B,0x12,0x00};//0x00124B002A59E7FD   
      
      //创建绑定表,与接收模块绑定
      zAddrType_t destination;
      destination.addrMode=Addr64Bit;
      memcpy(destination.addr.extAddr,DestMac,8);
      APSME_BindRequest( 10,0x0001,&destination,10);//创建绑定表,与我们的接收模块绑定
      
      ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);
      //携带接收目标模块的MAC,广播出去;网络中其它节点收到判断是否与自己MAC一样
      osal_start_timerEx(StarryApp_TaskID,StarryApp_SEND_MSG_EVT,30);//等待30ms执行事件

发送数据

  if ( events & StarryApp_SEND_MSG_EVT )
  {
    
      char theMessageData[] = "Zigbee 绑定实验";
                    
      StarryApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;//以绑定的方式发送
      //StarryApp_DstAddr.addr.shortAddr = 0x0000;
      //memcpy(StarryApp_DstAddr.addr.extAddr,DestMac,8);
      // Take the first endpoint, Can be changed to search through endpoints
      StarryApp_DstAddr.endPoint = StarryApp_ENDPOINT;//接收模块的端点
      
      AF_DataRequest( &StarryApp_DstAddr, &StarryApp_epDesc,
                 StarryApp_CLUSTERID,
                 (byte)osal_strlen( theMessageData ) + 1,
                 (byte *)&theMessageData,
                 &StarryApp_TransID,
                 AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
  }

实验现象 

按终端模块S1,进行MAC地址通信;按终端模块S2,进行绑定通信

实验分析

通过抓包,抓取绑定过程的数据包

我们只需要看第一个Data request前面的三个帧即可,后面两个帧是附带的

第一帧是终端发给父节点,通过父节点进行广播转发,表明终端想要获得目标MAC的网络短地址

第二帧是协调器转发子节点终端的数据帧

第三帧是终端发送给协调器的数据包,是按下K2后30ms后发送的,通过前面的时间可算出。还可以注意到后面的帧内非常明确指明了源网络短地址和目的网络短地址。这也表明了终端成功从本地地址管理器中获取到了目标网络短地址。

最后还要注意一点,单播、MAC和绑定它们最终发送的数据帧格式都是一模一样的,都包含了以下五个信息。

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

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

相关文章

C++之std::move用法(一百四十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

最长回文串

Manacher 问题 寻找字符串中的最长回文串 传统做法 字符串首字符前加一个特殊字符 ‘#’ 末尾字符加一个特殊字符 ‘#’ 相邻字符间也加上特殊字符 ‘#’ 遍历字符串,除特殊字符外,以每个字符作为回文字符串的中心向外扩张 思考 很明显这种做法的…

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在,使用 Prompt 可以快速开发一个应用程序,但是一个应用程序可能需要多次写Prompt,并对 LLM 的输出结果进行解析。因此,需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

基于Mybatis的数据权限拦截器实现

目录 一、背景二、动机三、实现思路3.1 权限类型、操作类型3.2 统一用户及数据权限集合模型3.3 定义数据权限拦截注解3.4 提取配置属性3.5 数据权限拦截器实现 四、集成方式五、关于D3S 一、背景 最近一直在做RBAC相关的架构设计与实现,传统的RBAC的权限控制只是控…

2023CCF CAT- 全国算法精英大赛

目录 A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challenge G Card H The diameter of a rectangle I Tourist J Mysterious Rune String A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challe…

Git标签管理

目录 标签介绍 创建标签 删除标签 推送标签到远程仓库 标签介绍 标签tag,可以理解为是对某次commit 的一个标识,相当于起了一个别名。 比如说有些重要的commit id 难以记住,这时候就可以利用tag给这个commit id 起一个有意义的名字&…

【QT】图形化页面设计

可视化的图形化界面共有三种设计方式,一种是通过可视化来设计界面的方式;一种是代码化的设计方式;最后是混合上面两种的混合界面设计方式。目前我们只考虑通过Designer和代码来设计图形化页面的两种方式。 目录 可视化图形界面设计 图形页…

数字信号的载波传输

从信号传输质量来看,数字系统优于模拟系统。 由于数字基带信号的频谱包含低频成分,而许多重要的通信信道是带通型的,比如无线信道和许多有线信道,这时需要调制成数字频带信号。 数字调制与模拟调制原理基本相似,有调幅…

ChatGLM-6B详细学习实践记录与资料分享

随着年初chatGPT产品的退出和迭代发展,凭借一己之力将大模型带火,国产很多厂商后续也陆续跟进开始投入研发属于自己的大模型产品,在这段时间里面陆陆续续出来了很多不同的产品,比如:文心一言、星火大模型、通义千问、商…

吴恩达AIGC《How Diffusion Models Work》笔记

1. Introduction Midjourney,Stable Diffusion,DALL-E等产品能够仅通过Prompt就能够生成图像。本课程将介绍这些应用背后算法的原理。 课程地址:https://learn.deeplearning.ai/diffusion-models/ 2. Intuition 本小节将介绍扩散模型的基础…

gof23设计模式之代理模型

1. 代理模式 1.1. 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代…

Kubernetes对象深入学习之一:概览

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于《Kubernetes对象深入学习》系列 在client-go的学习和使用过程中,不可避免涉及到对象相关的代码,经常面临一个尴尬的现象&#x…

PCL点云处理之多角度剖面切割(一百九十五)

PCL点云处理之多角度切割点云剖面(一百九十五) 一、算法介绍二、具体实现1.沿法向量方向切割剖面2.沿竖直方向切割剖面3.沿水平方向切割剖面一、算法介绍 点云的剖面往往隐藏着很多有用信息,而且分析更加简单一些,这里自己实现一系列不同角度的点云剖面切割,包括沿着法向量…

车载软件架构 —— 闲聊几句AUTOSAR OS(七)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Framework - AMS

一、概念 Android10(API29)开始,ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…

数据结构--串的存储结构

数据结构–串的存储结构 串的顺序存储 静态数组实现(定长顺序存储) #define MAXLEN 255 typedef struct {char ch[MAXLEN];int length; }SString;动态数组实现(堆分配存储) typedef struct {char* ch;int length; }HString;int main() {HString S;S.ch (char*)malloc(sizeo…

问题解决:centos7异常关闭后无法开机

前言:主机卡死,直接关了电脑电源,虚拟机中的centos7 产生错误,无法开机 重点是取消挂载。很多文章都提到了xfs_repair /dev/dm-0 , 但是不适用我遇到的情况。 # ls /dev/mapper umount /dev/mapper/centos-root xfs_repair -v -…

[洛谷]B3601 [图论与代数结构 201] 最短路问题_1(负权)(spfa)

SPFA模板啦~ 直接上ACcode: #include<bits/stdc.h> using namespace std; //#define int long long #define inf 2147483647 const int N15e310,M2*N; int dis[N],head[N],cnt; bool vis[N]; int n,m; struct E {int to,w,next; } e[M]; queue<int>q; void add(in…

U-Boot移植 - 1_嵌入式Linux系统移植概述

文章目录 1. 嵌入式Linux系统移植概述2. 实验开发板简介3. U-Boot简介4. NXP uboot测试 1. 嵌入式Linux系统移植概述 Linux 的移植主要包括3部分&#xff1a; 移植「bootloader 代码」&#xff0c; Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;也就说芯片上电…

【Android Framework (十) 】- ContentProvider

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动AMSservicebinderService 前言源码分析1.使用方法2.ContentProvider实现类。3.使用方法4.注册Observer正文 拓展知识 总结 知识回顾 启动第一个流程init 1&#xff0c;挂载文…