当前位置:首页 >> 互联网 >>

zigbee网络建立与加入_图文

协议栈如何辨别设备类型?

在上图中可以看到协调器建立网络的步骤以及路由器和终端加入网络的过 程,但协议栈究竟如何区分设备类型,仅从图中无法看出。 在 ZDApp.c 文件中, ZDOInitDevice( uint16 startDelay ) 函数调用了 ZDAppDetermineDeviceType()函数,函数原型: /********************************************************************* * @fn * @brief * * * * * * * * @param * @return */ void ZDAppDetermineDeviceType( void ) { if ( zgDeviceLogicalType == ZG_DEVICETYPE_COORDINATOR ) { devStartMode = MODE_HARD; // Start as a coordinator none none Looks at zgDeviceLogicalType and determines what type of device to start. The types are: ZG_DEVICETYPE_COORDINATOR ZG_DEVICETYPE_ROUTER ZG_DEVICETYPE_ENDDEVICE ZDAppDetermineDeviceType() Determines the type of device to start.

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; } else { devStartMode = MODE_REJOIN; } } // Assume joining

} 该 函 数 中 的 关 键 句 是 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

可以看出,设备是协调器,路由器还是终端,都是在这里区别开来的。区别 的关键就变成了条件编译语句中的判断条件(高亮显示的三个语句),还是该头 文件下,有以下条件编译: // Setup to work with the existing (old) compile flags #if !defined ( ZSTACK_DEVICE_BUILD ) #if defined ( ZDO_COORDINATOR ) #define ZSTACK_DEVICE_BUILD (DEVICE_BUILD_COORDINATOR) #elif defined ( RTR_NWK ) #define ZSTACK_DEVICE_BUILD (DEVICE_BUILD_ROUTER) #else #define ZSTACK_DEVICE_BUILD (DEVICE_BUILD_ENDDEVICE) #endif #endif // Use the following to macros to make device type decisions #define ZG_BUILD_COORDINATOR_TYPE DEVICE_BUILD_COORDINATOR) #define ZG_BUILD_RTR_TYPE (ZSTACK_DEVICE_BUILD & (ZSTACK_DEVICE_BUILD &

(DEVICE_BUILD_COORDINATOR | DEVICE_BUILD_ROUTER)) #define ZG_BUILD_ENDDEVICE_TYPE DEVICE_BUILD_ENDDEVICE) #define ZG_BUILD_RTRONLY_TYPE DEVICE_BUILD_ROUTER) (ZSTACK_DEVICE_BUILD == (ZSTACK_DEVICE_BUILD &

#define ZG_BUILD_JOINING_TYPE

(ZSTACK_DEVICE_BUILD &

(DEVICE_BUILD_ROUTER | DEVICE_BUILD_ENDDEVICE))

#if ( ZSTACK_DEVICE_BUILD == DEVICE_BUILD_COORDINATOR ) #define ZG_DEVICE_COORDINATOR_TYPE 1 #else #define ZG_DEVICE_COORDINATOR_TYPE (zgDeviceLogicalType == ZG_DEVICETYPE_COORDINATOR) #endif

#if

(

ZSTACK_DEVICE_BUILD

==

(DEVICE_BUILD_ROUTER

|

DEVICE_BUILD_COORDINATOR) ) #define ZG_DEVICE_RTR_TYPE 1 #else #define ZG_DEVICE_RTR_TYPE || ((zgDeviceLogicalType (zgDeviceLogicalType == ==

ZG_DEVICETYPE_COORDINATOR) ZG_DEVICETYPE_ROUTER)) #endif

#if ( ZSTACK_DEVICE_BUILD == DEVICE_BUILD_ENDDEVICE ) #define ZG_DEVICE_ENDDEVICE_TYPE 1 #else

#define

ZG_DEVICE_ENDDEVICE_TYPE

(zgDeviceLogicalType

==

ZG_DEVICETYPE_ENDDEVICE) #endif

#define ZG_DEVICE_JOINING_TYPE ZG_DEVICETYPE_ROUTER) ZG_DEVICETYPE_ENDDEVICE)) ||

((zgDeviceLogicalType == (zgDeviceLogicalType ==

#if ( ZG_BUILD_RTR_TYPE ) #if ( ZG_BUILD_ENDDEVICE_TYPE ) #define ZSTACK_ROUTER_BUILD ZG_DEVICE_RTR_TYPE) #else #define ZSTACK_ROUTER_BUILD #endif #else #define ZSTACK_ROUTER_BUILD #endif 0 1 (ZG_BUILD_RTR_TYPE &&

#if ( ZG_BUILD_ENDDEVICE_TYPE ) #if ( ZG_BUILD_RTR_TYPE ) #define ZSTACK_END_DEVICE_BUILD

(ZG_BUILD_ENDDEVICE_TYPE && ZG_DEVICE_ENDDEVICE_TYPE) #else #define ZSTACK_END_DEVICE_BUILD #endif #else #define ZSTACK_END_DEVICE_BUILD #endif 可以看到该段代码的解释 Use the following to macros to make device type decisions,使用下列宏来决定设备类型。其实,整个文件都是一些宏定义和条 件编译语句,都是涉及如何区别设备类型,但鉴于代码太难读,又是初学,所以 无法再往下分析了。 总 之 , ZDOInitDevice( uint16 startDelay ) 函 数 调 用 0 1

ZDAppDetermineDeviceType()函数之后就已经确定了设备类型。

今天发现,设备类型的最终定义在 Tools 文件下的三个配置文件中,

图1 在 f8wCoord.cfg、 f8wEndev.cfg 和 f8wRouter.cfg 三个配置文件中分别定义 了协调器、路由器和终端各自所具有的的功能。协调器中有: /* Coordinator Settings */

-DZDO_COORDINATOR -DRTR_NWK 路由器: /* Router Settings */ -DRTR_NWK

// Coordinator Functions // Router Functions

// Router Functions

终端配置文件中则没有相应代码。同时,我们发现在上文绿色底纹代码段中涉及 ZDO_COORDINATOR 的。 f8wCoord.cfg、 f8wEndev.cfg、 f8wRouter.cfg: 各类型设备具体的编译选项, 由 Workspace 下拉菜单中的选项决定使用那一个,从而区分出设备类型。若要 给某一个设备类型的所有项目增加编译选项, 简单在链接文件中适当位置增加一 行,若要关闭某一编译选项,可在一行的左边放置"//"来注释掉。 另外,在 下拉框中,当 RTR_NWK 等常量,正是在上述三个配置文件中定义

我们选择一种设备类型后,其他类型设备的配置文件就会变灰。如我们选择了 CoordinatorEB,Tools 文件夹就如图 1 所示,也就是说我们在下拉框中选择设 备类型后,协议栈会据此来判断设备类型。 最后,设备启动涉及到 HOLD_AUTO_START、SOFT_START 和

自 动 启 动 模 式 , 不 同 的 模 式 会 选 择 不 同 的 配 置 文 件 f8wCoord.cfg 、
f8wEndev.cfg、f8wRouter.cfg 进行编译,详见《网络设备启动》