Zigbee协议栈进行数据发送

Zigbee协议栈进行数据发送Zigbee协议栈进行数据发送是调用AF_DataRequest这个函数,该函数会调用协议栈里面与硬件相关的函数最终将数据通过天线发送出去。  afStatus_tAF_DataRequest(afAddrType_t*dstAddr,//目的地址指针                             endPointDesc_t*srcEP, //发送节点的端点描述符

大家好,又见面了,我是你们的朋友全栈君。Zigbee协议栈进行数据发送是调用AF_DataRequest这个函数,该函数会调用协议栈里面与硬件相关的函数最终将数据通过天线发送出去。

   afStatus_t AF_DataRequest(afAddrType_t *dstAddr, //目的地址指针

                             endPointDesc_t *srcEP, //发送节点的端点描述符指针
                             uint16cID,   //ClusID 簇ID号

                             uint16len,  //发送数据的长度

                              uint8*buf,  //指向存放发送数据的缓冲区指针

                             uint8*transID,//传输序列号,该序列号随着信息的发送而增加                                        uint8 options, //发送选项

                             uint8 radius  //最大传输半径(发送的跳数)

                            )

参数1:afAddrType_t *dstAddr该参数包含了目的节点的网络地址、端点号及数据传送的模式,如单播、广播或多播等。

    afAddrType_t 是个结构体如下:

    typedefstruct
   {

     union
    {

      uint16shortAddr;      //用于标识该节点网络地址的变量
     }addr;
    afAddrMode_taddrMode;  //用于指定数据传送模式,单播、多播还是广播
    byteendPoint;          //端点号
   }afAddrType_t;  // 其定义在AF.h中

 因为在Zigbee中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。因此上述结构体中的afAddrMode_taddrMode 就是用于指定数据传送模式,是个枚举类型,可以设置为以下几个值,

typedef enum
{

  afAddrNotPresent =AddrNotPresent,   //表示通过绑定关系指定目的地址
  afAddr16Bit =Addr16Bit,   //单播发送
  afAddrGroup =AddrGroup,   //组播
  afAddrBroadcast = AddrBroadcast //广播
} afAddrMode_t;

enum
{

  AddrNotPresent = 0,
  AddrGroup = 1,
  Addr16Bit = 2,
  Addr64Bit = 3,
  AddrBroadcast = 15
};
 注意:ZigBee设备有两种类型的地址。一种是64IEEE地址(物理),即MAC地址,另一种是16位网络地址。64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。16为网络地址是当设备加入网络后由协调器或路由器分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。

参数2:endPointDesc_t *srcEP是发送节点的端点描述符指针,在Zigbee网络中,可以通过网络地址找到某个具体的节点,但是具体到某个节点,还有不同的端口(每个节点上最多可支持240个端口),不同节点的端口间可以相互通信。如节点1的端口1可以给节点2的控制端口1发led控制命令,也可以给节点2的端口2发采集命令,但是同一个节点上的端口的网络地址是相同的,所以仅仅通过网络地址无法区分节点1的端口1是与节点2的哪个端口进行通信,因此在发送数据时不但要指定网络地址,还要指点端口号。

因此得出结论:使用网络地址来区分不同的节点,使用端口号区分同一节点上的端口

typedef struct
{

  byte endPoint;  //端点号 
 byte *task_id;  //哪一个任务的端点号(调用任务的ID).
 SimpleDescriptionFormat_t*simpleDesc;  //描述一个Zigbee设备节点,称为简单设备描述符
 afNetworkLatencyReq_tlatencyReq;      //枚举结构,这个字段必须为nolatencyreqs

} endPointDesc_t;      // 其定义在AF.h中

typedefstruct 
  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;    //
 其定义在AF.h中

typedef enum
{

  noLatencyReqs,
  fastBeacons,
  slowBeacons
} afNetworkLatencyReq_t;

参数3 uint16cID 是ClusID簇ID号,一个Zigbee节点有很多属性,一个簇实际上是一些相关命令和属性的集合,在整个网络中,每个簇都有唯一的簇ID,也就是用来标识不同的控制操作的命令号。

参数4 uint16len 是送数据的长度

参数5uint8 *buf  指向发送数据缓冲的指针

参数6uint8 *transID该参数是指向发送序号的指针,每发送一个数据包,该发送序号会自动加1,因此在接收端可以查看接收数据包的序号来计算丢包率。

参数7 uint8options 发送选项,有如下选项 

   #defineAF_FRAGMENTED     0x01 
   #defineAF_ACK_REQUEST     0x10 //要求APS应答,这是应用层的应答,只在直接发送(单播)时使用。
   #defineAF_DISCV_ROUTE     0x20 //总要包含这个选项
   #defineAF_EN_SECURITY    0x40 
   #defineAF_SKIP_ROUTING    0x80 //设置这个选项将导致设备跳过路由而直接发送消息。终点设备将不向其父亲发送消息。在直接发送(单播)和广播消息时很好用。

参数8uint8radius 最大的跳数,取默认值AF_DEFAULT_RADIUS

返回值:afStatus_t类型 枚举型,

typedef enum
{

  afStatus_SUCCESS,
  afStatus_FAILED = 0x80,
  afStatus_MEM_FAIL,
  afStatus_INVALID_PARAMETER
} afStatus_t;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145943.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • jackson对Exception类型对象的序列化与反序列化「建议收藏」

    jackson对Exception类型对象的序列化与反序列化「建议收藏」jackson对Exception类型对象的序列化与反序列化

  • 俄罗斯方块(C语言实现)

    俄罗斯方块(C语言实现)文章目录游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建隐藏光标光标跳转初始化界面初始化方块信息颜色设置画出方块空格覆盖合法性判断游戏主体逻辑函数判断得分与结束主函数游戏说明俄罗斯方块相信大家都知道,这里就不再介绍什么游戏背景了,我这里对本代码实现的俄罗斯方块作一些说明:按方向键的左右键可实现方块的左右移动。按方向键的下键可实现方块的加速下落。按空格键可实现方块的顺时针旋转。按Esc键可退出游戏。按S键可暂停游戏,暂停游戏后按任意键继续游戏。按R键可重新开始游戏。除此之外,本游戏还

  • js获取当前时间的方法_c获取当前时间毫秒

    js获取当前时间的方法_c获取当前时间毫秒1.获取时间vardate=newDate();varyear=date.getFullYear();//返回的是年份varmonth=date.getMonth()+1;//返回的月份上个月的月份,记得+1才是当月vardates=date.getDate();//返回的是几号varday=date.getDay();//周一返回的是1,周六是6,但是周日是0

  • 磁盘显示没有初始化找到数据法子[通俗易懂]

    磁盘显示没有初始化找到数据法子[通俗易懂]没有初始化是因为分区表损坏了,导致移动硬盘出现没有初始化。磁盘显示没有初始化找到数据法子没有初始化是因为分区表损坏了,导致移动硬盘出现没有初始化。磁盘显示没有初始化找到数据法子工具/软件:光明数据恢复软件步骤1:程序打开后,直接双击需要恢复的物理盘,没有初始化需要从磁盘恢复文件。步骤2:坐等软件扫描完成一般需要几分钟到半个小时,稍微耐心等下即可。步骤3:打钩所有需要恢复的文件,然后点右上角的保存,《另存为》按钮,将打钩的文件拷贝出来。步骤4:最后一步只需要等程序将文件复制完成就可以了

  • [Pytorch系列-64]:生成对抗网络GAN – 图像生成开源项目pytorch-CycleGAN-and-pix2pix : 有监督图像生成pix2pix的基本原理[通俗易懂]

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:第1章关键参考信息1.1项目详细论文:Image-to-ImageTranslationwithConditionalAdversarialNetworks论文链接:https://arxiv.org/abs/1611.07004代码链接:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix1.2GAN工作原

  • Android 六大布局之 GridLayout(网格布局)「建议收藏」

    Android 六大布局之 GridLayout(网格布局)「建议收藏」目录GridLayout(网格布局)简述计算器布局的实现GridLayout(网格布局)简述GridLayout布局是Android4.0以后引入的新布局,和TableLayout(表格布局)有点类似,不过它功能更多,也更加好用可以自己设置布局中组件的排列方式 可以自定义网格布局有多少行,多少列 可以直接设置组件位于某行某列 可以设置组件横跨几行或者几列…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号