分享

【转】ZigBee地址模式分析

 Richie1986 2011-06-12

这里还有另外几个比较特殊的网络地址,

0xFFFF -这个一个对全网络中设备进行广播的广播地址<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

0xFFFD -如果在命令中将目标地址设为这个地址的话那么只对打开了接收的设备进行广播

0xFFFC -广播到协调器和路由器

0xFFFE -如果目的地址为这个地址的话,那么应用层将不指定目标设备,而是通过协议栈读取绑定表来获得相应目标设备的短地址

此外的0x00000xFFF8都是有效的目的地址。每一个地址就只是了一个目标设备。

1.单点传送(Unicast)

Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备地址。也就是上面说的使用网络短地址进行发送。这里的关键应该是在网络形成后,如何获得网络中的设备短地址。

2. 间接传送(Indirect)

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

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

上一个版本的ZigBee(ZigBee04),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(Coordinator Binding)。这个版本中的绑定有四种方式,在上几篇文章中也有介绍。绑定的方式应该比使用短地址进行发送来的更灵活一些,TI的几个例子也都已经调试成功,其中有两个例程都是使用的绑定方式。上面有篇文章也重点分析了两种绑定例子。其中一种是经过协调器的绑定,一种是不经过协调器的绑定。


3
广播传送(broadcast)

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

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

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

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

这种发送的话,就和很多的无线发送方式是一样的,现在的CC1110芯片就是采用的广播发送,数据发送出去后,在射频范围之内所以的CC1110无线芯片都可以接收到。上面几种特殊的网络地址,在上面也有简单的介绍。
4
组寻址(Group Addressing)

当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为afAddrGroup并且addr.shortAddr设置为组ID

在使用这个功能呢之前,必须在网络中定义组。(参见Z-stack API文档中的aps_AddGroup()函数)

注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。

下面的代码是一个设备怎样加入到一个ID1的组当中:

aps_Group_t group;

// Assign yourself to group 1

group.ID = 0x0001;

group.name[0] = 0; // This could be a human readable string

aps_AddGroup( SAMPLEAPP_ENDPOINT, &group );

SampleApp例程中我们可以看到下面关于组的定义。

SampleApp_Group.ID = 0x0001;

osal_memcpy( SampleApp_Group.name, "Group 1", 7 );

aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

将组加入到组列表中,其中参数SAMPLEAPP_ENDPOINT表示接收发级该组的信息时通过的端口。

定义目的地址Sample_GrpDstAddr.在发送节点中初始化函数中设置目的地址的地址模式和短地址

Static afAddrType_t Sample_GrpDstAddr;

Sample_GrpDstAddr.addrMode = (afAddrMode_t)afAddrGroup;

Sample_GrpDstAddr.endPoint =SAMPLEAPP_ENDPOINT //端口

Sample_GrpDstAddr.addr.shorAddr = SampleApp_Group.ID //ID

调用下面的函数,给属于SampleApp_Group的设备发送数据

AF_DataRequest( & Sample_GrpDstAddr, &SampleApp_epDesc,

SAMPLEAPP_FLASH_CLUSTERID,

3,

buffer,

&SampleApp_TransID,

AF_DISCV_ROUTE,

AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

这样发送数据的方式也是基本就这些,不管是那种设备都会使用这四种中的其中之一发送数据。其实在这中间绑定的方式是最复杂的,复杂性也带来了一定的灵活性。下面应该是整理一下绑定的过程。其中绑定的具体实现过程也已经在上面的文章中有介绍。只是一个较大的网络中,各种设备的加入、离开对网络通信的影响如何,还有待进一步的研究。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多