zstack1.4.3之应用层的发送函数及绑定(CC2430)

为了在网络中发送数据到一个设备,应用层一般用AF_DataRequest()函数。而被发送的目的设备的地址类型afAddrType_t被定义在“ZComDef.h”中:
typedef struct
{
  union
  {
    uint16      shortAddr;
    ZLongAddr_t extAddr;
  } addr;
  byte addrMode;
} zAddrType_t;

注意:除这个网络地址之外,地址模式参数也需要被指定。目的地址模式可能是如下值之一(AF地址模式被定义在“AF.h”中):
typedef enum
{
  afAddrNotPresent = AddrNotPresent,
  afAddr16Bit      = Addr16Bit,
  afAddrGroup      = AddrGroup,
  afAddrBroadcast  = AddrBroadcast
} afAddrMode_t;
地址模式参数是需要的,因为在ZB中,数据包能被点传输、多点传输或者广播传输。点传输被发送到单个设备,多点传输一定发送到一组设备,广播传输一般被发送到网络中的所有设备。如下是更详细的说明
1)点传输
这是标准地址模式,被用于发送一个数据包到网络中单个已知地址的设备。这个addrMode参数被设置为Addr16Bit,目的网络地址在数据包中一同被发送。
2)间接寻址 ---就是使用绑定,见后面关于绑定
数据包中的最终目的地址不识别的时候使用。该模式被AddrNotPresent设置,而且目的地址没有被指定。代替目的地址的是:一个存储在发送设备协议栈的绑定表格,该表格中有被绑定设备的地址。这个特性被调用是源于绑定。(看后面关于绑定部分)
当被发送的信息包下载到协议栈时,从这个绑定表格中寻找使用的目的地址。然后该信息包被有规则的处理为点对点数据包。如果有多个(大于1)目的地址在绑定表格中被发现,那么该数据包将被拷贝成对应的份数分别发送给他们。
(ZigBee04)版本之前,在协调器中有一个存储绑定表格的选项。因此,发送设备发送数据包到这个协调器,然后协调器在它的绑定表格中查找最终的目的地址,对数据包进行在一次发送。该选项特性在协调器绑定被调用。 
3) 广播传输
该模式在应用层想发送一个数据包到所有网络中的所有设备时被使用。该地址模式被AddrBroadcast被设置,目的地址被设置为下列值之一:
NWK_BROADCAST_SHORTADDR_DEVALL (0xFFFF)-信息将被发送到网络中的所有设备(包括休眠的设备)。对于休眠的设备,这个信息将被保持在它的父节点,直到该休眠设备获得该信息或者该信息时间溢出(在f8wConfig.cfg 中的NWK_INDIRECT_MSG_TIMEOUT选项)。
NWK_BROADCAST_SHORTADDR_DEVRXON (0xFFFD) –该信息将被发送到网络中有接收器并处于IDLE(RXONWHENIDLE)状态下的所有设备。也就是说,除了休眠模式设备的所有设备。
NWK_BROADCAST_SHORTADDR_DEVZCZR (0xFFFC) –该信息被发送到所有路由器(包括协调器) 。 
4) 组地址
该模式用于应用层想发送一个数据包到一个设备组的时候。该地址模式被afAddrGroup设置这个组标志符。
用该特性之前,在网络中,组不得不被定义[ZStack API文档中的] aps_AddGroup()
注意:组能与间接寻址一起结合使用。该目的地址在绑定表格中发现,可以作为点对点或一个组地址。也要注意广播地址可以当作是组被提前设置,一个简单的组寻址的特例,。
例子代码对于一个设备添加它自己到一个组标志符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 );

具体的发送函数是 afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,
uint16 cID, uint16 len, uint8 *buf, uint8 *transID,
uint8 options, uint8 radius );
dstAddr -目标地址指针。
afAddrNotPresent 由反射器(邦定源,也即路由器或者协调器)指定
afAddrGroup 发送到组
afAddrBroadcast 发送广播消息
afAddr16Bit 直接发送到节点(单播)
srcEP -发送终端的终端描述符指针
cID -IDcluster ID如同消息ID,并且在剖面(profile)中各不相同
len -要发送的字节数
buf -指向要发送的数据缓存的指针
transID -事务序列号指针。如果消息缓存发送,这个函数将增加这个数字
options -发送选项,可以由下面一项,或几项相或得到
AF_ACK_REQUEST 0x10 要求APS应答,这是应用层的应答,支在直接发送(单播)时使用。
AF_DISCV_ROUTE 0x20 总要包含这个选项
AF_SKIP_ROUTING 0x80 设置这个选项将导致设备跳过路由而直接发送消息。终点设备将不向其父亲发送消息。在直接发送(单播)和广播消息时很好用。
radius – 最大的跳数,用默认值AF_DEFAULT_RADIUS
afStatus_t – 成功则为ZSuccess(defined in ZComDef.h). 否则 Errorsdefined in ZComDef.h
uint8 afDataReqMTU( afDataReqMTU_t* fields );
找出基于输入参数的最大可发送字节数,返回能发送的最大字节数
fields -要发送的消息类型参数
typedef struct
{
uint8 kvp;
APSDE_DataReqMTU_t aps;
} afDataReqMTU_t;
kvp – 设为false.
typedef struct
{
uint8 secure;
} APSDE_DataReqMTU_t;
aps.secure – 设为false.如果在一个安全网络中此位将自动设置.

绑定

控制 信息从一个应用层到另一个应用层流动的一种机制。在ZB06版本中,绑定机制在所有的设备中被执行。 
      绑定允许应用层发送信息不需要带目的地址,APS层确定目的地址从他的绑定表格中,然后在信息前端加上这个目的地址或组。

注意:在ZB1.0版本中,所有绑定条目存储在协调器中。现在所有绑定条目存储在发送数据的设备中。
建立一个绑定表格
有三种方式建立一个绑定表格: 
    ZDO 绑定请求 – 一个试运转工具能告诉这个设备制作一个绑定报告。 
    ZDO 终端设备绑定请求 – 2设备能告诉协调器他们想建立绑定表格报告。该协调器将使协调并在这两个设备上创建绑定表格条目 
    设备应用 – 在设备上的应用能建立或管理一个绑定表格 。
任何一个设备或应用能在网络中发送一个ZDO信息到另一个设备()建立一个绑定报告。这是调用绑定帮助并且它将建立一个绑定条目为发送设备。
1) ZDO 绑定请求
通过调用函数ZDP_BindReq()发送一个绑定请求。第一个参数(dstAddr
是绑定的源地址的短地址。
这之前应该确定允许绑定,在ZDConfig.h 文件中有参数[ZDO_BIND_UNBIND_REQUEST]允许绑定。
能用同样的参数调用函数ZDP_UnbindReq()移除绑定。
目标设备将调用函数ZDApp_BindRsp()或 ZDApp_UnbindRsp(),反馈绑定或移除绑定的响应,返回其操作状态为ZDP_SUCCESS, ZDP_TABLE_FULLZDP_NOT_SUPPORTED.



2) ZDO 终端设备绑定请求
该机制是用一个按钮按下或其他类似的动作来选择设备在指定时间内被绑定。在规定时间内,该终端设备绑定请求信息被收集到协调器,并创建一个基于模式(profile) ID 和串(cluster) ID的规定的绑定表格条目。默认的终端设备绑定超时时间(APS_DEFAULT_MAXBINDING_TIME)为16S(定义在nwk_globals.h中),但是能被改变。

在所有的应用例子中有一个处理键盘事件的函数[例如在TransmitApp.c文件中的TransmitApp_HandleKeys()函数]。在该函数中,调用了函数ZDApp_SendEndDeviceBindReq()[ZDApp.c],它将收集应用的终端设备的所有信息并调用函数ZDP_EndDeviceBindReq() [ZDProfile.c],发送一个绑定信息到协调器。或者,在SampleLight 和 SampleSwitch例子中,直接调用ZDP_EndDeviceBindReq()函数就实现点亮/关闭灯的功能。

协调器将接收[ZDP_IncomingData() 在 ZDProfile.c]这些信息并分析处理[ZDO_ProcessEndDeviceBindReq() 在 ZDObject.c]这些信息并调用函数ZDApp_EndDeviceBindReqCB() [in ZDApp.c],它将调用ZDO_MatchEndDeviceBind() [ZDObject.c]处理这个请求

当协调器接收到2个匹配终端色后备的绑定请求时,它将启动在绑定设备上创建源绑定条目的处理过程。该协调器有如下处理过程:
1. 发送一个ZDO解除绑定请求到第一个设备。终端设备绑定切换处理,所以解除绑定首先被发送到移除一个存在的绑定条目。
2. 等待ZDO解除绑定响应,如果响应状态为ZDP_NO_ENTRY, 发送一个ZDO绑定请求,在源设备上制作一个绑定条目 。如果该响应为ZDP_SUCCESS, 为第一个设备继续到move on to the cluster ID for the first device (the unbind removed the entry – toggle).
3. 等待ZDO绑定响应. When received, move on to the next cluster ID for the first device.
4. 当第一个设备完成时,对第二个设备做同样的处理。
5. 当第二个设备完成时,发送ZDO 终端设备绑定响应信息到第一个和第二个设备。

3)设备应用绑定管理
在设备上其他进入绑定条目的方式是应用层管理绑定表格。
意思是说,应用层将调用下列函数进入和移除绑定表格条目: 
?    bindAddEntry() –增加绑定表格条目 
?    bindRemoveEntry() – 从绑定表格中移除条目 
?    bindRemoveClusterIdFromList() – 从一个存在的绑定表格项目中移除一个串 ID 
?    bindAddClusterIdToList() – Add a cluster ID to an existing binding table entry
?    bindRemoveDev() – Remove all entries with an address reference
?  bindRemoveSrcDev() – Remove all entries with a referenced source address
?    bindUpdateAddr () – Update entries to another address
?    bindFindExisting () – Find a binding table entry
?    bindIsClusterIDinList() – Check for an existing cluster ID in a table entry
?    bindNumBoundTo() – Number of entries with the same address (source or destination)
?    bindNumOfEntries() – Number of table entries
?    bindCapacity() – Maximum entries allowed
?    BindWriteNV() – Update table in NV.

3.2 配置 源绑定

在你的设备上使能源绑定包括 f8wConfig.cfg文件中的REFLECTOR编译标志,还有在 f8wConfig.cfg中可以看到两个配置条目,就是 NWK_MAX_BINDING_ENTRIES & MAX_BINDING_CLUSTER_IDSNWK_MAX_BINDING_ENTRIES 是绑定表格中入口或者叫条目的最大数目,MAX_BINDING_CLUSTER_IDS 是每个绑定表格中簇 ID 的最大数目。

绑定表格以静态RAM的形式维持(not allocated),所以条目的数量和 簇 ID 的数目会影响到RAM使用的数量。每个绑定表条目是8 bytes + (MAX_BINDING_CLUSTER_IDS * 2 bytes). 除了绑定表格会影响到RAM的使用数量外,绑定配置条目也会影响 the number of entries in the address manager.

你可能感兴趣的:(ZigBee学习)