找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4224|回复: 0
打印 上一主题 下一主题
收起左侧

zstack(zibee2006)数据的发送和接收模式

[复制链接]
跳转到指定楼层
楼主
ID:71477 发表于 2015-1-1 18:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数据的发送和接收
一、            数据的发送
ZStack2006的协议栈中,我们只需调用函数AF_DataRequest()即可完成数据的发送。
afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,                           uint16 cID, uint16 len, uint8 *buf, uint8 *transID, uint8 options, uint8 radius )
而我们在使用AF_DataRequest() 函数时只需要了解其参数便可以非常灵活的以各种方式来发送数据。AF_DataRequest()函数参数说明如下:
*dstAddr---------------------发送目的地址、端点地址以及传送模式
*srcEP -----------------------源端点
cID ---------------------------ID
len ---------------------------数据长度
*buf -------------------------数据
*transID --------------------序列号
options ----------------------发送选项
radius -----------------------跳数
*dstAddr决定了消息发送到那个设备及那个endpoint,而簇ID(cID)决定了设备接收到信息如何处理。簇可以理解为是一种约定,约定了信息怎么处理。
重要参数说明:
1、地址 afAddrType_t
typedef struct
{
union
{
uint16 shortAddr; //短地址
}addr;
afAddrMode_taddrMode; //传送模式
byteendPoint; //端点号
}afAddrType_t;
2、端点描述符 endPointDesc_t
typedef struct
{
byteendPoint; //端点号
byte*task_id; //那一个任务的端点号
SimpleDescriptionFormat_t*simpleDesc;//简单的端点描述
afNetworkLatencyReq_tlatencyReq;
}endPointDesc_t;
3、简单描述符 SimpleDescriptionFormat_t
typedef struct
{
byte EndPoint; //EP
uint16 AppProfId; //应用规范ID
uint16 AppDeviceId; //特定规范ID 的设备类型
byte AppDevVer:4; //特定规范ID 的设备的版本
byte Reserved:4; //AF_V1_SUPPORTusesforAppFlags:4.
byte AppNumInClusters; //输入簇ID 的个数
cId_t *pAppInClusterList; //输入簇ID 的列表
byte AppNumOutClusters; //输出簇ID 的个数
cId_t *pAppOutClusterList; //输出簇ID 的列表
}SimpleDescriptionFormat_t;
4、簇ID cID
ClusterID--具体应用串ID
5、发送选项 options
发送选项有如下选项
#defineAF_FRAGMENTED 0x01
#defineAF_ACK_REQUEST 0x10
#defineAF_DISCV_ROUTE 0x20
#defineAF_EN_SECURITY 0x40
#defineAF_SKIP_ROUTING 0x80
其中AF_ACK_REQUEST为发送后需要接收方的确认
6、半径、条数 radius
传输跳数或传输半径,默认值为10
数据发送模式说明:在协议栈数据发送模式有以下几种:单播、组播、广播和直接发送四种模式。
广播发送
广播发送可以分为三种,如果想使用广播发送,则只需将dstAddr->addrMode设为
AddrBroadcastdstAddr->addr->shortAddr设置为相应的广播类型即可。具体的定义如下:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有接收机的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。
组播发送
如果设备想传输数据到某一组设备,那么只需将dstAddr->addrMode设为AddrGroup
dstAddr->addr->shortAddr设置为相应的组ID 即可。
代码如下:
//Setupfortheflash command's destinationaddress-Group1
SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;
SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr=SAMPLEAPP_FLASH_GROUP;
根据上面代码的配置,然后使用AF_DataRequest()函数来进行组播发送。
单播发送
单播发送需要知道目标设备的短地址,需要将 dstAddr-> addrMode 设为Addr16BitdstAddr->addr->shortAddr设置为目标设备的短地址即可。
代码如下:
SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddr16Bit;
SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr=0x00;
根据上面代码的配置,然后使用AF_DataRequest()函数来进行点对点发送。
绑定发送
绑定发送目标设备可以是一个设备、多个设备、或者一组设备,由绑定表中的绑定信息决定。绑定发送,需要将dstAddr->addrMode设为AddrNotPresentdstAddr->addr->shortAddr设置为无效地址0xFFFE
代码如下:
ZDAppNwkAddr.addrMode = AddrNotPresent;
ZDAppNwkAddr.addr.shortAddr = 0xFFFE;
根据上面代码的配置,然后使用AF_DataRequest()函数来进行绑定发送。
二、            数据的接受
       在Zstack中,如当接收到OTA信息后,将触发SYS_EVENT_MSG事件下的AF_INCOMING_MSG_CMD事件。我们只需处理AF_INCOMING_MSG_CMD便可。
数据收发实例:
  SampleApp工程中Zstack要周期性的向网络所有设备广发送一个信息,其具体代码如下:
程序代码:
void SampleApp_SendPeriodicMessage( void )
{
  if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                       SAMPLEAPP_PERIODIC_CLUSTERID,
                       1,
                       (uint8*)&SampleAppPeriodicCounter,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}
在这个函数中调用了函数AF_DataRequest()完成数据的发送,发送地址为SampleApp_Periodic_DstAddr,即SampleApp周期信息地址,该地址为0xFFFF,具体参见SampleApp。而簇IDSAMPLEAPP_PERIODIC_CLUSTERID
在接受端触发了目标设备的AF_INCOMING_MSG_CMD事件。具体程序代码如下:
程序代码:
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
  ……
  case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt )
break;
……
}
在对事件AF_INCOMING_MSG_CMD进行处理时,Zstack又调用了函数SampleApp_MessageMSGCB( MSGpkt ),其代码如下:
程序代码:
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  uint16 flashTime;
  switch ( pkt->clusterId )
  {
    case SAMPLEAPP_PERIODIC_CLUSTERID:
      break;
     
    case SAMPLEAPP_FLASH_CLUSTERID:
      flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
      HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
      break;
  }
}
在函数SampleApp_MessageMSGCB( MSGpkt )中会根据接收到信息的簇ID的不同,进行相关的处理,也就是上面提及的簇是一种约定,约定了信息将如何处理。这个实例中Zstack对周期信息的处理就是什么都没有做,可以根据实际需要用户自己添加相关代码。
说明:在Zstack协议栈中数据的发送函数为AF_DataRequest(),但是在SimpleApp实例中,Zstack调用了函数zb_SendDataRequest ()进行数据的发送,其实在函数zb_SendDataRequest ()中最终还是调用了AF_DataRequest()对数据进行的发送。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表