实验课程

THIS NAME

实验课程

当前位置: 首页 >> 实验课程 >> 正文

无线传感器网络-信息广播/组播实验

发布日期:2024-12-25    作者:陆其美     来源:     点击:

实验三  信息广播/组播实验

一、实验目的

1、理解zigbee协议及相关知识;

2、在zstack协议栈下实现信息的广播和组播功能。

二、实验原理

当应用层想发送一个数据包到所有网络中的所有设备时使用广播传输模式,为实现广播模式,需设置地址模式为AddrBroadcast,目的地址被设置为下列值之一:

NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)–该信息将被发送到网络中的所有设备(包括休眠的设备)。对于休眠的设备,这个信息将被保持在它的父节点,直到该休眠设备获得该信息或者该信息时间溢出(在 f8wConfig.cfg 中的 NWK_INDIRECT_MSG_TIMEOUT 选项)。

NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD) –该信息将被发送到网络中有接收器并处于 IDLE(RX ON WHEN IDLE)状态下的所有设备。也就是说,除了休眠模式设备的所有设备。

NWK_BROADCAST_SHORTADDR_DEVZCZR (0xFFFC) –该信息被发送到所有路由器(包括协调器)。本实验选择的目的地址为 NWK_BROADCAST_SHORTADDR_DEVALL

当应用层想发送一个数据包到一个设备组的时候使用组播模式。为实现组播模式,需设置地址模式为 afAddrGroup。在网络中需预先定义组,并将目标设备加入已存在的组(看 ZStack API 文档中的 aps_AddGroup())。广播可以看作是组播的特例。

在对 ZDO_STATE_CHANGE 事件的处理中启动定时器来触发协调器发送数据的事件

MY_REPORT_EVT,在对 MY_REPORT_EVT 事件的处理中发送数据 hello world!,并启动定时器再一次触发 MY_REPORT_EVT 事件,进行周期广播或组播。为实现组播,应在终端或路由节点的程序中注册一个组(注册的组号应与发送数据的目的地址一致),ZStack 中,组是以链表的形式存在,首先需要定义组表的头节点,定义语句为 apsGroupItem_t*group_t;,然后再定义一个一个组group1aps_Group_t group1; ),在初始化函数中对组表分配空间(调用函数 osal_mem_alloc),并初始化组号和组名,然后调用 aps_AddGroup 将这个组加入到定义的端点应用中(为使用aps_AddGroup 函数,程序中应包含 aps_groups.h 头文件。

三、实验环境

1、硬件:ZXBee CC2530节点板,USB接口的SmartRF04仿真器,PC机,串口线。  

2、软件:PC机操作系统WinXP/win7,IAR集成开发环境,ZTOOL 程序

四、实验内容

协调器节点上电后进行组网操作,终端节点和路由节点上电后进行入网操作,接着协调器周期性地向所有节点广播(或部分节点组播)数据包(Hello World),节点收到数据包后通过串口传给PC,通过 ZTOOL 程序观察接收情况。

3-1是本实验的数据流图:

undefined

3-1 本实验数据流图

下面结合本实验的实验原理以及实验内容的设计,分别对终端节点、路由节点和协调器节点的源关键源程序进行解析。

1、终端节点、路由节点

根据本节内容的设计,先将终端节点、路由节点加入 zigbee 网络,当接收到协调器节点发送的数据包后就通过串口向 PC 机输出数据信息,因此终端节点和路由节点的任务事件都一样。

通过上一节的工程解析实验可得知,zigbee节点接收到数据之后,最终调用了zb_ReceiveDataIndication函数,该函数的内容如下:

void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )

{

char buf[64];

//接收到数据之后LED灯闪烁 1

HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );

HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );

//将接收到的数据进行处理

if (len > 0) {

osal_memcpy(buf, pData, len); //pData的数据复制到buf缓冲区

buf[len] = 0;

debug_str(buf); //将数据通过串口发送给上位机

}

}

2、协调器

协调器的任务就是周期的向终端节点和路由节点广播/组播发送数据。根据 ZStack 协议栈的工作流程,在程序源代码 MPCoordinator.c 中可以看到 ZStack 协议栈成功启动后(协议栈启动后会调用 zb_StartConfirm 函数),设置了一个定时器事件,在该定时器事件中触发了自定义的MY_BOCAST_EVT 事件,其中 MY_BOCAST_EVT 事件被宏定义为 0x0002

程序中第一次触发 MY_BOCAST_EVT 事件代码如下:

void zb_StartConfirm( uint8 status )

{

// If the device sucessfully started, change state to running

if ( status == ZB_SUCCESS ) //zigbee协议栈启动成功

{

myAppState = APP_START;

HalLedSet( HAL_LED_2, HAL_LED_MODE_ON );

// Set event timer to send data

// 设置定时器事件来触发自定义的MY_BOCAST_EVT事件

osal_start_timerEx( sapi_TaskID, MY_BOCAST_EVT, REPORT_DELAY );

}

else //zigbee协议栈启动失败重新启动

{

// Try again later with a delay

osal_start_timerEx( sapi_TaskID, MY_START_EVT, myStartRetryDelay );

}

}

当定时器事件触发后就会触发用户的 MY_BOCAST_EVT 事件,触发 MY_BOCAST_EVT 事件的函数入口为 MPCoordinator.c 中的 zb_HandleOsalEvent 函数,在该函数中编写了应用程序事件的处理过程,如下述代码所示。

void zb_HandleOsalEvent( uint16 event ){

if (event & ZB_ENTRY_EVENT) { //zigbee入网事件

....

}

if (event & MY_BOCAST_EVT) { // MY_BOCAST_EVT事件触发处理

myReportData();

osal_start_timerEx( sapi_TaskID, MY_BOCAST_EVT, REPORT_DELAY );

}

}

通过上述源码可以看到,当处理 MY_BOCAST_EVT 事件时,调用了 myReportData()方法,然后又设置了一个定时器事件来触发 MY_BOCAST_EVT 事件,这样做的目的就是为了每隔一段时间循环触发 MY_BOCAST_EVT 事件。了解了 MY_BOCAST_EVT 事件循环触发的原理之后,再来看看 myReportData()函数实现了什么功能,下面是 myReportData()的源码解析过程。

static void myReportData(void){

byte dat[] = "Hello World";

//发送数据时LED灯闪烁一次

HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );

HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );

#if defined( GROUP ) //组播

if(afStatus_SUCCESS == AF_DataRequest(&Group_DstAddr, &sapi_epDesc, ID_CMD_REPORT, sizeof dat,

dat, 0, AF_ACK_REQUEST, 0))

{

}

else{

}

#else //广播

zb_SendDataRequest(0xffff, ID_CMD_REPORT, sizeof dat, dat, 0, AF_ACK_REQUEST, 0 );

#endif

}

可以看出,在 myReportData()函数中,协调器发送数据的方式有广播和组播两种。实验源码默认的是广播发送,当测试广播发送数据时,终端节点和路由节点都会收到协调器发送的数据包。如果需要测试组播发送数据,需要配置如下信息:先在工程文件下选择MPCoordinator”,右键—>Options—>C/C++Compiler—>Preprocessor,添加GROUP”,同样的,选中“MPRouter”和“MPEndPoint”,重复上述过程。具体配置如图3-2所示:

undefined

3-2  添加“GROUP”宏定义

在组播测试实验中,为了让终端节点和路由节点中只能有一个节点可以接收到协调器发送的数据包。可以通过改变 MPEndPoint.c 或者 MPRouter.c 文件里的 zb_HandleOsalEvent 函数中的Group1.ID”的值来决定哪个节点可以接受到协调器发送的数据包,只有当 Group1.ID 的值与MPCoordinator.c Group1.ID 的值相同时才能接受到数据包。

本节实验中,终端节点、路由节点和协调器的程序流程图如图3-3所示。

undefined

3-3  实验流程图

五、实验步骤

由于出厂源码 zigbee 网络 PAN ID 均设置为 0x2100,为了避免实验环境下多个实验平台之间网络互相串扰,每个实验平台需要修改 PAD ID,修改工程内文件:Tools -> f8wConfig.cfg,将 PANID 修改为个人学号的后四位(范围 0x0001~0x3FFF),具体参考《产品手册》8.2 章节部分。

1)确认已安装 ZStack 的安装包。如果没有安装,按打开光盘提供的安装包,路径为03-系统代码\ZStack\ZStack-CC2530-2.4.0-1.4.0.exe”,双击之后直接安装,安装完后默认生成 C:\TexasInstruments\ZStack-CC2530-2.4.0-1.4.0 文件夹。

2)准备 3 CC2530 射频节点板,确定按照第一章 1.2 节设置节点板跳线为模式一,分别接上出厂电源。

3 )打开例程:将光盘中的例程05- 实验例程 \ 5 \5.4-InformationBroadcast\InformationBroadcast ” 整 个 文 件 夹 拷 贝 到 C:\Texas Instruments\ZStack-CC2530-2.4.0-1.4.0\Projects\zstack \Samples 文件夹下。双击 InformationBroadcast\CC2530DB\Information Broadcast.eww”文件。

4)在工程界面中按下图所示,选定MPCoordinator”配置,生成协调器代码,然后选择Project->Rebuild All 重新编译工程。

undefined

3-4 选择协调器工程

5)在工程界面中按下图所示,选定MPEndPoint”配置,生成终端节点代码,然后选择Project->Rebuild All 重新编译工程。

undefined

3-5 选择终端节点工程

6)在工程界面中按下图所示,选定MPRouter”配置,生成路由器节点代码,然后选择Project->Rebuild All 重新编译工程。

undefined

3-6 选择路由节点工程

7)把 SmartRF04 仿真器连接到 CC2530 无线节点,使用 Flash Programmer 工具把上述程序分别下载到对应的 CC2530 无线节点板中。

8)用 USB mini 线和调试转接板将终端节点或者路由器节点与 pc 连接起来。

9)先拨动无线协调器的电源开关为 ON 状态,此时 D6 LED 灯开始闪烁,当正确建立好网络后,D6 LED 会常亮。

10)当无线协调器建立好网络后,拨动无线终端节点和无线路由节点的电源开关为 ON 状态,此时每个无线节点的 D6 LED 灯开始闪烁,直到加入到协调器建立的 zigbee 网络中后,D6 LED 灯开始常亮。(注意按上述顺序复位)

11)当有数据包进行收发时,无线协调器和无线节点的 D7 LED 灯会闪烁。

12)启动 ZTOOL 工具,ZTOOL 工具自动扫描(波特率 384008 位数据位,1 个停止位,无硬件流控)。观察到与串口相连接的射频节点的输出信息。接下来将串口线依次连上终端节点或路由器节点,查看其接受到的信息,该信息是由协调器节点发出的,终端节点或路由器节点接受到信息后通过串口输出来。

当测试广播/组播发送数据时,串口打印的消息如图3-7 所示:

undefined

3-7 ZTOOL接收到的广播/组播数据

说明:本实验默认情况下是广播实验,如果要做组播实验则需要按照实验内容部分依次在终端、 路由和协调器节点工程中添加“Group”宏定义,工程重新编译后再重新按照上述步骤做实验即可。 为了体现出组播实验的效果,建议将终端节点、路由节点设置为不同的组号,这样只有与协调器的组号相同的节点才能收到组播信息。

六、实验结果

当地址模式设置为广播模式时(假设终端和路由节点已成功入网),网络中所有的节点都能接收到协调器节点广播的信息。

当地址模式设置为组播模式时(假设终端和路由节点已成功入网),网络中只有处于指定组号内的节点能接收到协调器节点组播的信息。


下一条:数据库系统课程-数据查询实验

关闭