Zigbee MAC地址通信中发送模块指定了接收模块MAC地址却发送不了数据包的解决办法

news2024/10/1 15:10:16

Zigbee MAC地址通信中发送模块指定了接收模块MAC地址却发送不了数据包的解决办法

事情缘由

在做MAC地址通信的实验中,我将程序分别下载进模块,组网成功后,发送模块终端按下按键,接收模块协调器什么反应也没有,上位机也没接收到消息。

通过抓包发现,按下按键的时候确实没有数据包发出。只有协调器模块和终端模块之间进行父子点询问的帧和协调器模块的网络状态帧。并没有我们按下按键通过指定协调器MAC发送的数据帧。

经过半天的百度查阅,但网上关于Zigbee模块MAC地址通信的资料少之又少,困扰了我一晚上,找到了一个可能可行的方法。

我参考了这篇博客https://www.cnblogs.com/gary-guo/p/5737076.html

错误原因

首先我们要搞清楚MAC地址通信的本质是什么:

在网络里面的每一个zigbee模块,它都有一个地址管理器,它会记录与它经常通信的模块的MAC地址以及网络短地址,然后存放到地址管理器里面;

以MAC地址发送数据:在数据发送的时候,它会去检查地址管理器看是否有对应的MAC地址,如果有,那么它会把对应的网络短地址放到无线数据包里面去发送;如果没有对应的MAC地址,为了确保通信成功,那么我们应该怎么做呢?

其中ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);的作用是让MAC对应的目标模块将当前的网络短地址回复给我

然后收到对应MAC地址的网络短地址后,就可以在地址管理器当中建立这样的映射关系,然后延时30毫秒,发送事件,GENERICAPP_SEND_MSG_EVT,然后进入到该事件里面去发送实际的数据

将程序下载到模块进行抓包

我们发现,按下按键后,请求网络地址的通信过程是正常的,而终端依然无法将数据通过MAC地址发送给协调器。不过至少验证了模块硬件没有问题。

最后我重新安装了一个TI 协议栈:ZStack-CC2530-2.3.0-1.4.0,我原来使用的版本是ZStack-CC2530-2.5.1a。

将我们的原终端程序重新移植到新的新协议栈,通信成功!

     char theMessageData[] = "Zigbee MAC实验";
      uint8 DestMac[8]={0xFD,0xE7,0x59,0x2A,0x00,0x4B,0x12,0x00};//0x00124B002A59E7FD   
                    
      GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr64Bit;//发送模式是MAC
      //StarryApp_DstAddr.addr.shortAddr = 0x0000;
      memcpy(GenericApp_DstAddr.addr.extAddr,DestMac,8);
      // Take the first endpoint, Can be changed to search through endpoints
      GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;
      
      AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
                 GENERICAPP_CLUSTERID,
                 (byte)osal_strlen( theMessageData ) + 1,
                 (byte *)&theMessageData,
                 &GenericApp_TransID,
                 AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );

最终现象

抓包发现,按下S1后,终端成功通过协调器的MAC地址发送了数据包给协调器

串口也成功接收到数据

结果分析

我们可以发现,发送数据包的目标地址不是MAC,而是目标的网络短地址。

这是因为当以MAC地址进行发送的时候,发送模块首先会查看自己的地址管理器有没有节点的MAC与我们所指定通信的MAC地址是一致的。如果发现有,它会将目标节点的网络短地址作为无线数据包的发送地址。如果两个模块之间距离很远,且不怎么互相通信,地址管理器查不到对方的MAC。那我们在发送数据包前就必须使用网络短地址请求函数

ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);

通过发送一个信号,来让我们的MAC地址对应的模块把网络短地址回复给我们,之后等待30ms再发送(确保发送模块成功获取目标模块网络地址),就一定会成功。这也是我刚刚提到的一个解决数据包发送失败的处理办法。

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

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

相关文章

(模拟) 657. 机器人能否返回原点 ——【Leetcode每日一题】

❓ 657. 机器人能否返回原点 难度:简单 在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。 移动顺序由字符串 moves 表示。字符 move[i] 表示其第 i 次移动。机器人的有效…

STM32F4使用18B20温度传感器【串口显示、18B20传感器】

在物联网和嵌入式系统中,温度传感器是常用的传感器之一。18B20温度传感器是一种数字温度传感器,非常适合用于测量环境温度。 本篇博客将介绍如何使用正点原子团队的官方驱动代码读取18B20温度,并通过串口显示。 编写代码 首先,…

mac m1通过qemu和grub制作操作系统引导盘

文章目录 前言grub安装引导盘FAQ参考附录qemu安装ubuntuGRUB安装到回环设备吧啦吧啦... 前言 我电脑是mac m1芯片的,做了如下尝试,最终在第4种方式下成功: 开始用了parallels desktop安装了ubuntu 22版本的,因为本机是arm64芯片…

Linux学习-基础篇

Linux学习 学自尚硅谷武晟然老师,结合老师课堂内容和自己笔记所写博文。 文章目录 Linux学习基础篇桌面与终端文件系统一、文件系统和挂载点二、目录结构bin、sbinlib、lib64usrbootdevetchome、rootoptmedia、mntprocrunsrvsystmpvar Vim编辑器一、整体介绍和模式转…

GridView编辑更新时数据没有改变,总是原来的值

GridView编辑更新时数据没有改变,总是原来的值 猜测原因是:我在点击更新时又执行了page_load方法,又将数据库的值绑定到了gridview上,所以永远都是数据库的值 解决办法:判断页面是不是第一次加载。在page_load方法…

【论文笔记】FASTER SEGMENT ANYTHING:TOWARDS LIGHTWEIGHT SAM FOR MOBILE APPLICATIONS

前脚fast SAM刚发完,后脚mobile SAM就发了 ,之前的论文笔记中我一直就认为fast SAM其实应该算是yolo的扩展工作,和原生的SAM架构相去甚远,而且在简介上直接就对(gong)比(ji)了FastSA…

VS2022运行一闪而过的解决方案

1.问题情景 编写完程序后,尝试在VS中编译链接运行(使用快捷键F5或者fnF5或者ctrlfnF5,不同的电脑可能不太一样)发现控制台一闪而过。 2.解决方案 解决方案:右击“项目”->“链接器”->“子系统”->修改为“…

云原生——什么是云原生?

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 伴随云计算的滚滚浪潮,云原生(CloudNative…

Matlab中统计矩阵中元素个数的方法

1、 tabulate函数 a [1,2,1,3,1,4,1,5,2,3,1,4,2,5,4,2];tabulate(a)第一列代表了元素,第二类代表该元素出现的个数,第三列代表该元素的占比。 2、find函数和length函数 判断矩阵a中元素2出现的次数 a [1,2,1,3,1,4,1,5,2,3,1,4,2,5,4,2]; length(…

Cadence 生成智能 PDF 的方法

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 项目设计完成后,原理图文件需要导出 PDF 文档进行归档,过去导出的 PDF 文 件不带属性,网络标识不可选择,查找元器件和网络标识不…

自定义类创建数组的赋值;并回复:窗体图片时间

缘由https://bbs.csdn.net/topics/392551630 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…

Nacos 配置更新的工作流程

首先,Nacos 是采用长轮训的方式向 Nacos Server 端发起配置更新查询的功能。所谓长轮训,(如图)就是客户端发起一次轮训请求到服务端,当服务端配置没有任何变更的时候,这个连接一直打开。 直到服务端有配置或…

微分方程应用——笔记整理

首先,根据正常思路走,化简得到式子: 不难发现,设 后面得出该方程的通解: 这里要注意什么等于这个通解 --- z 又因为该曲线过点 所以可以求出c为3 该题虽然简单,但是要注意几个问题,该定…

轻松生成高质量用例的API接口工具

1、前言 随着自动化测试技术的普及,已经有很多公司或项目,多多少少都会进行自动化测试。 目前本部门的自动化测试以接口自动化为主,接口用例采用 Excel 进行维护,按照既定的接口用例编写规则,对于功能测试人员来说只…

vue使用img标签:src属性动态引入资源路径的方法

vue版本号&#xff1a;3.2.13 vue中<img src"" />标签静态引入图片资源 <template><!-- <router-view/> --><!-- 静态引入图片资源 --><img src"./assets/logo.png" alt""> </template><style la…

微软MFC技术中消息的定义

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊MFC技术中消息的定义。 本贴子首先介绍MFC消息的基本概念&#xff0c;理解消息的定义是学习使用MFC的基础。了解消息的驱动机制后&#xff0c;才能彻底明白MFC的运行机制。 首先来看什么是消息。…

VS code搭建JavaScript环境调用XHR实现post和get简单流程

一、下载NodeJS 下载node&#xff0c;最好到node官 https://nodejs.org/en/ 下载一个LTS&#xff08;Long Term Surport&#xff09;长期支持版本。 输入命令node -v 就可以看到node的版本了如果node安装包集成了npm(node package manage)&#xff0c;那我们输入命令npm -v 也…

11 S整数小波分解图像(matlab程序)

1.简述 学习目标&#xff1a; 非标准小波分解&#xff08;用S整数变换&#xff09; 小波分解过程&#xff1a;读取加入噪声后的图片后&#xff0c;数据即是高度*宽度个数据点。对此矩阵数据要做二维离散小波分解&#xff0c;二维小波变换和一维小波变换的区别从原理上来说就是…

stable diffusion webui 下载和使用civitai中的模型

1.网址 C站网址为&#xff1a;https://civitai.com/。注&#xff1a;这里需要科学上网 2.下载模型 1.选择想要的模型&#xff0c;点击【Download】按钮&#xff0c;这里演示【Deliberate】模型的下载和使用 2.将下载的模型&#xff0c;存放到【/models/Stable-diffusion】目…

基于圆弧搜索和最小似然圆估计的圆查找算法

在这里提出一种算法&#xff0c;其实是将两篇papers的想法的结合。没有什么创新点&#xff0c;只是做一下算法原理的记录&#xff0c;防止后面重新看代码的时候一头雾水。 算法的目的在于查找特定半径范围的圆&#xff0c;而不致力于查找所有的圆&#xff0c;当然它也支持查找所…