zigbee实验三.docx
《zigbee实验三.docx》由会员分享,可在线阅读,更多相关《zigbee实验三.docx(14页珍藏版)》请在冰点文库上搜索。
zigbee实验三
天津理工大学
计算机与通信工程学院
实验报告
2014至2015学年第一学期
课程名称
Zigbee技术
学号
20126266
学生姓名
赵鹏
年级
2012级
专业
物联网工程
教学班号
01
实验地点
7-213
实验时间
2014年12月3日第3节至第4节
主讲教师
张晓辉
辅导教师
张晓辉
实验(三)
实验名称
无线温度检测实验
软件环境
TARIDE环境,串口调试助手,samart
硬件环境
2个CC2530RF模块,电源模块,温度传感器模块
实验目的
1通过实验的学习,让传感器的数据和zigbee无线网络结合起来形成真正意义的无线传感网络。
实验内容(应包括实验题目、实验要求、实验任务等)
1.实验要求:
协调器建立Zigbee无线网络,终端节点自动加入该网络中,然后终端节点周期性地采集温度数据并将其发送给协调器,协调器收到温度数据后,通过串口将其输出到用户pc机。
实验设备
1.装有IAR和串口助手的PC机一台;
2.cc2530仿真器,usb线(A型转B型);
3.无线节点模块2块,智能主板2块,温度传感器模块。
实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)
无线温度检测试验效果图:
无线温度检测试验协调器流程图:
无线温度检测试验终端节点流程图:
实验步骤
1、将GenericApp.h删除。
按同样方法删除GenericApp.c文件。
2、单击File,在弹出的下拉菜单中选择New,然后选File。
将该文件保存为Coordinator.h,然后用同样的方法建立一个Coordinator.c和Enddevice.c文件。
3、在Coordinator.c文件中输入以下代码:
协调器:
#include"OSAL.h"
#include"AF.h"
#include"ZDApp.h"
#include"ZDObject.h"
#include"ZDProfile.h"
#include
#include"Coordinator.h"
#include"DebugTrace.h"
#if!
defined(WIN32)
#include"OnBoard.h"
#endif
#include"hal_lcd.h"
#include"hal_led.h"
#include"hal_key.h"
#include"hal_uart.h"
constcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
{
GENERICAPP_CLUSTERID
};
//简单设备描述符(描述一个ZigBee设备节点)
constSimpleDescriptionFormat_tGenericApp_SimpleDesc=
{
GENERICAPP_ENDPOINT,
GENERICAPP_PROFID,
GENERICAPP_DEVICEID,
GENERICAPP_DEVICE_VERSION,
GENERICAPP_FLAGS,
GENERICAPP_MAX_CLUSTERS,
(cId_t*)GenericApp_ClusterList,/?
?
?
?
0,
(cId_t*)NULL
};
endPointDesc_tGenericApp_epDesc;//节点描述符
byteGenericApp_TaskID;//任务优先级
byteGenericApp_TransID;//数据发送序列号。
voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);//消息处理函数
voidGenericApp_SendTheMessage(void);//数据发送函数
voidGenericApp_Init(bytetask_id)//任务初始化函数
{
halUARTCfg_tuartConfig;
GenericApp_TaskID=task_id;//初始化任务优先级(任务优先级有协议栈的操作系统OSAL分配)
GenericApp_TransID=0;//发送数据包的序号初始化为0
//对节点描述符进行初始化
GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id=&GenericApp_TaskID;
GenericApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq=noLatencyReqs;
afRegister(&GenericApp_epDesc);//afRegister()对节点的描述符进行注册。
注册后,才能使用OSAL提供的系统服务。
uartConfig.configured=true;
uartConfig.baudRate=HAL_UART_BR_115200;
uartConfig.callBackFunc=null;
uartConfig.flowControl=false;
HalUARTOpen(0,&uartConfig);
}
//消息处理函数
UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events)
{
afIncomingMSGPacket_t*MSGpkt;//MSGpkt用于指向接收消息结构体的指针
if(events&SYS_EVENT_MSG)
{
//MSGpkt=(afIncomingMSGPacket_t*)osal_msg_reveive(GenericApp_TaskID);//osal_msg_receive()从消息队列上接收消息
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
while(MSGpkt)
{
switch(MSGpkt->hdr.event)
{
caseAF_INCOMING_MSG_CMD:
//接受到新数据的消息的ID是AF_INCOMING_MSG_CMD,这个宏是在协议栈中定义好的值为0x1A
//接受到的是无线数据包
//GenericApp_MessageMSGCB(MSGpkt);//功能是完成对接受数据的处理
osal_msg_receive(task_id);
HalUARTWrite(0,buffer,10);
break;
default:
break;
}
osal_msg_deallocate((uint8*)MSGpkt);//接收到的消息处理完后,释放消息所占的存储空间
//MSGpkt=(afIncomingMSGPacket_t*)osal_msg_reveive(GenericApp_TaskID);
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
//处理完一个消息后,再从消息队列里接受消息,然后对其进行相应处理,直到所有消息处理完
}
return(events^SYS_EVENT_MSG);
}
return0;
}
voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)
{
unsignedcharbuffer[2]={0x0A,0x0D};
TEMPERTUREtemperature;
switch(pkt->clusterId)
{
caseGENERICAPP_CLUSTERID:
osal_memcpy(&temperature,pkt->cmd.Data,sizeof(temperature));
HalUARTWrite(0,(uint8*)temperature,sizeof(temperature));
HalUARTWrite(0,buffer,2);
break;
}
}
4、在workspace下面的下拉列表框中选择CoordinatorEB,然后右键单击Enddevice.c文件,在弹出的下拉菜单选择Option,选择Excludefrombuild。
5、选择工具栏上的Make按钮编译。
6、终端节点编程:
在workspace下面的下拉列表框中选择EnddeviceEB,然后右键单击Coordinator.c文件,在弹出的下拉菜单选择Option,选择Excludefrombuild。
7、在Enddevice.c文件中输入以下代码:
//Enddevice.c
#include"OSAL.h"
#include"AF.h"
#include"ZDApp.h"
#include"ZDObject.h"
#include"ZDProfile.h"
#include
#include"Coordinator.h"
#include"DebugTrace.h"
#if!
defined(WIN32)
#include"OnBoard.h"
#endif
#include"hal_lcd.h"
#include"hal_led.h"
#include"hal_key.h"
#include"hal_uart.h"
#defineSEND_DATA_EVENT0x01
constcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
{
GENERICAPP_CLUSTERID
};
constSimpleDescriptionFormat_tGenericApp_SimpleDesc=
{
GENERICAPP_ENDPOINT,
GENERICAPP_PROFID,
GENERICAPP_DEVICEID,
GENERICAPP_DEVICE_VERSION,
GENERICAPP_FLAGS,
0,
(cId_t*)NULL,
GENERICAPP_MAX_CLUSTERS,
(cId_t*)GenericApp_ClusterList
};
endPointDesc_tGenericApp_epDesc;//节点描述符
byteGenericApp_TaskID;//任务优先级
byteGenericApp_TransID;//数据发送序列号
devStates_tGenericApp_NwkState;//保存节点状态
voidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);//消息处理函数的声明
voidGenericApp_SendTheMessage(void);//数据发送函数的声明
//任务初始化函数
voidGenericApp_Init(bytetask_id)
{
GenericApp_TaskID=task_id;//初始化任务优先级
GenericApp_NwkState=DEV_INIT;//初始化为DEV_INIT,表节点没有连接到ZigBee网络
GenericApp_TransID=0;//发送数据包的序列号初始化为0
//对节点描述符进行初始化
GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id=&GenericApp_TaskID;
GenericApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq=noLatencyReqs;
//afRegister()函数将节点描述符进行注册,注册后才可以使用OSAL提供的系统服务
afRegister(&GenericApp_epDesc);
}
//消息处理函数
UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events)
{
afIncomingMSGPacket_t*MSGpkt;
if(events&SYS_EVENT_MSG)
{
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
while(MSGpkt)
{
switch(MSGpkt->hdr.event)
{
caseZDO_STATE_CHANGE:
GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//读取节点的设备类型
if(GenericApp_NwkState==DEV_END_DEVICE)
{
osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);
//GenericApp_SendTheMessage();//终端节点类型,执行无线数据发送
}
break;
default:
break;
}
osal_msg_deallocate((uint8*)MSGpkt);
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
}
return(events^SYS_EVENT_MSG);
}
if(events&SEND_DATA_EVENT)
(
GenericApp_SendTheMessage();
osal_start_timerEX(GenericApp_TaskID,SEND_DATA_EVENT,1000);
return(events^SEND_DATA_EVENT);
)
return0;
}
voidGenericApp_SendTheMessage(void)
{
//unsignedchartheMessageData[10]="edndevice";//存放发送数据
Uint8tvalue;
TEMPERTUREtemperature;
temperature.BUF.Head=‘&’;
Tvalue=readTemp;
temperature.BUF.value[0]=value/10+‘0’;
temperature.BUF.value[1]=value%10+‘0’;
temperature.BUF.Tail=‘C’;
afAddrType_tmy_DstAddr;
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//数据发送模式:
可选单播、广播、多播方式这里选Addr16Bit表单播
my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//初始化端口函
my_DstAddr.addr.shortAddr=0x0000;//标志目的地址节点的网络地址这里是协调器的地址
//下面是数据发送长度数据发送缓冲区
AF_DataRequest(&my_DstAddr,
&GenericApp_epDesc,
GENERICAPP_CLUSTERID,
Sizeof(temperature);
(uintf8*)&temperature;
&GenericApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS);
}
实例测试图:
附录(可包括源程序清单或其它说明,将核心代码给出注释)