ZigBee中协调器如何向子节点发消息?

注意:以下所有内容均以TI公司的CC2530和Z-Stack为硬软件平台为实验背景讲述。

在一般的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)
              //|| (SampleApp_NwkState == DEV_NWK_DISC)
             )
          {
            // 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类型的数组,存储了该节点的编号(人为编号)。这样,当协调器收到这个数据包时,即可以知道这个节点的短地址(数据包中自带)和编号(来自数据包中的数据体)。

这样,在协调器端,就知道了这个节点的短地址,接下来利用这个短地址就可以向这个节点发送数据了。

时间: 2024-08-05 19:26:55

ZigBee中协调器如何向子节点发消息?的相关文章

TI Zigbee中协调器和其他设备固定PANID通信,设置PANID

最近一直在研究zigbee,因为有通过固定PANID通信的需求,因此做了大量的实验,上了很多论坛,我想我必须总结一下,以免大家再走一遍我这样的路. 非常感谢很多写下技术文档和在TI论坛上积极回复的工程师. 一. 通过配置文件设置PANID 最简单的方式是修改 f8wConfig.cfg  中的-DZDAPP_CONFIG_PAN_ID 另外预定义NV_RESTORE和NV_INIT. 但有两个问题: 1.当协调器断电之后,重新上电时,周围已经有另一协调器也是这个PANID,则设备无法与原协调器连

Cocos2d-x发展---更改父的颜色、透明度的子节点上

标题手段:当我们改变父节点或透明时的颜色.默认是不会影响孩子的节点. 作为交换组看到朋友说可以通过设置相关的参数变化的子节点来实现属性的效果,看了看源代码,记录下来: 引擎版本号为:2.1.4 引擎中诸如CCSprite 设置颜色的时候是使用基类:CCNodeRGBA中的setColor 方法的.该方法的代码: void CCNodeRGBA::setColor(const ccColor3B& color) { _displayedColor = _realColor = color; if

Cocos2d-x开发---改变父节点颜色、透明度影响子节点

标题的意思是:当我们修改父节点的颜色或者透明度的时候,默认是不会对子节点产生影响的.在交流群里看见网友说可以通过设定某个参数来达到修改子节点相关属性的效果,就去看了看源码,记录下来: 引擎版本为:2.1.4 引擎中诸如CCSprite 设置颜色的时候是使用基类:CCNodeRGBA中的setColor 方法的.该方法的代码: void CCNodeRGBA::setColor(const ccColor3B& color) { _displayedColor = _realColor = col

【沫沫金】Sql查询树结构所有终极子节点

背景 项目中,存在一张自由表单存储表,即不固定列,也许是2列.3列.4列.但是倒数两列是结果和备注,需要数据交互的地方. 动态表中,每一个单元格存储一行,记录父子关系. 需求 根据模板数据列,解析后存入数据结果表. 问题 结果行只有12行,动态表中有28行.如何甄选出结果单元格,进行存储? 分析 动态表中,树级终极子节点是12行,和模板数据行匹配. 技术点 怎么一次性获取树级结构所有终极子节点. 源码 select * from ITEM where id not in (select pare

主线程给子线程发送消息

//创建主线程的handler private Handler handler = new Handler(){ public void handleMessage(Message msg) { Message message = new Message(); //向子线程发消息 threadHandler .sendMessDelayed(message , 1000); } }; private Handler threadHandler; onCreate()方法中: HandlerThr

读取cc2530节点的设备类型、协调器、路由器、终端。

建立网络.加入网络流程分析 协调器节点:在1-10  实验8 网络通信实验2 组播通信中 while(MSGpkt) { switch(MSGpkt->hdr.event) { case ZDO_STATE_CHANGE:  //建立网络后,设置事件 GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//??????? if(GenericApp_NwkState==DEV_ZB_COORD)//把该节点已初始化为协调器,则执行下面的

运行中修改协调器PAN ID和Channel,协调器广播至所有的设备重启加入新建后的网络

从飞比论坛那边看到一个问题,记录下: 一个ZigBee网络运行中,协调器通过串口与上位机连接,上位机设置协调器的PAN ID和Channel,协调器收到配置信息后, 首先将PAN ID和Channel广播发送至网络中的所有节点,然后协调器自身重启,加入新网络.部分代码如下: //PAN ID uint16 panId = BUILD_UINT16(msg[LOCDONGLE_CONFIG_PANID_LO_IDX], msg[LOCDONGLE_CONFIG_PANID_HI_IDX]); //

javascript中的子节点查找,childNodes和children

一.查找元素: 1.getElementById():接收一个参数:要取得的元素的 ID.如果找到相应的元素则返回该元素,如果不存在带有相应 ID 的元素,则返回 null.严格匹配,包括大小写. IE7 及较低版本还为此方法添加了一个有意思的"怪癖": name 特性与给定 ID 匹配的表单元素(<input>.<textarea>. <button>及<select>)也会被该方法返回.如果有哪个表单元素的 name 特性等于指定的

CC2530作为协调器或路由器,最大可以带多少子节点

默认值是5.20.6,共3万个节点. MAX_DEPTH决定了网络的最大深度.协调器(Coordinator)位于深度0,MAX_DEPTH参数限制了网络在物理上的长度,这个值默认是5,最大不能超过15.    MAX_CHILDREN决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最大个数.    MAX_ROUTER 决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有路由功能的儿子节点的最大个数.这个参数是 MAX_CHILDREN的