Zigbee网络中单播、组播、广播通信
2014-05-21 17:51
274 查看
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 //最大传输半径(发送的跳数)
)
参数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
};
看到这里知道了通信方式在哪里设置了,那不同的通信模式,我们要怎么设置哪些参数呢?
单播:注意:其实单播有两种方式一种是绑定传输my_DstAddr.addrMode=(afAddrMode_t)
AddrNotPresent,一种是直接指定目标地址的单播传输,比如协调器就是0x0000。绑定后面再学吧!
单播绑定传输:
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit; //单播发送
my_DstAddr.endPoint=GENERICAPP_ENDPOINT; //目的端口号
my_DstAddr.addr.shortAddr=0; //按照绑定的方式进行单播,不需要指定目标地址,需要先将两个设备绑定,将两个设备绑定后即可通信
直接指定目标地址的单播传输:是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备,将afAddrMode 设置为Addr16Bit 并且在数据包中携带目标设备地址。
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit; //单播发送
my_DstAddr.endPoint=GENERICAPP_ENDPOINT; //目的端口号
my_DstAddr.addr.shortAddr=0x0000; //目标设备网络地址
广播:当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为
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; //协调器网络地址
组播:当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为
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赋值:
// By default, all devices start out in Group 1
SampleApp_Group.ID = 0x0003; //初始化组ID
osal_memcpy( SampleApp_Group.name, "Group 3", 7 ); //将组名的长度写入name数组的第一个元素位置处
3.在本任务里将端点加入到组中:
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
4.设定通信的目标地址及模式:
// Setup for the flash command's destination address - Group 1
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 )
{
// Remove from the group
aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
}
注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。
afStatus_t AF_DataRequest( afAddrType_t *dstAddr, //目的地址指针
endPointDesc_t
*srcEP, //发送节点的端点描述符指针
uint16
cID, //ClusID 簇ID号
uint16
len, //发送数据的长度
uint8
*buf, //指向存放发送数据的缓冲区指针
uint8
*transID,//传输序列号,该序列号随着信息的发送而增加 uint8
options, //发送选项
uint8
radius //最大传输半径(发送的跳数)
)
参数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
};
看到这里知道了通信方式在哪里设置了,那不同的通信模式,我们要怎么设置哪些参数呢?
单播:注意:其实单播有两种方式一种是绑定传输my_DstAddr.addrMode=(afAddrMode_t)
AddrNotPresent,一种是直接指定目标地址的单播传输,比如协调器就是0x0000。绑定后面再学吧!
单播绑定传输:
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit; //单播发送
my_DstAddr.endPoint=GENERICAPP_ENDPOINT; //目的端口号
my_DstAddr.addr.shortAddr=0; //按照绑定的方式进行单播,不需要指定目标地址,需要先将两个设备绑定,将两个设备绑定后即可通信
直接指定目标地址的单播传输:是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备,将afAddrMode 设置为Addr16Bit 并且在数据包中携带目标设备地址。
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit; //单播发送
my_DstAddr.endPoint=GENERICAPP_ENDPOINT; //目的端口号
my_DstAddr.addr.shortAddr=0x0000; //目标设备网络地址
广播:当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为
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; //协调器网络地址
组播:当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为
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赋值:
// By default, all devices start out in Group 1
SampleApp_Group.ID = 0x0003; //初始化组ID
osal_memcpy( SampleApp_Group.name, "Group 3", 7 ); //将组名的长度写入name数组的第一个元素位置处
3.在本任务里将端点加入到组中:
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
4.设定通信的目标地址及模式:
// Setup for the flash command's destination address - Group 1
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 )
{
// Remove from the group
aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
}
注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。
相关文章推荐
- Zigbee单播、组播、广播网络通信
- zigbee网络单播、广播和组播--简单笔记
- 【Linux网络编程】广播、组播与本地网络通信
- 网络通信:单播、广播、组播
- ZigBee广播通信原理及ZigBee网络的一些特性
- 网络通信中的单播、广播和组播的实现
- 网络通信:单播、广播、组播
- 为什么OSPF在广播网络里面,DD和LSR采用单播,而LSU hello采用组播。
- python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
- 一种新的无线网络通信技术Zigbee
- 网络编程之 广播 组播 域内套接字
- 关注zigbee(五)--单播,组播,广播
- ZigBee_CC2530_02H_广播通信地址
- 网络通信之单播,广播,多播
- 网络通信--广播C/S
- ZigBee网络通信概念区分
- 网络通信之如何广播发送
- ZigBee_CC2530_02H_广播通信地址
- 基于ZigBee的短距离无线通信网络技术
- 网络编程--广播&组播