ZigBee无线传感器网络拓朴结构获取实验.docx
《ZigBee无线传感器网络拓朴结构获取实验.docx》由会员分享,可在线阅读,更多相关《ZigBee无线传感器网络拓朴结构获取实验.docx(13页珍藏版)》请在冰豆网上搜索。
![ZigBee无线传感器网络拓朴结构获取实验.docx](https://file1.bdocx.com/fileroot1/2022-10/24/2076e5cc-5b49-4666-9f3d-543574d31ae3/2076e5cc-5b49-4666-9f3d-543574d31ae31.gif)
ZigBee无线传感器网络拓朴结构获取实验
实验报告
(201/201学年第学期)
实验名称
ZigBee无线传感器网络获取网络拓扑结构实验
实验时间
2015年11月-2015年12月
指导单位
计算机学院
指导教师
李洋
学生姓名
张智超
班级学号
B14040923
学院(系)
计算机学院
专业
软件工程
实验报告
实验名称
ZigBee无线传感器网络获取网络拓扑结构实验
指导教师
李洋
实验类型
自行设计(科研型)
实验学时
16
实验时间
2015.11-2015.12
一、实验目的和要求
1.实验目的
了解网络地址的分配方法,掌握获取节点地址的方法,掌握无线传感器网络的拓扑结构。
2.实验内容
(一)设计指标:
1、编写程序建立无线传感器网络;
2、编写程序将自身的网络地址以及父节点网络地址发送给协调器;
3、编写程序实现串口控制命令;
4、编写程序将各个节点的网络地址以及父节点的网络地址显示在PC机上;
(二)实验要求:
1、设计不同拓扑结构的无线传感器网络;
2、设计串口回调函数实现串口对网络控制;
3、设计网络地址获取程序;
4、设计各个节点的数据处理函数;
5、设计协调节点与上位机的串口通信程序;
二、实验环境(实验设备)
硬件:
PC机,CC2530传感器,IAR开发环境
三、实验架构和原理及实验步骤:
1.实验原理
(1)ZigBee按照网络节点功能划分可分为终端节点(ep)、路由器节点(rp)和协调器节点(cp)3种。
其中,协调器(coordinator)是整个网络的核心,主要作用是启动网络,其方法是选择一个相对空闲的信道,形成一个PANID。
协助建立网络中的安全层及处理应用层的绑定。
当整个网络启动和配置完成之后,它的功能退化成一个协调器。
路由器(router)主要功能是提供接力作用,能扩展信号的传输范围,因此一般情况下他应该一直处于活动状态,不应休眠。
终端节点(end-device)加入已建立的网络即可,终端节点不具有网络维护功能。
(2)ZigBee无线传感器网络组网过程包括两个步骤:
主节点举起网络和子节点申请加入网络。
采用的是分布式分配机制:
协调器在建立网络之后使用0x0000作为自己的网络地址。
在路由器和终端加入网络以后,设备会自动给他分配16位的网络地址。
(3)获取拓扑结构的大致思路为:
(4)可能用到的函数
uint16NLME_GetShortAddr(void)
该函数返回该节点的网络地址
byte*NLME_GetExtAddr(void)
获取设备自身IEEE地址
uint16NLME_GetCoordShortAddr(void)
获取父设备网络地址
voidNLME_GetCoordExtAddr(byte*buf)
获取父设备IEEE地址
3.实验步骤:
(1)修改PAN_id。
网络编号,用于区分不同的ZigBee网络。
在文件f8wConfig.cfg中找到
-DZDAPP_CONFIG_PAN_ID=0xFFFF,将0xFFFF修改为本组编号0x2008。
(2)获取当前节点代码的网络地址以及其父节点的网络地址的代码
staticvoidBroadcast_SendBackMessage()
{
unsignedchar*theMessageData,s[200];
uint16i=0,n=0;
uint16mod=0;
uint16FaAdd,a;
if(Broadcast_NwkState==DEV_END_DEVICE)
{
unsignedchars1[10],s2[10];//存储当前节点以及父节点的地址
FaAdd=NLME_GetCoordShortAddr();//获取十进制的父节点地址
a=NLME_GetShortAddr();//十进制的当前节点地址
strcpy(s,"END_DEVICE:
");
while(a)//将当前节点地址转化为字符串
{
mod=a%16;
if(mod<=9)
*(s1+i)=mod+'0';
else
*(s1+i)=mod+55;
i++;
a/=16;
}
s1[i]='\0';
n=strlen(s1);
if(n<=3)
strcat(s1,"0");
for(i=0;i{
chart;
t=s1[i];
s1[i]=s1[n-1-i];
s1[n-1-i]=t;
}
strcat(s,s1);
i=0;
if(!
FaAdd)//将父节点地址转化为字符串
{
strcpy(s2,"0000");
i=4;
}
while(FaAdd)
{
mod=FaAdd%16;
if(mod<=9)
*(s2+i)=mod+'0';
else
*(s2+i)=mod+55;
i++;
FaAdd/=16;
}
s2[i]='\0';
n=strlen(s2);
if(n<=3)
strcat(s2,"0");
for(i=0;i{
chart;
t=s2[i];
s2[i]=s2[n-1-i];
s2[n-1-i]=t;
}
strcat(s,"Father:
");
strcat(s,s2);
}
if(Broadcast_NwkState==DEV_ROUTER)
{
unsignedchars1[20],s2[20];
strcpy(s,"ROUTER:
");
FaAdd=NLME_GetCoordShortAddr();
a=NLME_GetShortAddr();
while(a)
{
mod=a%16;
if(mod<=9)
*(s1+i)=mod+'0';
else
*(s1+i)=mod+55;
i++;
a/=16;
}
s1[i]='\0';
n=strlen(s1);
if(n<=3)
strcat(s1,"0");
for(i=0;i{
chart;
t=s1[i];
s1[i]=s1[n-1-i];
s1[n-1-i]=t;
}
strcat(s,s1);
i=0;
if(!
FaAdd)
{
strcpy(s2,"0000");
i=4;
}
while(FaAdd)
{
mod=a%16;
if(mod<=9)
*(s2+i)=mod+'0';
else
*(s2+i)=mod+55;
i++;
FaAdd/=16;
}
s2[i]='\0';
n=strlen(s2);
if(n<=3)
strcat(s2,"0");
for(i=0;i{
chart;
t=s2[i];
s2[i]=s2[n-1-i];
s2[n-1-i]=t;
}
strcat(s,"Father:
");
strcat(s,s2);
}
theMessageData=s;
afAddrType_tmy_DstAddr;
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;
my_DstAddr.endPoint=BROADCAST_ENDPOINT;
my_DstAddr.addr.shortAddr=0X0000;
if(AF_DataRequest(&my_DstAddr,&Broadcast_epDesc,
BROADCAST_BACK_CLUSTERID,
(byte)osal_strlen(theMessageData),
theMessageData,
&Broadcast_TransID,
AF_DISCV_ROUTE,AF_DEFAULT_RADIUS)==afStatus_SUCCESS)
{
//Successfullyrequestedtobesent.
HalLedBlink(HAL_LED_2,4,50,100);
}
else
{
//Erroroccurredinrequesttosend.
}
}
(3)无线数据发送函数
staticvoidBroadcast_SendTheMessage(void)
{
uint8*theMessageData="CoordinatorSend!
";
afAddrType_tmy_DstAddr;
my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;
my_DstAddr.endPoint=BROADCAST_ENDPOINT;
my_DstAddr.addr.shortAddr=0XFFFF;
if(AF_DataRequest(&my_DstAddr,&Broadcast_epDesc,
BROADCAST_CLUSTERID,
(byte)osal_strlen(theMessageData),
theMessageData,
&Broadcast_TransID,
AF_DISCV_ROUTE,AF_DEFAULT_RADIUS)==afStatus_SUCCESS)
{
//Successfullyrequestedtobesent.
HalLedBlink(HAL_LED_1,4,50,1000/4);//成功发送数据后红灯闪烁
}
else
{
//Erroroccurredinrequesttosend.
}
}
staticvoidBroadcast_MessageMSGCB(afIncomingMSGPacket_t*pkt)//将数据发送到串口
{
switch(pkt->clusterId)
{
caseBROADCAST_CLUSTERID:
if(osal_memcmp(pkt->cmd.Data,"CoordinatorSend!
",osal_strlen("CoordinatorSend!
")))
{
Broadcast_SendBackMessage();
}
break;
caseBROADCAST_BACK_CLUSTERID:
HalUARTWrite(0,pkt->cmd.Data,pkt->cmd.DataLength);
HalUARTWrite(0,"\r\n",2);
//Ha