协议栈如何辨别设备类型?
在上图中可以看到协调器建立网络的步骤以及路由器和终端加入网络的过程,但协议栈究竟如何区分设备类型,仅从图中无法看出。
在ZDApp.c文件中, ZDOInitDevice( uint16 startDelay )函数调用了ZDAppDetermineDeviceType()函数,函数原型:
/********************************************************************* * @fn ZDAppDetermineDeviceType() * @brief Determines the type of device to start. *
* Looks at zgDeviceLogicalType and determines what type of * device to start. The types are: * ZG_DEVICETYPE_COORDINATOR * ZG_DEVICETYPE_ROUTER * ZG_DEVICETYPE_ENDDEVICE *
* @param none * @return none */
void ZDAppDetermineDeviceType( void ) {
if ( zgDeviceLogicalType == ZG_DEVICETYPE_COORDINATOR ) {
devStartMode = MODE_HARD; // Start as a coordinator
ZDO_Config_Node_Descriptor.LogicalType NODETYPE_COORDINATOR; } else {
if ( zgDeviceLogicalType == ZG_DEVICETYPE_ROUTER )
=
ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_ROUTER; else if ( zgDeviceLogicalType == ZG_DEVICETYPE_ENDDEVICE ) ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_DEVICE;
// If AIB_apsUseExtendedPANID is set to a non-zero value by commissioning
// The device shall do rejoin the network. Otherwise, do normal join if ( nwk_ExtPANIDValid( AIB_apsUseExtendedPANID ) == false ) {
devStartMode = MODE_JOIN; // Assume joining } else
{
devStartMode = MODE_REJOIN; } }
} 该
函
数
中
的
关
键
句
是
if(zgDeviceLogicalType
==
ZG_DEVICETYPE_COORDINATOR) ,其中,在ZGlobals,c文件中有如下定义:zgDeviceLogicalType = DEVICE_LOGICAL_TYPE 而在ZGlobals.h文件中有如下宏定义:#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_COORDINATOR,最终在sapi.h文件中,出现如下宏定义: #define ZG_DEVICETYPE_COORDINATOR 0x00 ,这样看来似乎绕了一圈又绕回了原点,其实并非如此,在ZGlobals.h文件中完整的宏定义代码: // Default Device Logical Type
#if !defined ( DEVICE_LOGICAL_TYPE ) #if ( ZG_BUILD_COORDINATOR_TYPE ) // If capable, default to coordinator
#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_COORDINATOR #elif ( ZG_BUILD_RTR_TYPE )
#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_ROUTER #elif ( ZG_BUILD_ENDDEVICE_TYPE ) // Must be an end device
#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_ENDDEVICE #else
#error ZSTACK_DEVICE_BUILD must be defined as something! #endif #endif
相关推荐: