广播组网-无线数据传输

(1)概念理解

点播:点对点通信,即两个设备之间通信。
组播:把网络中的节点分组,每个组员发出来的信息只有同组的组员才可以接受到。
广播:发送模块发出的数据,网络里面所有节点都可以接收到数据。广播地址模式设置为AddrBroadcast。

单点传送(Unicast)

将数据包发送到已知网络地址的网络设备。将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备的地址。

间接传送(Indirect)

合适在不知道数据包的目标设备在哪里时使用的模式。将模式设为AddrNotPresent且不指定目标地址。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特点称之为源绑定。

当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。

广播传送(broadcast)

将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为AddrBroadcast。目标地址DstAddr.addr.shortAddr可以根据需求设置为下面广播地址的一种:

广播系统以太网架构图 广播系统组网_数据

0xFFFF——数据包将被传送到网络上的所有设备,包括睡眠设备。
0xFFFD——数据包将被传送到网络上的所有空闲时打开接收的设备,即睡眠设备除外。
0xFFFC——数据包发送给所有的路由器,包括协调器。
协调器创建网络后,与网络中的路由器无区别,但它的网络地址永远是0x0000

(2)广播组网代码(在协议栈中串口基础实验的代码上添加)

  1. 在SampleApp.c中的SampleApp_ProcessEvent函数,增加协调器定时发送数据代码
case ZDO_STATE_CHANGE:
if (SampleApp_NwkState == DEV_ZB_COORD)//协调器定时发送数据
//if ( (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 );
}
………
break;

ZDO_STATE_CHANGE事件:当Zigbee网络有变化时(有新设备加入)产生此事件,在此事件里我们启动了一个定时事件,协调器广播发数据。

AF_INCOMING_MSG_CMD事件:当收到Zigbee信息包时,会产生此事件,在此事件处理函数中将接收到的信息通过串口打印出来。

广播系统以太网架构图 广播系统组网_网络协议_02

2.接收数据

SampleApp_MessageMSGCB(MSGpkt);是无线接收处理函数。在函数 case SAMPLEAPP_PERIODIC_CLUSTERID: 修改添加代码

广播系统以太网架构图 广播系统组网_广播地址_03

修改后如下:

广播系统以太网架构图 广播系统组网_广播地址_04

SAMPLEAPP_PERIODIC_CLUSTERID这个宏是之前发送函数定义的数据包ID号,判断哪个是cluster ID,根据不同的cluster ID做不同的动作。当收到的ID号相同即表示是自己定义的周期性广播包。所有的数据和信息都在函数传入来的afIlncomingMSGPacket_t *pkt里面。

3.发送数据

SampleApp_SendPeriodicMessage函数下修改、添加代码。

广播系统以太网架构图 广播系统组网_网络_05

最后将程序下载到两个板子,终端会接收到数据如下:

广播系统以太网架构图 广播系统组网_广播地址_06