辜渝傧

13037102709

027-87870986

教学实训

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

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

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

1.实验目的

1)、多终端通讯
2)、掌握点对点通讯

2.实验设备

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

3.实验详解

       在上一实验中,通过简单的修改即可完成点播实验。相同的工程阅读代码更容易,等大家掌握到一定程度后,我们再换别的例子讲解。打开“实验4.7点播组网实验\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB\SampleApp.eww”工程。在开始之前我们先了解下面两个重要结构:
typedef enum //个枚举类型
{ afAddrNotPresent = AddrNotPresent,
afAddr16Bit = Addr16Bit, //点播方式
afAddr64Bit = Addr64Bit,
afAddrGroup = AddrGroup, //组播方式
afAddrBroadcast = AddrBroadcast //广播方式
} afAddrMode_t;
typedef struct {
union
{
uint16 shortAddr; //短地址
ZLongAddr_t extAddr; //IEEE 地址
} addr;
 
afAddrMode_t addrMode; //传送模式
byte endPoint; //端点号
uint16 panId; // used for the INTER_PAN feature
} afAddrType_t;
1)、找到 afAddrType_t SampleApp_Periodic_DstAddr;代码下面增加一行代码如下:
点播组网实验
2)、搜索 afAddrGroup,在它下增加对 SampleApp_P2P_DstAddr 配置,可直接复制广播的配置 修改即可,增加后如下:
点播组网实验

协调器的地址规定为 0x0000 3. 增加发送函数,相信现在大家对下面的函数应该很熟悉了。
void SampleApp_Send_P2P_Message( void )
{
uint8 data[11]="0123456789";
if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc, SAMPLEAPP_P2P_CLUSTERID, 10, data, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
其中 SampleApp_P2P_DstAddr 是我们之前自己定义的, SAMPLEAPP_P2P_CLUSTERID 是在 SampleApp.h 中增加的,如下:
#define SAMPLEAPP_PERIODIC_CLUSTERID 1
#define SAMPLEAPP_FLASH_CLUSTERID 2
#define SAMPLEAPP_COM_CLUSTERID 3
#define SAMPLEAPP_P2P_CLUSTERID 4
4)、搜索 SampleApp_ProcessEvent,找到 if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) 修改成如下代码:
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) {
// Send the periodic message
//SampleApp_SendPeriodicMessage(); //注释原来的发送函数 SampleApp_Send_P2P_Message(); //增加点播的发送函数
// Setup to send message again in normal perio d (+ a little jitter) osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal _rand() & 0x00FF)) ) ;
// return unprocessed events return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
5)、在接收方面,搜索找到 SampleApp_MessageMSGCB,我们进行如下修改(增加红色部 分):
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) {
uint16 flashTime; switch ( pkt->clusterId ) {
case SAMPLEAPP_P2P_CLUSTERID:
HalUARTWrite(0, "Rx:", 3); //提示接收到数据
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //串口输出接收到的数据
HalUARTWrite(0, "\n", 1); // 回车换行
break;
case SAMPLEAPP_PERIODIC_CLUSTERID:
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;
}
}
6)、协调器不需要周期发数据,注释协调器的周期事件
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. osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
} else {
// Device is no longer in the network
}
break;
7)、最后别忘了加上函数声明,不然编译报错的。将修改后的程序分别编译、下载到协 调器、路由器、终端,如果条件允许都连接串口。可以看到只有协调器一个周期性收到字符串。 也就是说路由器和终端均与地址为 0x00(协调器)的设备通信,不语其他设备通信。实现点对点 传输。如下图所示:
点播组网实验

4.实验现象

       将程序分别下载到协调器、终端,连接串口。如果3个模块,可将其中一个做路由器,上电可以看到只有协调器在一个周期内收到信息。也就是说路由器和终端均与地址为0x00(协调器)的设备通信,不与其他设备通信。确定通信对象的就是节点的短地址,实现点对点传输。


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

下一篇:无线传感网络实训|实验5.8 Z-Sensor Monitor使用实验