zigbee终端向多个协调器发起请求的思路(终端入网流程分析)
2017-03-16 11:06
344 查看
一个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方法:
该方法第一个参数表示搜索到的结果,第二个参数表示一个搜索到的协调器或路由器,每次返回NetworkList可以一样,也可能不一样。NetworkList里面包含了padid等参数
6,在ZDO_NetworkDiscoveryConfirmCB方法中发出ZDO_NWK_DISC_CNF消息事件
7,在事件消息最终会调用ZDApp_ProcessOSALMsg方法:
8,在ZDApp_ProcessOSALMsg方法中,调用NLME_JoinRequest发起连接请求
9,如果连接成功后,会回调ZDO_JoinConfirmCB方法
10,在ZDO_JoinConfirmCB方法中,最终会调用ZDApp_SaveNetworkStateEvt,将网络信息写到底层和flash,下次启动的时候就会自动连接该网络
以上就是终端入网的一个大概流程。
在ZDO_NetworkDiscoveryConfirmCB方法中,在发送消息之前,我们可以将消息参数设置为我们需要连接的网络,比如在该方法中增加:
然后在处理消息的时候,再将数据取出来,如:
其中msgPtr就是消息传过去的参数。这样底层返回什么协调器,终端就会什么协调器发起请求,每个协调器收到请求后,就将信息发给用户确认,用户在哪个协调器上面确认,哪个协调器就允许终端接入。
以上只是一个基本思路,由于可能连续几次返回的协调器信息一样、在实际中还要考虑每次上电后的情况、终端的低功耗等等,还需要很大程度上的修改、测试。
先简单的谈一下终端的入网流程(相关代码自己去看源码):
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,下次启动的时候就会自动连接该网络
以上就是终端入网的一个大概流程。
在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就是消息传过去的参数。这样底层返回什么协调器,终端就会什么协调器发起请求,每个协调器收到请求后,就将信息发给用户确认,用户在哪个协调器上面确认,哪个协调器就允许终端接入。
以上只是一个基本思路,由于可能连续几次返回的协调器信息一样、在实际中还要考虑每次上电后的情况、终端的低功耗等等,还需要很大程度上的修改、测试。
相关文章推荐
- ZigBee终端直接入网(Direct Join)方式分析
- Zigbee设备入网流程分析(关联方式)
- Yii请求处理流程分析
- Zend framework处理一个http请求的流程分析
- struts2 处理请求流程分析(结合源码)1
- 非常好的Struts2请求处理流程及源码分析(强烈推荐!)
- Struts2请求处理流程及源码分析
- div+css在思路和流程上实现结构与表现的分离分析
- Struts2请求处理流程及源码分析
- Struts2请求处理流程及源码分析
- Struts2请求处理流程及源码分析
- Struts2请求处理流程及源码分析
- Struts2源码粗略分析三:请求处理流程分析
- Struts2请求处理流程及源码分析
- Struts2请求处理流程及源码分析
- 穆利堂推荐:软件行业销售指引流程---客户内部分析思路指引
- Zend framework处理一个http请求的流程分析
- Struts2请求处理流程及源码分析
- Struts2请求处理流程及源码分析
- struts2 处理请求流程分析(结合源码)3