sentTransID = afDataConfirm->transID;
任何AF_DataRequest()数据请求函数调用后,都通过AF_DATA_CONFIRM_CMD系统事件信息回叫返回成功Zsuccess。 case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); if ( (SampleApp_NwkState == DEV_ZB_COORD) ||(SampleApp_NwkState == DEV_ROUTER) ||(SampleApp_NwkState == DEV_END_DEVICE) ) {
// Update the LCD’s network indicator
// Start sending \osal_start_timer( SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); } break;
这里就是前面介绍的设备状态改变事件处理了。
只要网络状态发生改变,那么通过ZDO_STATE_CHANGE事件通知所有的任务。注意:在这个例子中,一旦设备成功加入网络,是通过定时运行的方式运行的。一旦网络状态为加入”JOINED”,那么它可能不需要任何的认为操作就能绑定其他设备,因为设置为自动发现并绑定的。
// Release the memory
osal_msg_deallocate( (uint8 *)MSGpkt ); 释放存储空间。
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) {
// Send \
SampleApp_SendPeriodicMessage(); // Setup to send message again
osal_start_timer( SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_MSG_TIMEOUT ); // return unprocessed events
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); }
这里检测事件是否为周期发送信息事件。 在SampleApp.h中定义了:
#define SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0x0001
在这个应用中,调用了osal_start_timer()函数来定时产生发送周期信息事件。而定时器的运行是设备一旦加入网络就不停的在运行。从上面可以看到,用函数
SampleApp_SendPeriodicMessage()发送周期信息,而用函数
osal_start_timer( SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_MSG_TIMEOUT )来继续运行定时器定时发送这个周期信息。关于这个osal_start_timer可以多了解下,第一个参数 SAMPLEAPP_SEND_PERIODIC_MSG_EVT四信息时间,也就是事件到了产生一个什么事件。第二各参数 SAMPLEAPP_SEND_MSG_TIMEOUT是需要定时的时间,这里就是发送周期信息的时间周期。 1.3、消息流程
通过OSAL定时器,这个应用定时发送一个周期信息: void SampleApp_SendPeriodicMessage( void ) {
afAddrType_t dstAddr;
dstAddr. addrMode = afAddrBroadcast;
dstAddr.addr.shortAddr = 0xFFFF; // 广播发送 dstAddr. endpoint = SAMPLEAPP_ENDPOINT;
if ( AF_DataRequest( & dstAddr, &SampleApp_epDesc, SAMPLEAPP_PERIODIC_CLUSTERID, (uint8)sampleAppPeriodicCounter++, (uint8 *)&sampleAppPeriodCounter, &SampleApp_TransID, AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {
// Successfully requested to be sent.----发送成功处理 } else {
// Error occurred in request to send.---发送失败处理 } }
在这里调用了AF_DataRequest()函数用来发送数据。关于发送数据的具体过程这里就不做深入研究,不外乎就是把数据从应用层传到网络层,在传到 MAC,在传到无力层,最后通过OTA发送出去。接收数据就是相反的过程了,那么接收之后,在应用层有什么反应呢,最直观的反应就是会发送一个 AF_INCOMING_MSG_CMD消息事件。 case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt ); break;
这里表示收到某个信息,然后在里面调用了收到信息的信息处理函数SampleApp_MessageMSGCB( MSGpkt )。
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) {
switch ( pkt->clusterId ) {
case SAMPLEAPP_PERIODIC_CLUSTERID:
// Display and increment a counter on the LCD in the periodic space break;
case SAMPLEAPP_FLASH_CLUSTERID:
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] ); HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) ); break; } }
这里判断了两种信息: 周期信息 闪灯信息
不同的信息就相当于收到了不同的命令,然后根据不同的命令做出了不同的处理。是个会写程序都明白!!!!
到这里,我就基本上把这个应用文档看完了,至于理解了多少我迷糊,理解正确了多少我更加迷糊,反正我按照我自己的方式理解了!
从零开始学Z-Stack之5(2009-03-23 20:20:13) 标签:it
分类:WSN学习
前面虽然写了不少,但是回头看看大多都是废话,不过也没办法,没有废话的润色就太枯燥了,太技术化了,这个不是我的本意。不知道前面写的怎么样,技术含量肯定是不高的。这个本人是相当清楚,但是我最大的期望就是错误不要太多!
突然想起来前面有个问题没有解决,我想很多人看到那里都很郁闷的。就是设备类型的选择,在TI原装系统上是通过板载跳线来选择的,但是我这里不是采用原装,那么就需要通过程序来修改其设备类型,然后编译下载。具体程序段如下:
#if defined ( SOFT_START ) if ( readCoordinatorJumper() )
zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; else
zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER; #endif // SOFT_START
这里有个条件编译,其条件编译设置如图5-1。
图5-1
既然这里设置了SOFT_START,那么上段程序就要被编译。那么第一句程序 if ( readCoordinatorJumper() )
就是检测跳线,其实稍微知道编程的都了解怎么修改了,哈哈! 屏蔽:
if ( readCoordinatorJumper() )
zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; else
这3句,那么就只剩下:zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;了 那么编译自然该设备就为路由器了。简单吧!!!!??! 协调器我就不想多说怎么做了哈!!!!!!!!!!!!
还有一个问题需要说下,就是Ti原装的EM板子用到了LCD,所以在程序中可能在某个地方要对LCD初始化,那么如果没有液晶的板子或者与TI那个不完全一样的LCD就有可能运行不走,通俗的解决办法是禁止LCD初始化等操作,Ti在这个方面做的很人性化,禁止LCD功能没有必要在程序中找到LCD相关程序删除,而是仅仅需要通过条件编译来禁止。显得相当简单,如5-2图就是禁止LCD的条件编译。
图5-2
解决这个问题后一般都能够运行程序了。也就是说到这里如果还把Demo程序运行不起来的话,那就证明我所有的东西都白写了,反正我到这里我的Demo程序已经运行如飞了。 那么接下来就是来看看Z-Stack具体的一些东西了,我打算先这样看起:
1、Z-Stack的结构,因为打开Z-Stack的目录可以看出还是比较复杂的,只有比较清楚了解其结构之后呢,在程序运行或者修改中才能顺利的找到自己想要的部分。
2、Z-Stack的应用建立。就是怎么在TI提供的协议(裸协议)上建立一个应用。这个层次要求就比较高了,我初步的设想是希望能分析完SAMPLE例子的应用就能自己建立,而不需要太多的去了解下层的协议。但是往往希望与现实是有偏差的,走一步算一步了。 3、了解硬件相关设定、驱动。也就是说把例子跑通了,毕竟是基于TI的硬件,或者说基于开发系统的硬件,如果要做自己的应用,那么必须要开发自己的硬件。怎么把自己的硬件驱动加入协议,这个我想也是需要解决的问题。
4、接下来可能就要深入分析协议了,这个目前我还不清楚从什么地方看起,因为毕竟对ZI