const uint16 Cyril3AppCoordManage_ClusterList[CYRIL3APPMANAGE_MAX_CLUSTERS] = {
CYRIL3APPMANAGE_ CLUSTERID
};
endPointDesc_t Cyril3AppCoordManage_epDesc;
const SimpleDescriptionFormat_t Cyril3AppCoordManage_SimpleDesc = {
CYRIL3APPMANAGE_ENDPOINT, CYRIL3APPMANAGE_PROFID,
CYRIL3APPMANAGE_DEVICEID,
CYRIL3APPMANAGE_DEVICE_VERSION,
CYRIL3APPMANAGE_FLAGS,
CYRIL3APPMANAGE_MAX_CLUSTERS,
(uint16 *)Cyril3AppCoordManage_ClusterList,
CYRIL3APPMANAGE_MAX_CLUSTERS,
(uint16 *)Cyril3AppCoordManage_ClusterList
};
Cyril3AppCoordManage_ClusterList保存了一个簇ID的列表?所有有关于此任务的簇都需要在此
定义。
Cyril3AppCoordManage_epDesc是此任务的端点描述?它定义了此任务作为ZigBee应用程序对
象的所有信息?我们将会在初始化函数中为它赋值。然后将他注册到应用程序框架中。
Cyril3AppCoordManage_SimpleDesc是此任务的简单描述?它保存了此任务的一些基本信息。具
体赋值我不再赘述。
在任务初始化函数中?我们为端点描述赋值?并且注册到应用程序框架中。
Cyril3AppCoordManage_epDesc.endPoint = CYRIL3APPMANAGE_ENDPOINT;
Cyril3AppCoordManage_epDesc.task_id = &Cyril3AppCoordManage_TaskID;
Cyril3AppCoordManage_epDesc.simpleDesc= (SimpleDescriptionFormat_t
*)&Cyril3AppCoordManage_SimpleDesc;
Cyril3AppCoordManage_epDesc.latencyReq = noLatencyReqs;
afRegister( &Cyril3AppCoordManage_epDesc );
这样?我们的任务就顺利地作为ZigBee应用程序对象被加入到了应用程序框架中。这意味着我们可
以处理来自网络层的消息了。
五、处理消息
下面?我们来试图实现这样一个功能:当设备加入网络之后?点亮一个LED灯?表示该节点成功加入
网络?并处于就绪状态。
当设备成功加入网络以后?ZigBee设备对象(ZDO)会给所有已经在应用程序框架中注册过的任务
(也就是作为ZigBee的应用程序对象存在的任务)发送一个“ZDO_STATE_CHANGE”消息?消息的状
态指示了当前网络的状态。我们可以通过处理此消息时点亮LED等来实现这个功能。
当一个消息被发送给任务时?“SYS_EVENT_MSG”事件会被传递给任务。“SYS_EVENT_MSG”这个
事件通知任务有一个消息等待处理。所以?我们必须添加对于“SYS_EVENT_MSG”这个事件的响应?然
后从消息队列中取出消息?判断此消息是否为“ZDO_STATE_CHANGE”。在处理
“ZDO_STATE_CHANGE”消息时点亮LED灯。
在Cyril3AppCoordManage.c中我们定义如下全局变量:
devStates_t Cyril3AppCoordManage_NwkState=DEV_INIT;
Cyril3AppCoordManage_NwkState保存了当前节点的网络状态?我们将他初始化为“未加入网 络”。
在Cyril3AppCoordManage_ProcessEvent函数中?我们添加如下代码:
if ( events & SYS_EVENT_MSG )
{
afIncomingMSGPacket_t *MSGpkt;
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( Cyril3AppManage_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
case ZDO_STATE_CHANGE:
Cyril3AppCoordManage_NwkState = (devStates_t)MSGpkt->hdr.status;
if ( Cyril3AppCoordManage_NwkState == DEV_ZB_COORD )
{
HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );
HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );
HalLedSet ( HAL_LED_3, HAL_LED_MODE_OFF );
Cyril3AppCoordManage_ProcessZDOStateChange(
(devStates_t)
MSGpkt->hdr.status);
}
break;
default:
break;
}
osal_msg_deallocate( (uint8 *)MSGpkt );
MSGpkt = (afIncomingMSGPacket_t
*)osal_msg_receive( Cyril3AppManage_TaskID );
}
return (events ^ SYS_EVENT_MSG);
}
osal_msg_receive获取消息队列上相应任务的消息。osal_msg_deallocate释放消息所在的消息
缓冲区?回收内存资源。
还是在Cyril3AppCoordManage.c中我们添加
Cyril3AppCoordManage_ProcessZDOStateChange函数:
void Cyril3AppCoordManage_ProcessZDOStateChange(devStates_t state) {
HalLedSet( HAL_LED_1, HAL_LED_MODE_ON ); }