当前位置:首页 > 物联网学习笔记 > 正文

zigbee寻址之单点间接广播传送及设备地址获取方法

ZigBee 设备有两种类型的地址。一种是64位IEEE地址,即MAC地址,另一种是16位网络地址。64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设臵。这些地址由 IEEE 来维护和分配。16位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。其中,协调器的网络地址为 0x00.

寻址:为了向一个在 ZigBee 网络中的设备发送数据,应用程序通常使用 AF_DataRequest()函数。数据包将要发送给一个 afAddrType_t(在 ZComDef.h 中定义)类型的目标设备。
typedef struct
{
union
{
uint16
shortAddr;
ZLongAddr_t extAddr;
} addr;
afAddrMode_t addrMode;
byte endPoint;
uint16 panId; // used for the INTER_PAN feature
} afAddrType_t;

注意,除了网路地址之外,还要指定地址模式参数。目的地址模式可以设臵为以下几个值:

typedef enum
{
afAddrNotPresent = AddrNotPresent,
afAddr16Bit= Addr16Bit,
afAddr64Bit= Addr64Bit,
afAddrGroup= AddrGroup,
afAddrBroadcast= AddrBroadcast
} afAddrMode_t;

因为在 Zigbee 中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。这个将在下面详细解释。

单点传送(Unicast)
Uicast 是标准寻址模式,它将数据包发 送给一个已经知道 网络地址的网络设备。将afAddrMode 设臵为 Addr16Bit并且在数据包中携带目标设备地址。
间接传送(Indirect)当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设臵为AddrNotPresent并且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特点称之为源绑定。当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。

上一个版本的 ZigBee(ZigBee2004),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(Coordinator Binding)。

广播传送(broadcast)
当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设臵为AddrBroadcast。目标地址可以设臵为下面广播地址的一种:NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT 在 f8wConifg.cfg 中).NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。

组寻址(Group Addressing)
当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设臵为afAddrGroup 并且 addr.shortAddr 设臵为组 ID。在使用这个功能呢之前,必须在网络中定义组。(参见 Z-stack API 文档中的 aps_AddGroup()函数)。注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。

下面的代码是一个设备怎样加入到一个 ID 为 1 的组当中:
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 );

重要设备地址(Important Device Addresses)
应用程序可能需要知道它的设备地址和父亲地址。使用下面的函数获取设备地址(在 ZStackAPI 中定义):
NLME_GetShortAddr()——返回本设备的 16 位网络地址
NLME_GetExtAddr()—— 返回本设备的 64 位扩展地址

使用下面的函数获取该设备的父亲设备的地址:
NLME_GetCoordShortAddr()——返回本设备的父亲设备的 16 位网络地址
NLME_GetCoordExtAddr()—— 返回本设备的父亲设备的 64 位扩展地址

标签:
上一篇: 下一篇:

报歉!评论已关闭。