目录
Zigbee绑定通信
通信原理
实验过程
实现步骤
实验现象
实验分析
Zigbee绑定通信
通信原理
1、Zigbee一共有五种通信方式:单播、广播、组播、MAC、广播
2、绑定是Zigbee的一种基本通信方式,具体绑定通信又分为三种模式,模式大同小异,在这里我只拿源绑定来说明
3、绑定通信:发送模块必须要知道接收模块(被绑定模块)的网络地址或者MAC地址、接收方的接收端点和接收簇。创建绑定的过程都由发送方来完成,是发送模块的一厢情愿,与接收方无关,
源绑定:
含义:在发送模块(源模块)里面创建了和它所绑定模块的绑定表。
注:单播、MAC、绑定最终发送的数据帧格式都是相同的。
在发送模块里,会调用一个函数,这个函数会创建一个结构体(绑定表)。绑定表里含有 发送模块的发送端点、接受模块的接受端点、接收模块的MAC和接收模块的接受簇。还必须保证发送模块的地址管理器中存有接收模块的MAC和网络短地址。
最后调用发送函数,以绑定的方式发送(绑定的时候发送指定函数中的配置信息有:接收模块的接收端点、接收簇,发送模块的发送端点,发送模块的网络地址。不指定接收模块的地址相关信息)。在发送时,首先查看绑定表,如果绑定表中的内容与发送函数中指定的信息相匹配,再去查看地址管理器的MAC与绑定表中的MAC是否一致,如果一致,就将地址管理器中的网络短地址作为目标地址,最后将数据包发送过去。
实验过程
实现步骤
我们使用上一节的MAC地址通信作为基础程序。(其中绑定内容只需要在发送模块终端中创建,接收模块协调器不用动)
1、首先我们创建一个接收模块MAC的地址相关信息结构体变量:destination,然后传入地址模式MAC和接收模块MAC地址。
然后调用函数:ZStatus_t APSME_BindRequest( byte SrcEndpInt, uint16 ClusterId,zAddrType_t *DstAddr, byte DstEndpInt);
其中函数的第一个参数是发送方端点,第二个参数是接收方簇,第三个参数是接收模块MAC的地址相关信息结构体地址,第四个变量是接收方的端点。
调用这个函数,不会发出任何无线数据包,它只是发送模块用来本地创建一个绑定表的结构体。
2、然后我们调用函数ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);
这个函数在前面的MAC通信中提到过。作用是将携带目标模块的MAC地址的数据包广播出去到Zigbee网络中,网络中的其它模块接收到数据包后判断数据包里面携带的MAC地址是否与自己一致,如果一致,就将自己的网络短地址发送给发送模块。这样发送模块收到网络短地址后就会成功将接收模块的地址相关信息添加到本地的地址管理器。
接着调用定时器触发事件函数,30s后执行发送事件
3、最后我们创建目标模块地址结构体变量,并只要配置绑定方式AddrNotPresent即可,不需要传入地址,然后调用数据发送函数发送。到此绑定通信配置完成。
4、程序
创建绑定表
uint8 DestMac[8]={0xFD,0xE7,0x59,0x2A,0x00,0x4B,0x12,0x00};//0x00124B002A59E7FD
//创建绑定表,与接收模块绑定
zAddrType_t destination;
destination.addrMode=Addr64Bit;
memcpy(destination.addr.extAddr,DestMac,8);
APSME_BindRequest( 10,0x0001,&destination,10);//创建绑定表,与我们的接收模块绑定
ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);
//携带接收目标模块的MAC,广播出去;网络中其它节点收到判断是否与自己MAC一样
osal_start_timerEx(StarryApp_TaskID,StarryApp_SEND_MSG_EVT,30);//等待30ms执行事件
发送数据
if ( events & StarryApp_SEND_MSG_EVT )
{
char theMessageData[] = "Zigbee 绑定实验";
StarryApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;//以绑定的方式发送
//StarryApp_DstAddr.addr.shortAddr = 0x0000;
//memcpy(StarryApp_DstAddr.addr.extAddr,DestMac,8);
// Take the first endpoint, Can be changed to search through endpoints
StarryApp_DstAddr.endPoint = StarryApp_ENDPOINT;//接收模块的端点
AF_DataRequest( &StarryApp_DstAddr, &StarryApp_epDesc,
StarryApp_CLUSTERID,
(byte)osal_strlen( theMessageData ) + 1,
(byte *)&theMessageData,
&StarryApp_TransID,
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
}
实验现象
按终端模块S1,进行MAC地址通信;按终端模块S2,进行绑定通信
实验分析
通过抓包,抓取绑定过程的数据包
我们只需要看第一个Data request前面的三个帧即可,后面两个帧是附带的
第一帧是终端发给父节点,通过父节点进行广播转发,表明终端想要获得目标MAC的网络短地址
第二帧是协调器转发子节点终端的数据帧
第三帧是终端发送给协调器的数据包,是按下K2后30ms后发送的,通过前面的时间可算出。还可以注意到后面的帧内非常明确指明了源网络短地址和目的网络短地址。这也表明了终端成功从本地地址管理器中获取到了目标网络短地址。
最后还要注意一点,单播、MAC和绑定它们最终发送的数据帧格式都是一模一样的,都包含了以下五个信息。