zigbee技术之点对点通信

发布时间:2024-11-02

物联网之Zigbee技术。

任务1 Zigbee无线组网和点对点通信

一、任务:数据传输基本功能:两个Zigbee节点进行点对点通信,Zigbee节点1发送“Hello”字符串,发送成功,节点上发光二极管闪烁;Zigbee 节点2接收数据后,对接收数据进行判断,如果接收正确,则发光二级闪烁。 二、基础知识

Zigbee是物联网技术中应用最广泛的技术,相比WiFi、BlueTooth、GPS等技术。Zigbee具有传输距离短、低速率、低成本、低功耗等特点。 1.短距离无线网络

短距离无线网络主要分为两类:

无线局域网(WLAN,Wireless Local Area Network) 无线个域网(WPAN,Wireless Personal Area Network)

无线局域网是有线局域网的扩展。一个无线局域网设备可以很容易地接入有线局域网。 无线个域网是为了在POS(Personal Operating Space)范围内提供一种高效节能的一种通信方法,其中POS是指以无线设备为中心的半径10米内的球形区域。

无线个域网按照传输速率不同,分为三种: HR-WPAN、MR-WPAN、LR-WPAN 分别对应三种协议为:

2.Zigbee与IEEE802.15.4

在设计网络的软件架构时,一般采用的思想是,不同层负责不同的功能,数据只能在相邻层之间流动。例如,以太网分层模型是OSI七层参考模型:

Zigbee协议也是在OSI参考模型基础上,结合无线网络特点,使用分层思想实现。如图:

物联网之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 */

物联网之Zigbee技术。

#include "hal_led.h"

/********************************************************************* * GLOBAL VARIABLES 全局变量 */

// 应用程序使用到的簇ID,相当于子功能列表

const cId_t MyFirstApp_ClusterList[MyFirstApp_MAX_CLUSTERS] = {

MyFirstApp_CLUSTERID };

// 应用程序简单描述符

const SimpleDescriptionFormat_t MyFirstApp_SimpleDesc = {

MyFirstApp_ENDPOINT, // int Endpoint;端点 MyFirstApp_PROFID, // uint16 AppProfId[2];

MyFirstApp_DEVICEID, // uint16 AppDeviceId[2];设备ID MyFirstApp_DEVICE_VERSION, // int AppDevVer:4;设备版本号 MyFirstApp_FLAGS, // int AppFlags:4;设备标记

MyFirstApp_MAX_CLUSTERS, // byte AppNumInClusters;输入簇个数 (cId_t *)MyFirstApp_ClusterList, // byte *pAppInClusterList;输入簇列表

0, // byte AppNumInClusters;输出簇个数 (cId_t *)NULL // byte *pAppInClusterList;输出簇列表 };

// 在这里定义端点/接口描述符变量,在MyFirstApp_Init()函数里面进行初始化。 endPointDesc_t MyFirstApp_epDesc;

/********************************************************************* * LOCAL VARIABLES 本地变量 */

byte MyFirstApp_TaskID; // 任务ID用于处理任务和事件,在系统调用MyFirstApp_Init()时进行初始化

/********************************************************************* * LOCAL FUNCTIONS 本地函数声明 */

static void MyFirstApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );

/********************************************************************* * @函数 MyFirstApp_Init

* @说明 初始化任务,在系统初始化的过程中调用,所有的与应用有关的 * 初始化都在这里进行(如硬件初始化,设置,数据表的初始化, * 上电通知等... ).

物联网之Zigbee技术。

* @参数 task_id - OSAL分配的ID,在应用程序中,应该使用这个ID来发送 * 消息和设置定时器. * @返回 无 */

void MyFirstApp_Init( uint8 task_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_http://tencyReq = noLatencyReqs;

// 通过AF注册端点描述符

afRegister( &MyFirstApp_epDesc ); }

/********************************************************************* * @函数 MyFirstApp_ProcessEvent

* @说明 任务事件处理函数,用于处理传递给本任务的所有事件,包括定时器, * 消息和其它用户定义的事件。 * @参数 task_id - OSAL分配的任务ID.

* events - 要处理的事件,每一位都代表一个事件,可以同时包含多个事件 * @返回 无 */

uint16 MyFirstApp_ProcessEvent( uint8 task_id, uint16 events ) {

afIncomingMSGPacket_t *MSGpkt;

if ( events & SYS_EVENT_MSG ) {

MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( MyFirstApp_TaskID ); while ( MSGpkt ) {

switch ( MSGpkt->hdr.event ) {

case AF_INCOMING_MSG_CMD: // 收到数据包消息 MyFirstApp_MessageMSGCB( MSGpkt ); break;

default:

物联网之Zigbee技术。

break; }

// 释放内存

osal_msg_deallocate( (uint8 *)MSGpkt );

// Next

MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( MyFirstApp_TaskID ); }

// 返回未处理的事件

return (events ^ SYS_EVENT_MSG); }

// 丢弃未定义事件 return 0; }

/********************************************************************* * @函数 MyFirstApp_MessageMSGCB

* @说明 消息处理回调函数,用于处理所的接收到的数据,有可能是从另一 * 个设备发送过来的指令,可以根据簇ID来判断需要执行的子功能。 * @参数 pkt - 消息数据包 * @返回 无 */

static void MyFirstApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) {

unsigned char buffer[5];

switch ( pkt->clusterId ) {

case MyFirstApp_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;

物联网之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"

/********************************************************************* * GLOBAL VARIABLES 全局变量 */

// 应用程序使用到的簇ID,相当于子功能列表

const cId_t MyFirstApp_ClusterList[MyFirstApp_MAX_CLUSTERS] = {

MyFirstApp_CLUSTERID };

// 应用程序简单描述符

const SimpleDescriptionFormat_t MyFirstApp_SimpleDesc = {

MyFirstApp_ENDPOINT, // int Endpoint;端点 MyFirstApp_PROFID, // uint16 AppProfId[2];

MyFirstApp_DEVICEID, // uint16 AppDeviceId[2];设备ID

物联网之Zigbee技术。

MyFirstApp_DEVICE_VERSION, // int AppDevVer:4;设备版本号 MyFirstApp_FLAGS, // int AppFlags:4;设备标记

0, // byte AppNumInClusters;输入簇个数 (cId_t *)NULL, // byte *pAppInClusterList;输入簇列表

MyFirstApp_MAX_CLUSTERS, // byte AppNumInClusters;输出簇个数 (cId_t *)MyFirstApp_ClusterList // byte *pAppInClusterList;输出簇列表 };

// 在这里定义端点/接口描述符变量,在MyFirstApp_Init()函数里面进行初始化。 endPointDesc_t MyFirstApp_epDesc;

/********************************************************************* * LOCAL VARIABLES 本地变量 */

byte MyFirstApp_TaskID; // 任务ID用于处理任务和事件,在系统调用MyFirstApp_Init()时进行初始化

devStates_t MyFirstApp_NwkState; // 保存设备当前的网络状态

byte MyFirstApp_TransID; // 唯一的消息ID(计数器)

afAddrType_t MyFirstApp_DstAddr; // 保存目标地址

/********************************************************************* * LOCAL FUNCTIONS 本地函数声明 */

static void MyFirstApp_SendTheMessage( void );

/********************************************************************* * @函数 MyFirstApp_Init

* @说明 初始化任务,在系统初始化的过程中调用,所有的与应用有关的 * 初始化都在这里进行(如硬件初始化,设置,数据表的初始化, * 上电通知等... ).

* @参数 task_id - OSAL分配的ID,在应用程序中,应该使用这个ID来发送 * 消息和设置定时器. * @返回 无 */

void MyFirstApp_Init( uint8 task_id ) {

MyFirstApp_TaskID = task_id;

MyFirstApp_NwkState = DEV_INIT; MyFirstApp_TransID = 0;

物联网之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_http://tencyReq = noLatencyReqs;

// 通过AF注册端点描述符

afRegister( &MyFirstApp_epDesc ); }

/********************************************************************* * @函数 MyFirstApp_ProcessEvent

* @说明 任务事件处理函数,用于处理传递给本任务的所有事件,包括定时器, * 消息和其它用户定义的事件。 * @参数 task_id - OSAL分配的任务ID.

* events - 要处理的事件,每一位都代表一个事件,可以同时包含多个事件 * @返回 无 */

uint16 MyFirstApp_ProcessEvent( uint8 task_id, uint16 events ) {

afIncomingMSGPacket_t *MSGpkt;

if ( events & SYS_EVENT_MSG ) {

MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( MyFirstApp_TaskID ); while ( MSGpkt ) {

switch ( MSGpkt->hdr.event ) {

case ZDO_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;

物联网之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); }

// 丢弃未定义事件 return 0; }

/********************************************************************* * @函数 MyFirstApp_SendTheMessage * @说明 发送消息. * @参数 无 * @返回 无 */

static void MyFirstApp_SendTheMessage( void ) {

char theMessageData[] = "Hello";

物联网之Zigbee技术。

if ( AF_DataRequest( &MyFirstApp_DstAddr, //目标地址

&MyFirstApp_epDesc, //源端点描述符 MyFirstApp_CLUSTERID,//簇ID

(byte)osal_strlen( theMessageData ) + 1,//数据长度 (byte *)&theMessageData,//发送的数据指针 &MyFirstApp_TransID,//会话ID AF_DISCV_ROUTE, //发送参数

AF_DEFAULT_RADIUS ) //发送范围,通常指路由跳数 == afStatus_SUCCESS ) { // 发送成功

HalLedBlink ( HAL_LED_1, 1, 50, 500 ); // LED1闪烁一次表示发送成功 } else {

// 发送出错

HalLedBlink ( HAL_LED_2, 0, 50, 500 ); // LED2不停闪烁表示发送失败 } }

/********************************************************************* */

zigbee技术之点对点通信.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219