打印
[Zigbee]

zigbee终端向多个协调器发起请求的思路

[复制链接]
1167|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
八层楼|  楼主 | 2020-8-5 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一个ZigBee终端周围可能有多个协调器,如何让终端连接到指定的协调器?


先简单的谈一下终端的入网流程(相关代码自己去看源码):

1,终端上电,调用ZDOInitDevice初始化ZDO层的task

2, 在ZDOInitDevice中调用ZDApp_NetworkInit方法初始化网络

3,在ZDApp_NetworkInit方法中发送了ZDO_NETWORK_INIT事件消息

4,在ZDApp_event_loop中处理ZDO_NETWORK_INIT事件消息,并调用ZDO_StartDevice方法来启动网络

5,在ZDO_StartDevice方法,调用了NLME_NetworkFormationRequest来搜索网络,搜索的结果会定时回调ZDO_NetworkDiscoveryConfirmCB方法:



  • ZStatus_t ZDO_NetworkDiscoveryConfirmCB( uint8 ResultCount,



  •                                          networkDesc_t *NetworkList )



  • {



  •     //......



  • }



该方法第一个参数表示搜索到的结果,第二个参数表示一个搜索到的协调器或路由器,每次返回NetworkList可以一样,也可能不一样。NetworkList里面包含了padid等参数


6,在ZDO_NetworkDiscoveryConfirmCB方法中发出ZDO_NWK_DISC_CNF消息事件

7,在事件消息最终会调用ZDApp_ProcessOSALMsg方法:

void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )
8,在ZDApp_ProcessOSALMsg方法中,调用NLME_JoinRequest发起连接请求

9,如果连接成功后,会回调ZDO_JoinConfirmCB方法

10,在ZDO_JoinConfirmCB方法中,最终会调用ZDApp_SaveNetworkStateEvt,将网络信息写到底层和flash,下次启动的时候就会自动连接该网络


以上就是终端入网的一个大概流程。


使用特权

评论回复

相关帖子

沙发
八层楼|  楼主 | 2020-8-5 16:45 | 只看该作者

在ZDO_NetworkDiscoveryConfirmCB方法中,在发送消息之前,我们可以将消息参数设置为我们需要连接的网络,比如在该方法中增加:



  •   if(ZSTACK_END_DEVICE_BUILD)



  •   {



  •     msg.hdr.status = ZDO_SUCCESS;



  •     msg.panIdLSB = LO_UINT16( NetworkList->panId );



  •     msg.panIdMSB = HI_UINT16( NetworkList->panId );



  •     msg.logicalChannel = pNwkDesc->logicalChannel;



  •     msg.version = pNwkDesc->version;



  •     osal_cpyExtAddr( msg.extendedPANID, NetworkList->extendedPANID );



  •   }











  •   ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );




然后在处理消息的时候,再将数据取出来,如:



  •             if ( NLME_JoinRequest( ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->extendedPANID,



  •                  BUILD_UINT16( ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdLSB, ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdMSB ),



  •                  ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->logicalChannel,



  •                  ZDO_Config_Node_Descriptor.CapabilityFlags ) != ZSuccess )



  •             {







  •               ZDApp_NetworkInit( (uint16)(NWK_START_DELAY



  •                   + ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))) );



  •             }




其中msgPtr就是消息传过去的参数。这样底层返回什么协调器,终端就会什么协调器发起请求,每个协调器收到请求后,就将信息发给用户确认,用户在哪个协调器上面确认,哪个协调器就允许终端接入。


以上只是一个基本思路,由于可能连续几次返回的协调器信息一样、在实际中还要考虑每次上电后的情况、终端的低功耗等等,还需要很大程度上的修改、测试。


使用特权

评论回复
板凳
wiba| | 2020-9-2 12:44 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
地板
zljiu| | 2020-9-2 12:45 | 只看该作者
代码有些凌乱

使用特权

评论回复
5
coshi| | 2020-9-2 12:45 | 只看该作者
思路很清晰

使用特权

评论回复
6
aoyi| | 2020-9-2 12:45 | 只看该作者
楼主辛苦了

使用特权

评论回复
7
drer| | 2020-9-2 12:45 | 只看该作者
请问有详细的工程文件吗

使用特权

评论回复
8
usysm| | 2020-9-9 12:14 | 只看该作者
如果zigbee网络中存在两个协调器会怎么样

使用特权

评论回复
9
typeof| | 2020-9-9 12:14 | 只看该作者
zigbee进行广播,如果有多个接收端,发送了几次?

使用特权

评论回复
10
yujielun| | 2020-9-9 12:14 | 只看该作者
zigbee的终端节点是如何自动加入网络的?

使用特权

评论回复
11
htmlme| | 2020-9-9 12:15 | 只看该作者
智能家居解决方案wifi好还是zigbee好

使用特权

评论回复
12
pklong| | 2020-9-9 12:17 | 只看该作者
zigbee终端与协调器不绑定可以通信吗?

使用特权

评论回复
13
touser| | 2020-9-9 12:18 | 只看该作者
ZigBee协议栈如何添加多个终端节点

使用特权

评论回复
14
myiclife| | 2020-9-9 12:19 | 只看该作者
ZigBee协调器与终端节点的区别  

使用特权

评论回复
15
uytyu| | 2020-9-9 12:19 | 只看该作者
zigbee协调器和路由节点怎么布局

使用特权

评论回复
16
iyoum| | 2020-9-9 12:19 | 只看该作者
zigbee, zigbee pro与RF4CE的区别是什么?

使用特权

评论回复
17
jkl21| | 2020-9-9 12:20 | 只看该作者
在一个ZigBee网络当中,协调器起到什么角色?

使用特权

评论回复
18
htmlme| | 2020-9-9 12:20 | 只看该作者
zigbee可以在移动中通信吗

使用特权

评论回复
19
yujielun| | 2020-9-9 12:20 | 只看该作者
物联网智能设备F8914 ZigBee终端的传输特点是什么?

使用特权

评论回复
20
pklong| | 2020-9-9 12:20 | 只看该作者
如何在zigbee终端节点写入人为指定的编号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

3966

帖子

2

粉丝