Z-STACK的一些小内容

 这段工作期间,要和ZIGBEE打交道,其实以前也参与到一些Project中,或多或少的接触了ZIGBEE。对TI的Z-Stack也有了一些初步的了解,其实我个人对Z-Stack没有太多的热情,感觉这样写代码,让我看起来有点费力,当然这是我写代码的经验尚浅。闲话不多说了,Project要为软件做测试,但是需要组建千奇百怪的网络出来以便于调试。所以不能直接使用Z-STACK的默认配置,要自己主动去更改网络的结构。这就要了解节点的入网过程。

Z-Stack的代码看起来十分的繁杂,但是个人认为主线只有一条,那就是状态机。Z-Stack从整体上来讲就是一个大的状态机,OSAL就是这个状态机的驱动泵,而各个层(mac,nwk,aps)是一个小型的状态机,它们由OSAL来驱动。在ZIGBEE协议里,一个业务是由多个状态来组合完成的,也就是说,从理解业务的角度上来说,需要先了解这个业务的状态转移过程,才能了解业务的流程。

  笔者大概的看了看Z-stack的代码,入网过程的流程似乎经历了以下的过程;

1.uint8 ZDOInitDevice( uint16 startDelay )
2.void ZDApp_NetworkInit( uint16 delay )
3.void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder )
4.NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC );
5.ZStatus_t ZDO_NetworkDiscoveryConfirmCB(uint8 status);
6.Zstatus_t NLME_JointRequest(uint8*,uint16,uint8 channel, uint8 CapabilityFlags,uint16 chosenParent, uint8 parentDepth );
7.void ZDO_JoinConfirmCB( uint16 PanId, ZStatus_t Status );

再来看,在这些函数中,有些什么状态在流转着,搜索工程后发现,一直在标示网络状态变化的是一个叫devState的枚举变量,它枚举以下的内容

/*********************************************************************
* TYPEDEFS
*/
typedef enum
{
DEV_HOLD, // Initialized - not started automatically
DEV_INIT, // Initialized - not connected to anything
DEV_NWK_DISC, // Discovering PAN's to join
DEV_NWK_JOINING, // Joining a PAN
DEV_NWK_REJOIN, // ReJoining a PAN, only for end devices
DEV_END_DEVICE_UNAUTH, // Joined but not yet authenticated by trust center
DEV_END_DEVICE, // Started as device after authentication
DEV_ROUTER, // Device joined, authenticated and is a router
DEV_COORD_STARTING, // Started as Zigbee Coordinator
DEV_ZB_COORD, // Started as Zigbee Coordinator
DEV_NWK_ORPHAN // Device has lost information about its parent..
} devStates_t;

 

这也能看出他们的状态转移是遵循以下的规律的:

 有了这个状态图,我们便可以根据状态图的路线走。也可以在图中看出,节点加入网络是在DEV_NWK_DISC之后启动了节点的入网流程,因此若需要更改节点的入网流程,可以在DEV_NWK_DISC之后有选择性的加入到网络中去。而这一步,则恰好对应着ZDAPP任务里的ZDO_NWK_DISC_CNF事件中。

 

 

 

posted @ 2013-06-15 21:52  stonecastle  阅读(646)  评论(0编辑  收藏  举报