终端节点在zigbee的开发中,主要有两个功能
<1>将采集到的信息发送给协调器(coordinator)
<2>接受协调器发送过来的命令,并执行
以sample app为例,简单的广播方式传送信息为例
当运行程序,操作系统启动,注册好应用层ID后,开始任务轮询。
<1>
在函数 uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )中会完成应用层调用函数的所有处理函数
并且设置广播传送的时间间隔
#define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 2000 //两秒广播一次
并通过函数启动循环广播
- if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
- {
-
- SampleApp_SendPeriodicMessage();
-
-
- osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
- (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
-
-
- return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
- }
因此可以以相同的方式,给终端route开启循环采集数据
- void SampleApp_SendPeriodicMessage( void )
- {
-
-
-
- if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
- SAMPLEAPP_PERIODIC_CLUSTERID,
- length,
- array[],
- &SampleApp_TransID,
- AF_DISCV_ROUTE,
- AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
- {
- }
- else
- {
-
- }
- }
此时协调器则会收到终端采集到的信息,2秒更新一次
<2>当协调器通过广播的形式发送来命令时,终端只要判定是不是给自己的命令,是则执行,否则跳过
接受到信息则会调用该处理函数
- void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
- {
-
- switch ( pkt->clusterId )
- {
- case SAMPLEAPP_PERIODIC_CLUSTERID:
-
- if(pkt->cmd.Data[0]==0)
- {
- LED=0;
- }
- break;
-
......................................................
此时已经可以开发基本的小项目了,比如说多个传感器采集农田的信息,发送给协调器,协调器通过网络把数据传到你的网页上,在线观看。还可以把命令反馈回去,控制终端结点上的继电器等等改善环境。