zigbee绑定 使用_TI ZSTACK Zigbee单播、组播、广播使用

e212f84e0d08ab135ad1462cd2bef46a.png

一、zigbee无线通信方式简介

在AF.h文件中,有如下一段定义:

typedef enum

{

afAddrNotPresent = AddrNotPresent,

afAddr16Bit = Addr16Bit,

afAddr64Bit = Addr64Bit,

afAddrGroup = AddrGroup,

afAddrBroadcast = AddrBroadcast

} afAddrMode_t;

可见,无线通信的地址模式总共有5种,分别解释如下:

AddrNotPresent——绑定通信

Addr16Bit——单播通信(16位地址方式)

Addr64Bit——单播通信(64位地址方式)

AddrGroup——组播通信

AddrBroadcast——广播通信

二、zigbee无线通信设置和使用

Zigbee协议栈进行数据发送是调用AF_DataRequest这个函数:

afStatus_t AF_DataRequest( afAddrType_t *dstAddr, //目的地址指针

endPointDesc_t *srcEP, //发送节点的端点描述符指针

uint16 cID, //ClusID 簇ID号

uint16 len, //发送数据的长度

uint8 *buf, //指向存放发送数据的缓冲区指针

uint8 *transID,//传输序列号,该序列号随着信息的发送而增加 uint8 options, //发送选项

uint8 radius //最大传输半径(发送的跳数)

)

发送函数中最重要的是目的地址和发送的数据,尤其是目的地址这个结构体,必须指定代码中所示的三个参数:第一个参数指定无线发送模式;第二个参数指定目的端点;第三个参数指定目的设备的短地址;然后就可以调用Z-Stack中AF层的库函数AF_DataRequest( )进行无线发送了!

参数1:afAddrType_t *dstAddr 该参数包含了目的节点的网络地址、端点号及数据传送的模式,如单播、广播或多播等。

afAddrType_t 是个结构体如下:

typedef struct

{

union

{

uint16 shortAddr; //用于标识该节点网络地址的变量

} addr;

afAddrMode_t addrMode; //用于指定数据传送模式,单播、多播还是广播

byte endPoint; //端点号

} afAddrType_t; // 其定义在AF.h中

在Zigbee 中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。因此上述结构体中的afAddrMode_t addrMode 就是用于指定数据传送模式,是个枚举类型,可以设置为以下几个值,

typedef enum

{

afAddrNotPresent = AddrNotPresent, //表示通过绑定关系指定目的地址

afAddr16Bit = Addr16Bit, //单播发送

afAddrGroup = AddrGroup, //组播

afAddrBroadcast = AddrBroadcast //广播

} afAddrMode_t;

enum

{

AddrNotPresent = 0,

AddrGroup = 1,

Addr16Bit = 2,

Addr64Bit = 3,

AddrBroadcast = 15

};

2.1单播:注意:其实单播有两种方式一种是绑定传输my_DstAddr.addrMode=(afAddrMode_t) AddrNotPresent,一种是直接指定目标地址的单播传输,比如协调器就是0x0000。

2.1.1 单播绑定传输:

my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit; //单播发送

my_DstAddr.endPoint=GENERICAPP_ENDPOINT; //目的端口号

my_DstAddr.addr.shortAddr=0; //按照绑定的方式进行单播,不需要指定目标地址,需要先将两个设备绑定,将两个设备绑定后即可通信

2.1.2 直接指定目标地址的单播传输:是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备,将afAddrMode 设置为Addr16Bit 并且在数据包中携带目标设备地址。

my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit; //单播发送

my_DstAddr.endPoint=GENERICAPP_ENDPOINT; //目的端口号

my_DstAddr.addr.shortAddr=0x0000; //目标设备网络地址

2.2广播:当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为

AddrBroadcast。目标地址 my_DstAddr.addr.shortAddr可以根据需求设置为下面广播地址的一种:

NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT 在f8wConifg.cfg 中)。

NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。

NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。

my_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//广播发送

my_DstAddr.endPoint=GENERICAPP_ENDPOINT; //目的端口号

my_DstAddr.addr.shortAddr=0xFFFF; //协调器网络地址

2.3组播:当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为

afAddrGroup 并且addr.shortAddr 设置为组ID。使用组播的方式需要加入特定的组

1.首先声明一个组对象aps_Group_t SampleApp_Group;

aps_Group_t结构体的定义:

typedef struct

{

uint16 ID; // Unique to this table

uint8 name[APS_GROUP_NAME_LEN]; // #define APS_GROUP_NAME_LEN 16

} aps_Group_t;

每个组有个特定的ID跟组名,组名存放在name数组中,name数组的第一个元素是组名的长度,第二个元素开始存放组名字符串。

2.对SampleApp_Group赋值:

SampleApp_Group.ID = 0x0003; //初始化组ID

osal_memcpy( SampleApp_Group.name, “Group 3”, 7 ); //将组名的长度写入name数组的第一个元素位置处

3.在本任务里将端点加入到组中:

aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

4.设定通信的目标地址及模式:

SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;

SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;

SampleApp_Flash_DstAddr.addr.shortAddr = SampleApp_Group.ID ;

通信时候,发送设备的输出cluster设定为接收设备的输入cluster,另外profileID设定相同,即可通信。

5.若要把一个设备加入到组中的端点从组中移除,调用aps_RemoveGroup:

aps_Group_t *grp;

grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );

if ( grp )

{

aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值