zigbee技术之点对点通信.docx

上传人:b****8 文档编号:27883517 上传时间:2023-07-06 格式:DOCX 页数:16 大小:29.94KB
下载 相关 举报
zigbee技术之点对点通信.docx_第1页
第1页 / 共16页
zigbee技术之点对点通信.docx_第2页
第2页 / 共16页
zigbee技术之点对点通信.docx_第3页
第3页 / 共16页
zigbee技术之点对点通信.docx_第4页
第4页 / 共16页
zigbee技术之点对点通信.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

zigbee技术之点对点通信.docx

《zigbee技术之点对点通信.docx》由会员分享,可在线阅读,更多相关《zigbee技术之点对点通信.docx(16页珍藏版)》请在冰豆网上搜索。

zigbee技术之点对点通信.docx

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,//目标地址

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1