zigbee技术之点对点通信.docx
《zigbee技术之点对点通信.docx》由会员分享,可在线阅读,更多相关《zigbee技术之点对点通信.docx(16页珍藏版)》请在冰豆网上搜索。
zigbee技术之点对点通信
zigbee技术之点对点通信
2013国培企业顶岗培训广州风标电子
zigbee研究
任务1Zigbee无线组网和点对点通信一、任务:
数据传输基本功能:
两个Zigbee节点进行点对点通信,Zigbee节点1发送“Hello”字符串,发送成功,节点上发光二极管闪烁;Zigbee节点2接收数据后,对接收数据进行判断,如果接收正确,则发光二级闪烁。
二、基础知识
Zigbee是物联网技术中应用最广泛的技术,相比WiFi、BlueTooth、GPS等技术。
Zigbee具有传输距离短、低速率、低成本、低功耗等特点。
1.短距离无线网络
短距离无线网络主要分为两类:
无线局域网(WLAN,WirelessLocalAreaNetwork),无线个域网(WPAN,WirelessPersonalAreaNetwork)
无线局域网是有线局域网的扩展。
一个无线局域网设备可以很容易地接入有线局域网。
无线个域网是为了在POS(PersonalOperatingSpace)范围内提供一种高效节能的一种通信方法,其中POS是指以无线设备为中心的半径10米内的球形区域。
无线个域网按照传输速率不同,分为三种:
HR-WPAN、MR-WPAN、LR-WPAN
分别对应三种协议为:
WPAN通信协议WPAN通信协议WPAN通信协议HR-WPAN802.15.3MR-WPANBlueToothLR-WPAN802.15.42.Zigbee与IEEE802.15.4
在设计网络的软件架构时,一般采用的思想是,不同层负责不同的功能,数据只能在相邻层之间流动。
例如,以太网分层模型是OSI七层参考模型:
应用层处理网络应用程序
表示层数据表示
会话层主机间通信
传输层端到端连接
网络层网络寻址和路由
数据链路层介质访问控制
物理层比特数据传输
Zigbee协议也是在OSI参考模型基础上,结合无线网络特点,使用分层思想实现。
如图:
1
2013国培企业顶岗培训广州风标电子
zigbee研究
Zigbee协议分层模型
Zigbee事由Zigbee联盟指定的面向低速无线个人区域网络(LR-WPAN)的双向无线通信技术指标,其物理层和数据链路层使用IEEE802.15.4标准,网络层和应用层由Zigbee联盟定义。
采用分层思想有很多优点。
例如,当网络协议的一部分发生改变时,可以很容易第对于此相关的几个层进行修改,其它层无需改变。
3.Zigbee特点
三、控制程序
1.协调器程序
/*********************************************************************
Coordinator.c是协调器端的应用程序,如果接收到终端节点的应用程序向本
设备发送“Hello”消息,则让LED2闪烁。
*********************************************************************/
/*********************************************************************
*INCLUDES包含文件
*/
#include"OSAL.h"
#include"AF.h"
#include"ZDApp.h"
#include"ZDObject.h"
#include"ZDProfile.h"
#include"Common.h"
#include"DebugTrace.h"
#if!
defined(WIN32)
#include"OnBoard.h"
#endif
/*HAL*/
2
2013国培企业顶岗培训广州风标电子
zigbee研究
#include"hal_led.h"
/*********************************************************************
*GLOBALVARIABLES全局变量
*/
//应用程序使用到的簇ID,相当于子功能列表
constcId_tMyFirstApp_ClusterList[MyFirstApp_MAX_CLUSTERS]={
MyFirstApp_CLUSTERID
};
//应用程序简单描述符
constSimpleDescriptionFormat_tMyFirstApp_SimpleDesc={
MyFirstApp_ENDPOINT,//intEndpoint;端点
MyFirstApp_PROFID,//uint16AppProfId[2];
MyFirstApp_DEVICEID,//uint16AppDeviceId[2];设备ID
MyFirstApp_DEVICE_VERSION,//intAppDevVer:
4;设备版本号
MyFirstApp_FLAGS,//intAppFlags:
4;设备标记
MyFirstApp_MAX_CLUSTERS,//byteAppNumInClusters;输入簇个数
(cId_t*)MyFirstApp_ClusterList,//byte*pAppInClusterList;输入簇列表
0,//byteAppNumInClusters;输出簇个数
(cId_t*)NULL//byte*pAppInClusterList;输出簇列表
};
//在这里定义端点/接口描述符变量,在MyFirstApp_Init()函数里面进行初始化。
endPointDesc_tMyFirstApp_epDesc;
/*********************************************************************
*LOCALVARIABLES本地变量
*/
byteMyFirstApp_TaskID;//任务ID用于处理任务和事件,在系统调用MyFirstApp_Init()时进行初始化
/*********************************************************************
*LOCALFUNCTIONS本地函数声明
*/
staticvoidMyFirstApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);
/*********************************************************************
*@函数MyFirstApp_Init
*@说明初始化任务,在系统初始化的过程中调用,所有的与应用有关的
*初始化都在这里进行(如硬件初始化,设置,数据表的初始化,
*上电通知等...).
3
2013国培企业顶岗培训广州风标电子
zigbee研究
*@参数task_id-OSAL分配的ID,在应用程序中,应该使用这个ID来发送
*消息和设置定时器.
*@返回无
*/
voidMyFirstApp_Init(uint8task_id){
MyFirstApp_TaskID=task_id;
//设备的硬件初始化可以在这里进行,也可以在main()(Zmain.c)里面进行.
//如果该硬件是与应用有关的,最后在这里进行初始化.
//如果与设备的其它方面相关,可以在main()里面进行.
//设置端点描述符.
MyFirstApp_epDesc.endPoint=MyFirstApp_ENDPOINT;
MyFirstApp_epDesc.task_id=&MyFirstApp_TaskID;
MyFirstApp_epDesc.simpleDesc
=(SimpleDescriptionFormat_t*)&MyFirstApp_SimpleDesc;
MyFirstApp_epDesc.latencyReq=noLatencyReqs;
//通过AF注册端点描述符
afRegister(&MyFirstApp_epDesc);
}
/*********************************************************************
*@函数MyFirstApp_ProcessEvent
*@说明任务事件处理函数,用于处理传递给本任务的所有事件,包括定时器,
*消息和其它用户定义的事件。
*@参数task_id-OSAL分配的任务ID.
*events-要处理的事件,每一位都代表一个事件,可以同时包含多个事件
*@返回无
*/
uint16MyFirstApp_ProcessEvent(uint8task_id,uint16events)
{
afIncomingMSGPacket_t*MSGpkt;
if(events&SYS_EVENT_MSG){
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(MyFirstApp_TaskID);
while(MSGpkt){
switch(MSGpkt->hdr.event){
caseAF_INCOMING_MSG_CMD:
//收到数据包消息
MyFirstApp_MessageMSGCB(MSGpkt);
break;
default:
4
2013国培企业顶岗培训广州风标电子
zigbee研究
break;
}
//释放内存
osal_msg_deallocate((uint8*)MSGpkt);
//Next
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(MyFirstApp_TaskID);
}
//返回未处理的事件
return(events^SYS_EVENT_MSG);
}
//丢弃未定义事件
return0;
}
/*********************************************************************
*@函数MyFirstApp_MessageMSGCB
*@说明消息处理回调函数,用于处理所的接收到的数据,有可能是从另一
*个设备发送过来的指令,可以根据簇ID来判断需要执行的子功能。
*@参数pkt-消息数据包
*@返回无
*/
staticvoidMyFirstApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)
{
unsignedcharbuffer[5];
switch(pkt->clusterId){
caseMyFirstApp_CLUSTERID:
osal_memcpy(buffer,pkt->cmd.Data,5);
if(buffer[0]=='H'&&
buffer[1]=='e'&&
buffer[2]=='l'&&
buffer[3]=='l'&&
buffer[4]=='o'){
//接收到正确消息,让LED1闪烁一次
HalLedBlink(HAL_LED_1,1,50,500);
}else{
//接收到错误消息,让LED2不停闪烁
HalLedBlink(HAL_LED_2,0,50,500);
}
break;
5
2013国培企业顶岗培训广州风标电子
zigbee研究
}
}
/*********************************************************************
*/
2.终端节点程序
/*********************************************************************
EndDevice.c是终端设备端的应用程序,主要功能是向协调器发送“Hello”消息。
*********************************************************************/
/*********************************************************************
*INCLUDES包含文件
*/
#include"OSAL.h"
#include"AF.h"
#include"ZDApp.h"
#include"ZDObject.h"
#include"ZDProfile.h"
#include"Common.h"
#include"DebugTrace.h"
#if!
defined(WIN32)
#include"OnBoard.h"
#endif
/*HAL*/
#include"hal_led.h"
/*********************************************************************
*GLOBALVARIABLES全局变量
*/
//应用程序使用到的簇ID,相当于子功能列表
constcId_tMyFirstApp_ClusterList[MyFirstApp_MAX_CLUSTERS]={
MyFirstApp_CLUSTERID
};
//应用程序简单描述符
constSimpleDescriptionFormat_tMyFirstApp_SimpleDesc={
MyFirstApp_ENDPOINT,//intEndpoint;端点
MyFirstApp_PROFID,//uint16AppProfId[2];
MyFirstApp_DEVICEID,//uint16AppDeviceId[2];设备ID
6
2013国培企业顶岗培训广州风标电子
zigbee研究
MyFirstApp_DEVICE_VERSION,//intAppDevVer:
4;设备版本号
MyFirstApp_FLAGS,//intAppFlags:
4;设备标记
0,//byteAppNumInClusters;输入簇个数
(cId_t*)NULL,//byte*pAppInClusterList;输入簇列表
MyFirstApp_MAX_CLUSTERS,//byteAppNumInClusters;输出簇个数
(cId_t*)MyFirstApp_ClusterList//byte*pAppInClusterList;输出簇列表};
//在这里定义端点/接口描述符变量,在MyFirstApp_Init()函数里面进行初始化。
endPointDesc_tMyFirstApp_epDesc;
/*********************************************************************
*LOCALVARIABLES本地变量
*/
byteMyFirstApp_TaskID;//任务ID用于处理任务和事件,在系统调用MyFirstApp_Init()
时进行初始化
devStates_tMyFirstApp_NwkState;//保存设备当前的网络状态
byteMyFirstApp_TransID;//唯一的消息ID(计数器)
afAddrType_tMyFirstApp_DstAddr;//保存目标地址
/*********************************************************************
*LOCALFUNCTIONS本地函数声明
*/
staticvoidMyFirstApp_SendTheMessage(void);
/*********************************************************************
*@函数MyFirstApp_Init
*@说明初始化任务,在系统初始化的过程中调用,所有的与应用有关的
*初始化都在这里进行(如硬件初始化,设置,数据表的初始化,
*上电通知等...).
*@参数task_id-OSAL分配的ID,在应用程序中,应该使用这个ID来发送
*消息和设置定时器.
*@返回无
*/
voidMyFirstApp_Init(uint8task_id){
MyFirstApp_TaskID=task_id;
MyFirstApp_NwkState=DEV_INIT;
MyFirstApp_TransID=0;
7
2013国培企业顶岗培训广州风标电子
zigbee研究
//设备的硬件初始化可以在这里进行,也可以在main()(Zmain.c)里面进行.
//如果该硬件是与应用有关的,最后在这里进行初始化.
//如果与设备的其它方面相关,可以在main()里面进行.
MyFirstApp_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;
MyFirstApp_DstAddr.endPoint=MyFirstApp_ENDPOINT;
MyFirstApp_DstAddr.addr.shortAddr=0;
//设置端点描述符.
MyFirstApp_epDesc.endPoint=MyFirstApp_ENDPOINT;
MyFirstApp_epDesc.task_id=&MyFirstApp_TaskID;
MyFirstApp_epDesc.simpleDesc
=(SimpleDescriptionFormat_t*)&MyFirstApp_SimpleDesc;
MyFirstApp_epDesc.latencyReq=noLatencyReqs;
//通过AF注册端点描述符
afRegister(&MyFirstApp_epDesc);
}
/*********************************************************************
*@函数MyFirstApp_ProcessEvent
*@说明任务事件处理函数,用于处理传递给本任务的所有事件,包括定时器,
*消息和其它用户定义的事件。
*@参数task_id-OSAL分配的任务ID.
*events-要处理的事件,每一位都代表一个事件,可以同时包含多个事件
*@返回无
*/
uint16MyFirstApp_ProcessEvent(uint8task_id,uint16events){
afIncomingMSGPacket_t*MSGpkt;
if(events&SYS_EVENT_MSG){
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(MyFirstApp_TaskID);
while(MSGpkt){
switch(MSGpkt->hdr.event){
caseZDO_STATE_CHANGE:
//ZDO状态改变消息
MyFirstApp_NwkState=(devStates_t)(MSGpkt->hdr.status);
if(MyFirstApp_NwkState==DEV_END_DEVICE){
//开始定时发送数据
osal_start_timerEx(MyFirstApp_TaskID,
MyFirstApp_SEND_MSG_EVT,
MyFirstApp_SEND_MSG_TIMEOUT);
}
break;
8
2013国培企业顶岗培训广州风标电子
zigbee研究
default:
break;
}
//释放内存
osal_msg_deallocate((uint8*)MSGpkt);
//Next
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(MyFirstApp_TaskID);
}
//返回未处理的事件
return(events^SYS_EVENT_MSG);
}
//发送数据定时器事件
//(第一次的定时器事件是在上面的ZDO_STATE_CHANGE事件中设置的).
if(events&MyFirstApp_SEND_MSG_EVT){
//发送消息给另一个设备
MyFirstApp_SendTheMessage();
//设置定时器,用于再次发送
osal_start_timerEx(MyFirstApp_TaskID,
MyFirstApp_SEND_MSG_EVT,
MyFirstApp_SEND_MSG_TIMEOUT);
//返回未处理的事件
return(events^MyFirstApp_SEND_MSG_EVT);
}
//丢弃未定义事件
return0;
}
/*********************************************************************
*@函数MyFirstApp_SendTheMessage
*@说明发送消息.
*@参数无
*@返回无
*/
staticvoidMyFirstApp_SendTheMessage(void){
chartheMessageData[]="Hello";
9
2013国培企业顶岗培训广州风标电子
zigbee研究
if(AF_DataRequest(&MyFirstApp_DstAddr,//目标地址