zigbee学习笔记3-通信例程之GenericApp

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

zigbee学习笔记3-通信例程之GenericApp

2011-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 endpoint

dstAddr.addrMode = Addr16Bit;

dstAddr.addr.shortAddr = 0x0000; // Coordinator

ZDP_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_DstAddr

typedef struct

{

union

{

uint16 shortAddr;

} addr;

afAddrMode_t addrMode;

byte endPoint;

} afAddrType_t;//--里面定义了目标地址模式、地址、EP三个参数

2、端点描述符:&GenericApp_epDesc

typedef 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 1

4、发送数据

数据长度:(byte)osal_strlen( theMessageData ) + 1,

相关文档
最新文档