在一般的ZigBee教程中,子节点如何向协调器发送消息已经被描述得非常清楚了,即子节点直接使用API向地址为0x0000的协调器发送消息即可。用到的函数如下:

afStatus_t AF_DataRequest (afAddrType_t *dstAddr,endPointDesc_t *srcEP,uint16 cID,uint16 len,uint8 *buf,uint8 *transID,uint8 options,uint8 radius
);

参数dstAddr即为目标节点的地址。例如做一个点对点的通信实验,向协调器发数据,则dstAddr应该这样实例化:

afAddrType_t Point_To_Point_DstAddr; /* 点对点通信 */
Point_To_Point_DstAddr.addrMode = ( afAddrMode_t ) afAddr16Bit; /* 点播 */
Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
Point_To_Point_DstAddr.addr.shortAddr = 0x0000; /* 发送给协调器,0x0000是协调器的地址 */

  要使协调器向子节点发送数据,只需要知道子节点的地址即可。在许多深入讲解ZigBee通信协议的书中,对ZigBee网络节点的地址分配机制都做了详细的介绍,依据一些公式和描述该网络拓扑结构的参数可以计算出每个节点的地址。这也就似乎意味着如果一个网络拓扑结构固定的ZigBee网络,则其节点的地址也是固定的,可以通过事先计算将节点地址算出来,再进行通信。但是在项目开发阶段,我们很难做到固定拓扑结构,而且这需要修改ZigBee协议栈中关于网络拓扑结构类型的预先定义。所以比较可靠的方法是:当ZigBee子节点加入网络后的第一时间,立即向协调器发送一条消息,告诉协调器它的地址及认为给它加上的编号。这样协调器端则会形成一个编号和短地址的对应表,协调器根据这张表向相应的子节点发送数据。
  具体实现过程可以是这样的:在子节点端的SampleApp_ProcessEvent函数中,在处理节点网络状态改变的分支位置开启一个定时器,在处理定时器计时完成的代码中向协调器发送该节点的短地址:

case ZDO_STATE_CHANGE:SampleApp_NwkState = ( devStates_t ) ( MSGpkt->hdr.status );if ( ( SampleApp_NwkState == DEV_ZB_COORD ) || ( SampleApp_NwkState == DEV_ROUTER ) || \( SampleApp_NwkState == DEV_END_DEVICE ) ) {/* Start sending the periodic message in a regular interval */osal_start_timerEx ( SampleApp_TaskID, SEND_ADDR_MSG_EVT, SEND_ADDR_STEP_TIMEOUT );} else {/* Device is no longer in the network */}break;

在处理SEND_ADDR_MSG_EVT事件中,可以这样做:

if ( events &SEND_ADDR_MSG_EVT ) {HalUARTWrite ( 0, "开始发送", 4 );if ( AF_DataRequest (&Point_To_Point_DstAddr, &SampleApp_epDesc,SAMPLEAPP_POINT_TO_POINT_CLUSTERID,4,sendAddr,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {HalUARTWrite ( 0, "成功发送", 4 );} else {HalUARTWrite ( 0, "发送失败", 4 );}
}

sendAddr为一个uint8类型的数组,存储了该节点的编号(人为编号)。这样当协调器收到这个数据包时,即可以知道这个节点的短地址(数据包中自带)和编号(来自数据包中的数据体)。协调器端知道了这个节点的短地址,接下来利用该地址就可以向这个节点发送数据了。

ZigBee协调器向子节点发消息相关推荐

  1. 组一个包括协调器路由器终端节点的zigbee网络,通过串口能获取它们的拓扑结构。

    组一个包括协调器路由器终端节点的zigbee网络,通过串口能获取它们的拓扑结构. 实验简介 实验环境 实验准备 1.下载基本工程文件 2.打开工程文件 3.尝试编译 路由器和终端节点 查看完整原文 旧 ...

  2. 基于Zigbee的SHT10温湿度数据采集系统(已实现控制12个终端节点)——Zigbee协调器主要代码解析

    之前实现了基于Zigbee的SHT10温湿度数据采集系统,这里来重新复盘一些主要的知识和代码. 写在前面: 1 功能介绍:使用Zigbee终端节点采集环境的温度和湿度数据,然后将数据无线发送的Zigb ...

  3. ZigBee协调器,ZigBee智能节点盒

    新设备下 1.安装CP210xVCPInstaller_x64.exe串口驱动 2.连接USB转串口,RS485转232,蓝色数据线连ZigBee协调器485A,黄色数据线连ZigBee协调器485B ...

  4. ZIGBEE 协调器(刷写程序后)PAN_ID+1,与原来路由器无法组网

    ZIGBEE 协调器(刷写程序后)PAN_ID+1,与原来路由器无法组网 原因:或许是你下载时,勾选了Erase flash选项,如下图 原因简析 原因:或许是你下载时,勾选了Erase flash选 ...

  5. mesh 协调器 路由器_关于zigbee协调器(单播方式)传输数据给网络中的多个路由器丢失数据包的问题?...

    问题描述:建立一个mesh网络,网络中只存在协调器和路由器节点,并不存在Endevice终端节点.整个网络大概存在20多个路由节点,一个协调器. 路由器节点和协调器都加入和NV存储,所以路由节点掉电后 ...

  6. TI CC2538 做ZigBee协调器控制飞利浦 Hue 调色灯

    [源码.文档.软件.硬件.技术交流.技术支持,入口见文末] 一.实验准备 1.1 硬件准备 1.1.1 CC2538 模块 本文中使用的 CC2538 模块是带 PA 芯片(CC2592)的.此外,最 ...

  7. Zigbee协调器主动使终端节点退网

    我使用ZDP_MgmtLeaveReq()这个函数来让已知短地址的终端退网,代码如下:我这样使用的结果是,可以将节点退网,节点上也需要做一些配置.我在函数里禁止节点重连,但是节点退网后会获取到新的短地 ...

  8. Zigbee——协调器组建网络

  9. zigbee现存网络下更换协调器

    应用场景:现场协调器坏了,更换协调器,只改panid.加密信息.信道等是不行的 因为之前坏掉的协调器已经创建了一个网络,即使旧协调器坏了,网络还在,新协调器如果开机前没有之前的网络设备处于开启状态,它 ...

最新文章

  1. CentOS 迎来更新换代版本 CentOS Stream 9 附下载镜像OS地址
  2. 【周报6.10-6.16】NLP,RL,GAN,DL框架等重磅专栏齐上线,这个月的有三AI你值得拥有...
  3. 数据库中插入英文数字正常,插入中文错误解决方案
  4. 2018.07.11 线段树基本模板复习
  5. Git 基础(八)—— Github 的使用(账号管理)
  6. java源程序文件扩展名_JAVA源代码的扩展名为( )
  7. linux如何使用磁盘阵列卡,Linux的RAID磁盘阵列与阵列卡
  8. 对Java实现单链表中.next的解释
  9. Winform(XtraReport)实现打印方法(转载)
  10. Windows10 Hyper-v 虚拟机安装点心云,实现闲置宽带共享。
  11. 直播技术——视频编解码(理论基础)
  12. 沐风老师3DMAX网球建模教程
  13. cmpp 免提短信(闪信)
  14. erp管理的几个sql
  15. 五脏六腑等最喜欢的食物
  16. react 瀑布流和下拉加载以及图片加载
  17. eclipse启动优化,终于不那么卡了!
  18. java双线_[量化小实验] 双线 RSI 择时策略
  19. 车辆监控管理系统的设计与实现,车辆监控管理系统技术方案 ,车载监控终端,车辆监控管理系统平台
  20. python 协程详解教程

热门文章

  1. 程序员他们也可以很可爱幽默
  2. Oracle中的日期和字符串互相转换以及格式化
  3. 2021年 江南大学研究生考试 算法与程序设计 题目
  4. vue下载文件并重命名
  5. 3000亿紫光集团破产重整,原因是啥?
  6. buuctf crypto 萌哒哒的八戒
  7. 面向对象 -- 基础(A版)
  8. python中string是什么意思_Python中的“string”和“string”有什么区别吗?
  9. Arduino模块学习笔记(一)—GPS模块的使用
  10. 本征图像分解:Retinex理论【转载】