实验8—基于Z-Stack的无线自组网实验

实验8—基于Z-Stack的⽆线⾃组⽹实验
实验题⽬:实验8—基于Z-Stack的⽆线⾃组⽹实验实验时间:2015.12.24
⼀、实验⽬的:
学习TI ZStack2007协议栈内容,掌握CC2530模块⽆线组⽹原理及过程。有关Z-Stack2007协议栈的具体内容,请参考附录中相关说明及TI官
⽅⽂档。
使⽤IAR 开发环境设计程序,ZStack-2.3.0-1.4.0协议栈源码例程SampleApp⼯程基础上,实现⽆线组⽹及通讯。即协调器⾃动组⽹,终端
节点⾃动⼊⽹,并发送周期信息“~HELLO!~”⼴播,协调器接收到消息后
将数据通过串⼝发送给PC 计算机。
⼆、实验原理及程序分析:
a)ZigBee(CC2530)模块LED硬件接⼝
图1 LED 硬件接⼝
ZigBee(CC2530)模块硬件上设计有2个LED灯,⽤来编程调试使⽤。分别连接CC2530的P1_0、P1_1两个IO 引脚。从原理图上可以看出,2个LED灯共阳极,当P1_0、P1_1引脚为低电平时候,LED灯点亮。
b)SampleApp实验简介
SampleApp实验是协议栈⾃带的ZigBee⽆线⽹络⾃启动(组⽹)样例,该实验实现的功能主要是协调器⾃启动(组⽹),节点设备⾃动⼊⽹。之后两者建⽴⽆线通讯,数据的发送主要有2中⽅式,⼀种为周期
定时发送信息(本次实验采⽤该⽅法测试),另⼀种需要通过按键事件触发发送FLASH信息。由于实验配套ZigBee模块硬件上与TI公司的ZigBee样板有差异,因此本次实验没有采⽤按键触发⽅式。
Periodic消息是通过系统定时器开启并定时⼴播到group1出去的,因此在SampleApp_ProcessEvent事件处理函数中有如下定时器代码:
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (SampleApp_NwkState == DEV_ZB_COORD)
|| (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
// Start sending the periodic message in a regular
interval.
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
else
{
// Device is no longer in the network
}
break;
当设备加⼊到⽹络后,其状态就会变化,对所有任务触发ZDO_STATE_CHANGE 事件,开启⼀个定
时器。当定时时间⼀到,就触发⼴播periodic消息事件,触发事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT,相应任务为SampleApp_TaskID,于是再
次调⽤SampleApp_ProcessEvent()处理SAMPLEAPP_SEND_PERIODIC_MSG_EVT事件,该事件处理函数调⽤SampleApp_SendPeriodicMessage()来发送周期信息。
i f ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
SampleApp_SendPeriodicMessage(); // Send the periodic message
// Setup to send message again in normal period (+ a little jitter) osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() &
0x00FF)) ); return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); // return unprocessed events
}
MT层串⼝通讯
协议栈将串⼝通讯部分放到了MT 层的MT 任务中去处理了,因此我们在使⽤串⼝通讯的时候要在编译⼯程(通常是协调器⼯程)时候在编译选项中加⼊MT层相关任务的⽀持:MT_TASK,ZTOOL_P1 或ZAPP_P1。
关于⽆线组⽹实验关键代码分析
void SampleApp_SendPeriodicMessage( void )
{
口袋领域char buf[]="~HELLO!~";
AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc, SAMPLEAPP_PERIODIC_CLUSTERID,
焗炉8,
(unsigned char*)buf,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS );
}
这个函数是终端节点要完成的功能,通过上⾯对周期事件的分析,可以知道这个函数是会被周期调⽤的,通过
AF_DataRequest()向协调器周期发送字符串“~HELLO!~”
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
afIncomingMSGPacket_t *MSGpkt;
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
// Received when a key is pressed
case KEY_CHANGE:
SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
// Received when a messages is received (OTA) for this endpoint case AF_INCOMING_MSG_CMD: SampleApp_MessageMSGCB( MSGpkt );
break;;
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (SampleApp_NwkState == DEV_ZB_COORD)
|| (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
pvc管件配方{
// Start sending the periodic message in a regular interval. HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
f型钢SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
else
{
// Device is no longer in the network
}
break;
default:
break;
osal_msg_deallocate( (uint8 *)MSGpkt ); // Release the memory
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); // Next - if
one is available
}
return (events ^ SYS_EVENT_MSG); // return unprocessed events
}
// Send a message out - This event is generated by a timer
负离子加湿器// (setup in SampleApp_Init()).
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
SampleApp_SendPeriodicMessage(); // Send the periodic message
// Setup to send message again in normal period (+ a little jitter) osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() &
0x00FF)) ); return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); // return unprocessed events
}
return 0; // Discard unknown events
}
SampleApp_ProcessEvent() 函数为应⽤层事件处理函数,当接收到⽹络数据(即发⽣AF_INCOMING_MSG_CMD 事件)时,会调⽤SampleApp_MessageMSGCB( MSGpkt );处理函数,现在来分析这个函数
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
unsigned char *buf;
switch ( pkt->clusterId )
{
case SAMPLEAPP_PERIODIC_CLUSTERID:
buf = pkt->cmd.Data;
HalUARTWrite(0, buf, 8);
HalUARTWrite(0,"\r\n", 2);
break;
case SAMPLEAPP_FLASH_CLUSTERID:
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] ); HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) ); break;
}
}
草地悠波球
这个函数是协调器要完成的⼯作,对终端发过来的消息进⾏格式转换后发给串⼝
终端。更详细的处理流程,具体见⼯程源代码。
三、实验步骤及结果:
1、使⽤ZigBee Debuger USB仿真器连接PC机和ZigBee(CC2530)模块,打开ZIEBEE模块开关供电
2、打开物联⽹⽆线传感⽹络部分\exp\zigbee\⽆线⾃组⽹实验\Projects \zstack\Samples\SampleApp\CC2530DB ⾥的⼯程。选择CoordinatorEB⼯程,编译下载到ZigBee COORDINATOR 模块中。
3、选择EndDeviceEB ⼯程,编译下载到终端节点
4、启动设备测试,⾸先启动协调器模块,建⽴⽹络时LED1闪烁,成功后LED1点亮停⽌闪烁,再启动节点端ZigBee模块,⼊⽹成功后LED1点亮停⽌闪烁,⽹络组建成功后,将PC 机串⼝线连接到ZigBee协调器模块对应的串⼝上,打开串⼝终端,设置波特率为38400、8 位、⽆奇偶校验、⽆硬件流模式,即可在超级终端上看到终端节点发送过来的“~HELLO!~”字符串。
四、实验⼼得:
在实验时需要在f8wConfig.cfg⽂件中修改PAN_ID,避免其他设备的⼲扰导致终端节点与协调器⽆法组成⽹络。

本文发布于:2024-09-23 07:16:24,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/197014.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:实验   模块   协调   终端   节点   事件   触发   发送
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议