浅析ZigBee的应用层开发之终端结点
2017-08-16 16:51
225 查看
终端节点在zigbee的开发中,主要有两个功能
<1>将采集到的信息发送给协调器(coordinator)
<2>接受协调器发送过来的命令,并执行
以sample app为例,简单的广播方式传送信息为例
当运行程序,操作系统启动,注册好应用层ID后,开始任务轮询。
<1>
在函数 uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )中会完成应用层调用函数的所有处理函数
并且设置广播传送的时间间隔
#define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 2000 //两秒广播一次
并通过函数启动循环广播
[cpp] view
plain copy
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message
SampleApp_SendPeriodicMessage();
// Setup to send message again in normal period (+ a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
// return unprocessed events
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
因此可以以相同的方式,给终端route开启循环采集数据
[cpp] view
plain copy
void SampleApp_SendPeriodicMessage( void )
{
//采集信息process
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID,
length,
array[],
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
此时协调器则会收到终端采集到的信息,2秒更新一次
<2>当协调器通过广播的形式发送来命令时,终端只要判定是不是给自己的命令,是则执行,否则跳过
接受到信息则会调用该处理函数
[cpp] view
plain copy
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
switch ( pkt->clusterId ) //判断标识
{
case SAMPLEAPP_PERIODIC_CLUSTERID: //与上面的那个发送标识对应
if(pkt->cmd.Data[0]==0) //判断发来的命令
{
LED=0; //是发给我的,灯泡亮
}
break;
......................................................
此时已经可以开发基本的小项目了,比如说多个传感器采集农田的信息,发送给协调器,协调器通过网络把数据传到你的网页上,在线观看。还可以把命令反馈回去,控制终端结点上的继电器等等改善环境。
<1>将采集到的信息发送给协调器(coordinator)
<2>接受协调器发送过来的命令,并执行
以sample app为例,简单的广播方式传送信息为例
当运行程序,操作系统启动,注册好应用层ID后,开始任务轮询。
<1>
在函数 uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )中会完成应用层调用函数的所有处理函数
并且设置广播传送的时间间隔
#define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 2000 //两秒广播一次
并通过函数启动循环广播
[cpp] view
plain copy
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message
SampleApp_SendPeriodicMessage();
// Setup to send message again in normal period (+ a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
// return unprocessed events
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
因此可以以相同的方式,给终端route开启循环采集数据
[cpp] view
plain copy
void SampleApp_SendPeriodicMessage( void )
{
//采集信息process
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID,
length,
array[],
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
此时协调器则会收到终端采集到的信息,2秒更新一次
<2>当协调器通过广播的形式发送来命令时,终端只要判定是不是给自己的命令,是则执行,否则跳过
接受到信息则会调用该处理函数
[cpp] view
plain copy
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
switch ( pkt->clusterId ) //判断标识
{
case SAMPLEAPP_PERIODIC_CLUSTERID: //与上面的那个发送标识对应
if(pkt->cmd.Data[0]==0) //判断发来的命令
{
LED=0; //是发给我的,灯泡亮
}
break;
......................................................
此时已经可以开发基本的小项目了,比如说多个传感器采集农田的信息,发送给协调器,协调器通过网络把数据传到你的网页上,在线观看。还可以把命令反馈回去,控制终端结点上的继电器等等改善环境。
相关文章推荐
- 浅析ZigBee的应用层开发之终端结点
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- Ionic开发跨终端应用——基础入门
- Android开发:实时处理摄像头预览帧视频--浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- 如何应用Session开发非Web终端,原理(无代码)
- 如何应用Session开发非Web终端
- 浅析HTML5在移动应用开发中的使用
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- Unix/Linux C++应用开发-远程终端软件使用
- 精选文摘 浅析HTML5在移动应用开发中的使用
- Android开发:实时处理摄像头预览帧视频------浅析PreviewCallback,onPreviewFrame,AsyncTask的综合应用
- 浅析HTML5在移动应用开发中的使用
- 动态调节ZigBee终端节点POLL频率的应用
- Android应用开发Scroller详解及源码浅析
- 应用开发的结构浅析----一个基于Proxy-Stub模式的例子
- 浅析iOS应用开发中线程间的通信与线程安全问题
- p3插件式应用开发框架浅析(一)
- 浅析HTML5在移动应用开发中的使用
- 应用层通信协议开发浅析