目 录
【题目】 ....................................................... - 2 - 一、题目要求 ................................................ - 2 - 二、平台要求 ................................................ - 2 - 【摘要】 ....................................................... - 2 - 【关键字】 ..................................................... - 3 - 【正文】 ....................................................... - 3 - 一、实验分析及框架设计 ...................................... - 3 - 1、实验分析 .............................................. - 3 - 2、逻辑框架 .............................................. - 4 - 二、实验设计以及实验步骤 .................................... - 5 - (1):协调器: ........................................... - 6 - (2)终端: .............................................. - 8 - 三、运行调试 ............................................... - 11 - 【实验总结】 .................................................. - 13 - 【参考文献】 .................................................. - 13 - 【教学建议】 .................................................. - 13 -
word文档 下载后可任意复制编辑
【题目】
一、题目要求
1. 以本学期授课内容为基础,在J9-C501实验室的博创实验箱上完成如下要求:
a、由协调器创建一个网络,PANID末三位为个人学号的末三位。 b、以实验箱的1号ZigBee模块为基础,加入前述网络,完成采集温度信息的过程,并发送给协调器;
c、以红外对射传感器模块为基础,加入前述网络,完成相关信息的采集并发送给协调器; d、括上述两个ZogBee模块在内,至少组织8个ZigBee模块加入前述ZigBee网络,获取各自节点的网络地址,并发送给协调器;
e、器通过串口和PC上位机进行联系,将收集到的传感器信息和网络地址信息发送给上位机
f、各节点网络地址信息进行网络拓扑分析;
2. 以上述过程为基础,撰写课程设计论文。
3.对本学期该课程学习的总结和对教师的教学建议。
二、平台要求
1:PC机上安装串口助手,PC的串口与博创物联网试验箱的串口连接好; 2:CC2530上运行zigbee2007协议栈。
【摘要】
本实验主要实现的是终端节点采集自己的网络地址,父节点的网络地址以及传感器
的数据,发送到协调器上,协调器再通过串口与PC相连接,在PC上通过串口助手向串口发送“gantaoaddr1”可显示当前的网络地址信息,再串口上输入“duanleidata”可显示温度和湿度,在带有干簧门磁开关终端节点的当有磁性物质时,PC上的串口助手会显示“SWITCH1Warning!”;在霍尔开关开关当有磁性物质时,PC上的串口助手会显示“SWITCH2Warning!”。
实验使用的数据结构的定义包括 uint8 type[3]; uint8 myNWK[4]; uint8 pNWK[4]; char mdata[14]; char ID; 终端节点采集地址信息放到myNWK[4]; pNWK[4];里面,采集的数据信息放到mdata[14];里面,自身的设备号放到ID里面。将
word文档 下载后可任意复制编辑
该数据结构通过无线射频发给协调器,协调器通过对设备号的匹配,选择执行相应的函数。
【关键字】
Zigbee 2007协议栈 串口 红外对射 温湿度传感器 协调器
【正文】
一、实验分析及框架设计 1、实验分析
本实验需要实现终端节点采集地址信息和与终端节点相连接的传感器的信息发送到协调器上面,协调器再将这些信息发送到串口上。
word文档 下载后可任意复制编辑
2、逻辑框架
(协调器)
(终端)
word文档 下载后可任意复制编辑
二、实验设计以及实验步骤
在Coordinator.h完成数据结构定义: typedef struct RFTXBUF {
uint8 type[3]; uint8 myNWK[4]; uint8 pNWK[4]; char mdata[14]; char ID; }RFTX;
其中的uint8 type[3]; 存放模块的类型
uint8 myNWK[4];存放模块的当前网络地址 uint8 pNWK[4];存放模块的父节点网络地址 char mdata[14];存放数据信息; char ID; 存放设备号
word文档 下载后可任意复制编辑
其中的设备号ID主要是方便后面的协调器的信息处理时选择执行处理函数 mdata里面主要采集终端的一些数据整个数据结构包含26个字节。
(1):协调器:
主要函数的定义:
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt ); 信息反馈函数
static void rxCB(uint8 port,uint8 event); 串口的回调函数,主要实现的是当在串口输入“gantaoaddr1”时,串口显示当前的网络地址信息,当输入“duanleidata”时,串口显示温度湿度信息。 主要函数分析:
1:在void GenericApp_Init( byte task_id )完成串口的配置(波特率为115200),设置回调函数为reXB:
halUARTCfg_t uartConfig; uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_115200; uartConfig.flowControl = FALSE; uartConfig.callBackFunc = rxCB; HalUARTOpen(0,&uartConfig);
2:在UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )函数里面,当事件为AF_INCOMING_MSG_CMD: 执行GenericApp_MessageMSGCB( MSGpkt ); case AF_INCOMING_MSG_CMD:
GenericApp_MessageMSGCB( MSGpkt ); break;
3:在void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )函数里面,主要完成协调器对接受到的数据进行处理:
A: 将从终端接受到的数据放到结构体数组nodeinfo[5]里面;
word文档 下载后可任意复制编辑
B: 匹配设备号(温湿度的设备号ID = ‘1’ ,干簧门磁/霍尔开关的设备号为ID = ‘4’), 当ID = ‘1’时,将从终端接受到的数据包的温度放到Temp[7],将湿度放到char Humi[7]; 当ID = ‘4’时,将从终端接受的数据包的中断信息放到char ganhuang[1]; char huoer[1]; 并执行相应的动作反馈,当终端的干簧门磁检测到有磁性物质时,与协
调器相连的串口上会显示“SWITCH1Warning!”; 当终端的霍尔开关检测到磁性物质时,与协调器相连的串口上会显示“SWITCH2Warning!”
if((thisid - '0') == 1)
{
for(i = 0; i < 7; i++) {
Temp[i] = mybuf.mdata[i]; Humi[i] = mybuf.mdata[i+7]; } }
if((thisid - '0') == 4) {
ganhuang[0] = mybuf.mdata[0]; huoer[0] = mybuf.mdata [1];
if((ganhuang[0] - '0') == 1) {
HalUARTWrite(0,\" SWITCH1 Warning!! \ }
if((ganhuang[1] - '0') == 1) {
HalUARTWrite(0,\" SWITCH2 Warning!! \ } }
4:在回调函数 static void rxCB(uint8 port,uint8 event)里面
当在PC上在串口助手输入是“gantaoaddr1”时,串口显示当前的网络地址信息,当输入“duanleidata”时,串口显示温度湿度信息。
static void rxCB(uint8 port,uint8 event) {
unsigned char changeline[2]={0x0A,0x0D}; uint8 buf[11]; int i;
word文档 下载后可任意复制编辑
HalUARTRead(0,buf,11);
if(osal_memcmp(buf,\"gantaoaddr1\ / {
for(i=0; i<5; i++) {
HalUARTWrite(0,nodeinfo[i].type,3); HalUARTWrite(0,\" NWK: \
HalUARTWrite(0,nodeinfo[i].myNWK,4); HalUARTWrite(0,\" pNWK: \
HalUARTWrite(0,nodeinfo[i].pNWK,4); } }
if(osal_memcmp(buf,\"duanleidata\ {
HalUARTWrite(0,\"the message is from NWK: \ HalUARTWrite(0,nodeinfo[0].myNWK,4); HalUARTWrite(0,changeline,2); HalUARTWrite(0,\" Temp: \ HalUARTWrite(0,Temp,7); HalUARTWrite(0,\" Humi: \ HalUARTWrite(0,Humi,7); } }
(2)终端:
主要函数定义:
void GenericApp_SendTheMessage( void ); 发送函数
void To_string(uint8 *dest, char *src, uint8 length); 字符转换 void Delay(uint n); 延时
void InitIrda(void); 初始化终端 void LedInit(void); l ed灯的初始化 RFTX rftx; 定义了一个结构体变量
void GenericApp_Init( byte task_id ) 应用层初始化
#pragma vector = P1INT_VECTOR 中断服务程序的申明 __interrupt void P1_ISR(void);
主要函数分析:
1:在void GenericApp_Init( byte task_id )完成协议栈应用层的初始化, Sht11Init( ); 完成温湿度传感器的初始化, rftx.mdata[0] = '0'; 初始化数据包的第一个字节为’0’; rftx.mdata[1] = '0'; 初始化数据包的第二个字节为’0’; LedInit(); 完成LED灯初始化。
word文档 下载后可任意复制编辑
2:在UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )里面,当终端节点的网络状态,及连接上协调器后,周期(1s一次)会执行GenericApp_SendTheMessage();函数。
if((GenericApp_NwkState==DEV_ROUTER)||(GenericApp_NwkState==DEV_END_DEVICE)) {
osal_start_timerEx(GenericApp_TaskID, GENERICAPP_SEND_MSG_EVT,
GENERICAPP_SEND_MSG_TIMEOUT ); }
if ( events & GENERICAPP_SEND_MSG_EVT ) {
// Send \"the\" message
GenericApp_SendTheMessage();
osal_start_timerEx( GenericApp_TaskID,
GENERICAPP_SEND_MSG_EVT,
GENERICAPP_SEND_MSG_TIMEOUT ); return (events ^ GENERICAPP_SEND_MSG_EVT); } 3:在void GenericApp_SendTheMessage( void )函数里面,会采集终端节点当前的网络号和父节点的网络号, 如果是温湿度传感器还会采集温湿度,也有干簧门磁/霍尔开关的中断信息,采集好后放到结构体变量rftx中,发送到协调器。
void GenericApp_SendTheMessage( void ) {
//RFTX rftx; uint16 nwk; int i;
//***************************************************************************** //* 实现霍尔开关和干簧门磁开关中断信息的采集
//***************************************************************************** InitIrda( );
for(i = 0; i < 10; i++) {
Delay(5000); }
//***************************************************************************** //* 实现地址信息的采集
//*****************************************************************************
word文档 下载后可任意复制编辑
if(GenericApp_NwkState==DEV_END_DEVICE) {
osal_memcpy(rftx.type,\"END\ }
if(GenericApp_NwkState==DEV_ROUTER) {
osal_memcpy(rftx.type,\"ROU\ }
nwk=NLME_GetShortAddr(); //取本节点网络地址 To_string(rftx.myNWK,(uint8 *)&nwk,2); //16进制 nwk=NLME_GetCoordShortAddr(); //父节点地址 To_string(rftx.pNWK,(uint8 *)&nwk,2);
//***************************************************************************** //* 发送数据
//*****************************************************************************
rftx.ID = '3'; // 设定设备号ID为3
afAddrType_t my_DstAddr;
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit; my_DstAddr.endPoint=GENERICAPP_ENDPOINT; my_DstAddr.addr.shortAddr=0x0000;
AF_DataRequest(&my_DstAddr,&GenericApp_epDesc, GENERICAPP_CLUSTERID, sizeof(rftx), (uint8 *)&rftx,
&GenericApp_TransID, AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS);
rftx.mdata[0] = '0'; }
4:在终端中断服务函数#pragma vector = P1INT_VECTOR__interrupt void P1_ISR(void)里面,当干簧门磁开关传感器检测到磁性物质时,会产生一个中断,中断服务程序里面会将rftx.mdata[0] = '1'; 当霍尔开关传感器检测到磁性物质时,会产生一个中断,中断服务程序里面会将rftx.mdata[1] = '1';
#pragma vector = P1INT_VECTOR __interrupt void P1_ISR(void) {
if((P1IFG&0X04) > 0) //中断 {
P1IFG &= ~(0x0c); Delay(1000);
word文档 下载后可任意复制编辑
LED1 = !LED1;
rftx.mdata[0] = '1'; }
if((P1IFG&0X04) < 0) {
rftx.mdata[0] = '0'; }
if((P1IFG&0X08) > 0) {
P1IFG &= ~(0x0c); Delay(1000);
rftx.mdata[1] = '1'; LED1 = !LED1; }
if((P1IFG&0X08) < 0) {
rftx.mdata[1] = '0'; }
P1IF = 0; //清中断标志 }
三、运行调试
Zigbee建网成功后,在串口助手输入 “gantaoaddr1”,会在串口助手上显示 当前的网络地址信息
在串口助手上输入“duanleidata”,会在串口上显示温度和湿度
word文档 下载后可任意复制编辑
当干簧门磁开关检测到磁性物质时,串口会显示 “SWITCH1Warning”;当霍尔开关检测到磁性物质时,串口会显示 “SWITCH2Warning”。
整体效果如下:
word文档 下载后可任意复制编辑
【实验总结】
在本次实验中,以小组形式(段磊和甘涛),调试运行程序,在本次实验中通过对协调器和终端分别设计,组建网络号为1106的网络,以796F,7970,7971,7972,7973作为网络子节点号。在调试运行程序过程中,在获取网络子节点的基础之上,经过本次实验最终对于终端模块及协调器模块的调试,最终完成在终端中通过“gantaoaddr1”命令可以在zigbee网络获取本实验箱五个网络子节点号,通过“duanleidata”命令可以获取1号模块的温湿度信息,在第4个终端,当干簧门磁开关检测到磁性物质时,串口会显示 “SWITCH1Warning”;当霍尔开关检测到磁性物质时,串口会显示 “SWITCH2Warning”。
经验总结: 1:要完成多个终端与协调器通信,特别是要完成协调器收集终端传感器发送上来的数据,完成不同的处理,可以采用通过设备号标示的方法,吧每个终端节点标示一个设备号ID,再在协调器上匹配设备号,完成相应的处理函数,要完成这一点就需要在整个实验的框架设计时,定义好自己数据包的数据结构,同时在开发中多注意模块化开发,制定统一的标准,方便以后添加硬件。
2:在协调器筛选出信息,在串口助手上可以打印数据包(即定义的数据结构),来查看信息是否符合自己的设计和调试查错。
【参考文献】
李文仲 《Zigbee 无线网络技术入门与实战》 北京航天航空大学出版社
【教学建议】
索老师这样的教学模式(在实验室讲解理论,后开展相应的实验)很好,这样我们可以比较深刻的理解教学内容。我觉得应该多配合实验室做一些理论知识的讲解那就更好了。
因篇幅问题不能全部显示,请点此查看更多更全内容