zigbee学习笔记3-通信例程之GenericApp2011-09-22 11:02刚入手的朋友,对Z-Stack 非常迷糊的时期,如果能够跑通几个例子、看几个演示,那么可以大大提高学习兴趣;另外如果知道某个例子的大致功能及实现,那么在去看具体实现过程目的性就非常明确。
首先来看看TI 究竟有哪些例子:可以看出其例子是非常丰富的。
GenericApp(设备互相绑定传送信息-hellow world),Location(定位),SampleApp(设备发送和接收LED灯信息),SimpleApp(温度和灯开关,和智能家居结合使用的,have Profile),HomeAutomation(智能家居的应用,have Profile),SerialApp(串行传输的应用),Transmit(发送应用),ZLOAD(协议文件夹中只有Source)。
这样看来还是不少的。
其中SampleApp 例子已经在前面的学习中有所涉及,可以说前面的所有学习都是基于这个例子的,所以这里就不测试它了。
Location 是定位的测试例子,这里我的硬件是不够的,所以也不做测试。
其他我都做点测试,能成功的就成功,不能成功的就失败,这个我也没办法。
1、GenericApp这个实验是两个模块相互绑定后可以对传数据,模块绑定之后,两个模块之间相互传输字符串"Hello World"。
实验说明:首先启动一个网络协调器,协调器如果建立网络成功后,会在LCD 上显示该节点为协调者同时显示网络ID号。
然后打开一个终端节点或路由器的电源,此时节点会自动加入网络。
加入网络成功后,节点会显示自己的节点类型、网络地址和父节点的网络地址。
节点加入网络成功后,首先把主机模块的摇杆往右拔一下,然后把要绑定模块的RIGHT按一下,如果两边的LED4 都熄灭或是点亮后马上熄灭,表示绑定成功。
绑定成功后,两个节点就开始相互定时发送数据,并在对方的LCD屏上显示出来,发送的数据为"Hello World"。
此时如果把相互绑定模块中的left 按一下,可以发送Match Description Request命令,对方则显示Match Description Request信息。
(以上无线龙手册提供)2 关键函数分析:我开始没搞清楚,功能是个啥大约浏览了下,这个例子似乎还与设备的所以还决定看看程序来判断这个例子的功能。
绑定有关系,在key control 描述中发现//***************** Key control**************************//SW2: initiates end device binding //--初始化中断设备绑定SW4: initiates a match description request //--初始化一个匹配描述请求2.1 按建处理程序中发现:if ( keys & HAL_KEY_SW_2 ){HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );// Initiate an End Device Bind Request for the mandatory endpointdstAddr.addrMode = Addr16Bit;dstAddr.addr.shortAddr = 0x0000; // CoordinatorZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),GenericApp_epDesc.endPoint,GENERICAPP_PROFID,GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList, FALSE );}很明显这里按键2(右键)是发送绑定请求的命令。
if ( keys & HAL_KEY_SW_4 ){HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );// Initiate a Match Deion Request (Service Discovery)dstAddr.addrMode = AddrBroadcast;dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR, GENERICAPP_PROFID,GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,FALSE );}显然按键4(左)是初始化一个匹配描述符请求,也就是发现服务,或者叫自动寻求匹配设备。
2.2在发送数据发现:void GenericApp_SendTheMessage( void ){char theMessageData[] = "Hello World";if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,GENERICAPP_CLUSTERID,(byte)osal_strlen( theMessageData ) + 1,(byte *)&theMessageData, &GenericApp_TransID,AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ){// Successfully requested to be sent.}else{// Error occurred in request to send.}}这里发送了"Hello World"字符串。
如果更改这里,是可以在接收端看到变化的。
这里调用了AF_DataRequest 函数,该函数为AF层请求发送数据函数。
afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,uint16 cID, uint16 len, uint8 *buf, uint8 *transID,uint8 options, uint8 radius )我想最关心的就是几个参数:1、目标地址:&GenericApp_DstAddrtypedef struct{union{uint16 shortAddr;} addr;afAddrMode_t addrMode;byte endPoint;} afAddrType_t;//--里面定义了目标地址模式、地址、EP三个参数2、端点描述符:&GenericApp_epDesctypedef struct{byte endPoint;byte *task_id; // Pointer to location of the Application task ID.SimpleDescriptionFormat_t *simpleDesc;afNetworkLatencyReq_t latencyReq;} endPointDesc_t;3、串ID#define GENERICAPP_CLUSTERID 14、发送数据数据长度:(byte)osal_strlen( theMessageData ) + 1,数据载荷:(byte *)&theMessageData,5、发送ID:&GenericApp_TransID6、选项:AF_DISCV_ROUTE#define AF_DISCV_ROUTE 0x207、发送半径:AF_DEFAULT_RADIUS#define AF_DEFAULT_RADIUS DEF_NWK_RADIUS网络路由深度,初始化为:#define DEF_NWK_RADIUS 102.3 接收处理函数发现:void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) ///接收处理函数{switch ( pkt->clusterId ){case GENERICAPP_CLUSTERID:// "the" message#if defined( LCD_SUPPORTED )// HalLcdWriteScreen( (char*)pkt->cmd.Data, "rcvd" );Print8(HAL_LCD_LINE_2,10," ", 1);Print8(HAL_LCD_LINE_3,10," ", 1);Print8(HAL_LCD_LINE_2,10,(INT8U*)pkt->cmd.Data, 1);Print8(HAL_LCD_LINE_3,16, "WXL Welcome", 1);break;#endif}}接收数据处理函数里居然要通过液晶显示,本人这里的液晶暂时没有移植过来,因为暂时还不具备那个实力,怪不得看不到发送数据的状况!这里本人就自作聪明的把以前SampleApp 例子里面的一句话加过来了:void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //--修改的哦{switch ( pkt->clusterId ){case GENERICAPP_CLUSTERID:// "the" messageHalLedBlink( HAL_LED_4, 4, 50, (500) );#if defined( LCD_SUPPORTED )HalLcdWriteScreen( (char*)pkt->cmd.Data, "rcvd" );#elif defined( WIN32 )WPRINTSTR( pkt->cmd.Data );#endifbreak;}}麽想到啊,这么一加居然就有反应了!其实这里很简单的了,就是接收到数据后闪烁4 下灯,间隔0.5S。