辜渝傧

13037102709

027-87870986

教学实训

您当前的位置:首页 > 教学资源 > 实训方案 >

无线传感网络实训|实验5.6组播组网实验

发布者:唯众    布时间:2020-12-01 14:52:37    点击量:

1.实验目的

1)、实验多终端通讯
2)、实现组播组网通讯,协调器不响应其它组发过来的数据

2.实验设备

硬件:PC机一台、ZIGBEE网关、ZIGBEE节点2个、仿真器一个
软件:2000/XP/win7系统,IAR8.10集成开发环境

3.实验详解

       打开“实验4.6组播组网实验\ZStackCC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB\SampleApp.eww”工程。由于此实验中就是基于TI的SampleApp修改的,由于SampleApp本身就有组播组网的代码,我们只需修改小部分代码就可实现实验的功能了,现在告诉大家怎么修改。
1)、在全局变量区定义一个全局变量,用来保存当前蜂鸣器的状态
2)、在SampleApp_ProcessEven函数找到如下代码:
1. case ZDO_STATE_CHANGE: //当网络状态改变,所有节点都会发生
2. SampleApp_NwkSta te = (devStates_t)(MS Gpkt->hdr.status);
3. if ( (SampleApp_ NwkState == DEV_ZB_COORD ) //协议器不用发送所以屏蔽 4. || (SampleApp_Nw kState == DEV_ROUTER) //路由器
5. || (SampleApp_Nw kState == DEV_END_DEVI CE) ) //终端设备
6. {
7. // Start sending the periodic message in a regular interval .
8. //osal_start_tim erEx( SampleApp_TaskID ,
//SAMPLEAPP_SEND _PERIODIC_MSG_EVT,
//SAMPLEAPP_SEND _PERIODIC_MSG_TIMEOUT );
9. }
注释osal_start_timerEx这行代码,此实验没有周期性事件。修改后如红色代码所示。
3)、找到按键处理函数 SampleApp_HandleKey
void SampleApp_HandleKeys( uint8 shift, uint8 keys )
{
(void )shift; // Intentionaly unreferenced parameter
//判断 S1 按键是否被按下,由于 TI 用的 5 向按键,和我们的开发板 IO 有所不同
if ( keys & HAL_KEY_SW_6 ) {
#if defined(ZDO_COORDINATOR ) //协调器只接收数据
#else //路由器和终端才发送数据
SampleApp_SendFlashMessage(0); //以组播组网方式发数据
#endif
}
if ( keys & HAL_KEY_SW_1 ) //判断 S2 按键是否被按下
{
/* The Flashr Command is s ent to Group 1.
* This key toggles this device in and out of group 1.
* If this device doesn't belong to group 1, t his application
* will not receive the F lash command sent to group 1.
*/
aps_Group_t *grp;
//查找 SAMPLEAPP_ENDPOINT 端点是否加入了以 SAMPLEAPP_FLASH_GROUP 为组 ID 的组
grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
if ( grp ) {// Remove from the group
aps_RemoveGroup( SAMPLEAP P_ENDPOINT, SAMPLEAPP _FLASH_GROUP );//退出组
}
else
{// Add to the flash group
aps_AddGroup( SAMPLEAPP_ ENDPOINT, &SampleApp_Group ); //加入组
}
}
}
4)、接收数据找到SampleApp_MessageMSGCB函数
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //接收数据
{
uint8 data; switch ( pkt->clusterId )
{
case SAMPLEAPP_PERIODIC_CLUSTERID:
break;
case SAMPLEAPP_FLASH_CLUSTERID:
data = (uint8)pkt->cmd.Data[0]; //根据接收到的数据改变 Led2 的亮灭
if(data == 0)
HalLedSet(HAL_LED_2, HAL_LED_MODE_OFF);
else
HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);
break;
}
}
5)、组播组网发送数据找到 SampleApp_SendFlashMessage 函数
void SampleApp_SendFlashMessage( uint16 flashTime )
{
BuzzerState = ~ BuzzerState; //状态取反
if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc, SAMPLEAPP_FLASH_CLUSTERID, 1, &LedState, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) {
if(LedState == 0) //切换自身状态提示用户操作成功
HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);
else
HalLedSet(HAL_LED_2, HAL_LED_MODE_OFF);
} else {
// Error occurred in request to send.
}
}
 
 

4.实验现象

       三个节点,一个网关做协调器,另外两个节点做终端。按终端S1键时,协调器蜂鸣器蜂鸣一下同时终端自身的蜂鸣器蜂鸣一下,提示发送成功。修改其中一个终端的组编号,编译下载后,按此终端S1键时,此时看协调器是否会蜂鸣。


上一篇:无线传感网络实训|实验5.5 广播组网实验

下一篇:无线传感网络实训|实验5.7点播组网实验