我们知道协调器(coordinator)和终端节点(enddevice)是通过不同的工程区分的,但我们发现两个工程包含的文件又大致相同。那协议栈中如何判断设备的类型并进行相应的操作呢?
首先带大家认识一个全局变量zgDeviceLogicalType,他就是设备逻辑类型。这个变量位于ZGlobals.c文件中,他是协议栈中的一个全局变量,我们用户不需要修改。到这里我们可能想到他的值是什么,那就确定了该设备的类型。那我们go to define跟踪一下DEVICE_LOGICAL_TYPE这个宏。
发现协议栈是根据ZG_BUILD_COORDINATOR_TYPE、ZG_BUILD_RTR_TYPE、ZG_BUILD_ENDDEVICE_TYPE这三个宏来决定DEVICE_LOGICAL_TYPE。
那ZG_BUILD_COORDINATOR_TYPE、ZG_BUILD_RTR_TYPE、ZG_BUILD_ENDDEVICE_TYPE分别又是什么呢?从下图我们可以发现当定义了ZDO_COORDINATOR设备就是协调器,定义了RTR_NWK设备就是路由,如果前两者均未定义则设备为终端设备。
ZDO_COORDINATOR和RTR_NWK是何时被定义的呢?我们来看下边的图,我们发现不同的工程会包含不同的文件,协调器工程包含f8wCoord.cfg、路由器工程包含f8wRouter.cfg、终端设备工程包含f8wEndev.cfg。
我们发现f8wCoord.cfg中有Coordinator Settings:-DZDO_COORDINATOR -DRTR_NWK,f8wRouter.cfg中有Router Settings:-DRTR_NWK,f8wEndev.cfg中没有相关的配置。到这里我们已经知道了协议栈是如何通过配置文件来配置设备类型了。