一、zigbee四种通讯
1、单播(略)
2、广播:发送模块发送数据,这个网络里所有的节点模块都可以拿到这个数据。
3、组播(略)
4、绑定(略)
二、广播实验
本笔记只记录如何实现广播发送端和接收端设置,完整实验参考:
1、广播的发送端设置(终端发送模块)
终端发送模块,定义了端点10,并且和应用层任务挂钩。设置发送出去的方式是广播,目标是网络里面所有的节点,并指定接收的模块接收这个数据的端点是10,接收的簇是0x0001。
(1)定义端点10:在APP目录下的smartHomeApp.c文件中的smartHomeApp_Init函数中对应位置注册端点10,如下图和代码。
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
smartHomeApp_epDesc.endPoint =10;// smartHomeApp_ENDPOINT;
smartHomeApp_epDesc.task_id = &smartHomeApp_TaskID;
smartHomeApp_epDesc.simpleDesc
= ( SimpleDescriptionFormat_t* )&smartHomeApp_SimpleDesc;
smartHomeApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &smartHomeApp_epDesc );
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
(2)设置发送出去的方式是广播,目标是网络里面所有的节点,并指定接收的模块接收这个数据的端点是10,接收的簇是0x0001,发送的代码如下。
char theMessageData[] = "Hello World";
smartHomeApp_DstAddr.addrMode =(afAddrMode_t)AddrBroadcast //修改发送模式
/*
enum
{
AddrNotPresent = 0,
AddrGroup = 1,//组播模式
Addr16Bit = 2,
Addr64Bit = 3,
AddrBroadcast = 15 //广播模式
};
typedef enum
{
afAddrNotPresent = AddrNotPresent,
afAddr16Bit = Addr16Bit,
afAddr64Bit = Addr64Bit,
afAddrGroup = AddrGroup,
afAddrBroadcast = AddrBroadcast
} afAddrMode_t;
*/
smartHomeApp_DstAddr.addr.shortAddr = 0xFFFF; //目标模块的网络地址为0xFFFF,表示发送给网络里的所有节点
smartHomeApp_DstAddr.endPoint = 10; //目标端点为10
AF_DataRequest( &smartHomeApp_DstAddr, &smartHomeApp_epDesc,
0x0001, //指定接收模块的簇
(byte)osal_strlen( theMessageData ) + 1, //表示发送字节个数
// 1,
(byte *)&theMessageData,//发送的数组的首地址
&smartHomeApp_TransID,
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
2、广播接收端设置
定义了端点10,并且和应用层任务挂钩。一旦外部给本模块发数据,就会进入应用层事件处理函数,在函数里外部来数据这个消息里,通过判断簇点值,接收相应的数据并做出反应。
(1)定义了端点10,并且和应用层任务挂钩。与步骤 二.1.(1)一致。
(2)外部给本模块发数据,就会进入应用层事件处理函数,在函数里外部来数据这个消息里,通过判断簇点值,接收相应的数据并做出反应。在在APP目录下的smartHomeApp.c文件中的smartHomeApp_MessageMSGCB函数中修改相应内容,代码如下所示。
void smartHomeApp_MessageMSGCB( afIncomingMSGPacket_t* pkt )
{
//外来数据包投入到10号端点
if(pkt->endPoint==10){
//判断接收簇
switch( pkt->clusterId ){
case 0x0001:
InformationSend(pkt->cmd.Data,pkt->cmd.DataLength);
LED1=~LED1;
break;
case 0x0002:
InformationSend(pkt->cmd.Data,pkt->cmd.DataLength);
LED2=~LED2;
break;
default:
break;
}
}
}
三、网络特性补充:
(1)协调器创建网络之后,就和网络里面的路由器节点在通讯过程中、功能上没有任何区别,只不过网络地址永远是0x0000。
(2)终端入网后,他和网络里的其他节点数据收和发都要经过他的父节点转发。
(3)路由器在路网后,虽然网络里有他的父节点,但是他们在发数据时候,不需要父节点转发,入网后,协调器和所有的路由器的通讯地位平等。
(4)数据源地址和目标地址、网络源地址和目标地址
(5)广播转发次数。终端入网后,他和网络里的其他节点数据收和发都要经过他的父节点转发,因此一条信息从开始的发送端到目标节点,可能会经过多次的转发,系统有规定转发次数,当转发次数减为零时,不能再转发。