申明:这是转载一位高手的博客哦!!

这个文档是一个关键了,Z-Stack的应用程序接口。我们在程序中基本上应该调用的是这些API吧。
ZDO层API
实现了所有ZDP(ZigBee Device Profile)定义的命令和回应所需要的函数。ZDP描述了ZDO如何实现普通ZigBee设备的特性,它定义了设备描述和簇,ZDP为ZDO和应用提供一下功能:
设备网络建立
设备和服务发现
节点设备邦定和解邦定服务
网络管理服务
设备发现是ZigBee设备发现其他ZigBee设备的过程。比如将已知的IEEE地址作为数据载荷广播到网络的NWK地址请求,相关设备必须回应并告知其网络地址。服务发现提供了PAN中一个设备发现其他设备提供的服务的能力。它利用多种描述符去指定设备的能力。
当用户需要邦定控制器与被控设备(比如开关和灯)时,将用到邦定和解邦定服务。特别是终端设备邦定支持利用用户的输入来定义控制/被控设备对的简单邦定方法。邦定和解邦服务可以创建和删除邦定表入口。
网络管理服务主要提供给用户和调试工具网络管理的能力,它能够从设备重新获得管理信息,包括网络发现结果,路由表的内容,邻居节点链路质量,邦定表内容。也可以通过解关联将设备从PAN中脱离来控制网络关联。
ZDO设备网络建立
在ZigBee网络中默认ZDApp_Init()[in ZDApp.c]开始器件的启动,但是应用能覆盖整个默认行为,为了使应用接管网络的启动,必须在编译选项中包含HOLD_AUTO_START,推荐同时包含NV_RESTORE(储存ZigBee网络状态到NV)编译选项,包含这个两个编译选项后就需要调用ZDOInitDevice() 来启动网络中的设备。
uint8 ZDOInitDevice( uint16 startDelay )
启动网络中的设备。如果应用想要强制一个“新的”加入(即不恢复网络状态),则应该先调用zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE)来设置ZCD_NV_STARTUP_OPTION 中的ZCD_STARTOPT_DEFAULT_NETWORK_STATE 位。
startDelay  -启动设备的延时。这个延时有一个抖动:
(NWK_START_DELAY + startDelay) + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK)
返回值:
ZDO_INITDEV_RESTORED_NETWORK_STATE      设备的网络状态恢复
ZDO_INITDEV_NEW_NETWORK_STATE       网络状态被初始化。即一个强制“新的”加入,或者没有可供恢复的状态
ZDO_INITDEV_LEAVE_NOT_STARTED       重置前,发送了网络脱离并且重加入被设置为TRUE。因此器件没有启动,但是下次调用此函数将启动。
ZDO消息回馈
通过ZDO_RegisterForZDOMsg()注册消息,应用就能接收任何空中(over the air)消息。
ZStatus_t ZDO_RegisterForZDOMsg( uint8 taskID, uint16 clusterID )
调用此函数请求over-the-air消息,此消息的备份将以OSAL消息发送到任务,接收到消息的任务可以自己解析消息,也可以调用ZDO解析函数来解析消息。只有响应消息有ZDO解析函数。
消息注册并被接收后(OTA),将作为ZDO_CB_MSG (OSAL Msg)发送到应用/任务。消息体(zdoIncomingMsg_t – defined in ZDProfile.h)包含有OTA消息。
taskID      -用来发送OSAL消息的应用任务ID;
clusterID   -想要接收的OTA消息的clusterID。如:NWK_addr_rsp。这些ID定义在ZDProfile.h
返回值:ZStatus_t    -ZComDef.h中ZStatus_t定义的状态值
ZStatus_t ZDO_RemoveRegisteredCB( uint8 taskID, uint16 clusterID )
为OTA消息移除一个请求。
参数必须和ZDO_RegisterForZDOMsg()中的参数相同
ZDO发现API
这些API用来建立和发送ZDO设备和服务发现请求和回复。ZDO API和ZDP命令一一对应,ZDP命令可以在ZigBee协议规范中找到更详细的介绍。
ZDO API Function    ZDP Discovery Command
ZDP_NwkAddrReq()    NWK_addr_req
ZDP_NWKAddrRsp()    NWK_addr_rsp
ZDP_IEEEAddrReq()   IEEE_addr_req
ZDP_IEEEAddrRsp()   IEEE_addr_rsp
ZDP_NodeDescReq()   Node_Desc_req
ZDP_NodeDescRsp()   Node_Desc_rsp
ZDP_PowerDescReq() Power_Desc_req
ZDP_PowerDescRsp() Power_Desc_rsp
ZDP_SimpleDescReq()     Simple_Desc_req
ZDP_SimpleDescRsp()     Simple_Desc_rsp
ZDP_ComplexDescReq()    Complex_Desc_req
ZDP_ActiveEPIFReq()     Active_EP_req
ZDP_ActiveEPIFRsp()     Active_EP_rsp
ZDP_MatchDescReq() Match_Desc_req
ZDP_MatchDescRsp() Match_Desc_rsp
ZDP_UserDescSet()   User_Desc_set
ZDP_UserDescConf() User_Desc_conf
ZDP_UserDescReq()   User_Desc_req
ZDP_UserDescRsp()   User_Desc_rsp
ZDP_EndDeviceAnnce() Device_annce
ZDP_ServerDiscReq()     System_Server_Discovery_req
ZDP_ServerDiscRsp()     System_Server_Discovery_rsp
afStatus_t ZDP_NwkAddrReq( byte *IEEEAddress, byte ReqType,byte StartIndex, byte SecuritySuite )
发送为一个IEEE地址已知的设备请求16位短地址的消息,消息将以广播的形式发送。
IEEEAddress     -发送请求的设备的IEEE地址
ReqType     -希望收到的答复类型
ZDP_NWKADDR_REQTYPE_SINGLE      返回设备的短地址和扩展地址
ZDP_NWKADDR_REQTYPE_EXTENDED    返回设备的短地址和扩展地址,以及所有关联设备的短地址
StartIndex      -应答设备可能含有多条符合应答消息的应答条目,此参数指定请求开始检索的应答条目
SecuritySuite       -消息的安全类型
返回值:afStatus_t   -次函数用AF来发送消息,所以状态值为ZComDef.h中ZStatus_t定义的AF状态值
afStatus_t ZDP_NWKAddrRsp( byte TranSeq, zAddrType_t *dstAddr,
                  byte Status, byte *IEEEAddrRemoteDev,
                  byte ReqType, uint16 nwkAddr,
                  byte NumAssocDev, byte StartIndex,
                  uint16 *NWKAddrAssocDevList,
                  byte SecuritySuite );
这个函数实际上是调用ZDP_AddrRsp()的宏,用来建立和发送网络地址应答
TranSeq –   报文序号
DstAddr -   目标地址
Status –    ZDP_SUCCESS             0
ZDP_INVALID_REQTYPE         1
ZDP_DEVICE_NOT_FOUND    2
Reserved            0x03-0xff
IEEEAddrRemoteDev - 远端设备的64位地址
ReqType –   请求类型
nwkAddr –   远端设备的16位地址
NumAssocDev - 和远端设备相关联的设备及其16位短地址的数目
StartIndex  - 应答消息的开始序号
NWKAddrAssocDevList -相关联的16位地址列表
SecuritySuite - 消息安全类型
afStatus_t ZDP_IEEEAddrReq( uint16 shortAddr, byte ReqType,
                            byte StartIndex, byte SecuritySuite )
已知设备的16位短地址请求64位IEEE地址。
呵呵好多参数都是一看就知道是什么了呢,那就不写出来了,下面的函数也一样的处理了。
afStatus_t ZDP_IEEEAddrRsp( byte TranSeq, zAddrType_t *dstAddr,
                        byte Status, byte *IEEEAddrRemoteDev,
                        byte ReqType, uint16 nwkAddr,
                        byte NumAssocDev, byte StartIndex,
                        uint16 *NWKAddrAssocDevList,
                        byte SecuritySuite );
这个函数实际上是调用ZDP_AddrRsp()的宏,用来建立和发送IEEE地址应答
afStatus_t ZDP_NodeDescReq( zAddrType_t *dstAddr, uint16 NWKAddrOfInterest, byte SecuritySuite );
构建并向目标地址域发送节点描述请求
afStatus_t ZDP_NodeDescMsg( byte TransSeq, zAddrType_t *dstAddr, byte Status,
                        uint16 nwkAddr, NodeDescriptorFormat_t *pNodeDesc,
                        byte SecuritySuite );
DstAddr - 目标地址
NWKAddrOfInterest - 要搜寻的16位短地址
SecuritySuite - 消息的安全类型
afStatus_t ZDP_NodeDescMsg( byte TransSeq, zAddrType_t *dstAddr, byte Status,
                        uint16 nwkAddr, NodeDescriptorFormat_t *pNodeDesc,
                        byte SecuritySuite );
回应节点描述(Node Descriptor)请求。
Status      -   SUCCESS         0
DEVICE_NOT_FOUND    1
pNodeDesc   -指向节点描述的指针(定义在AF.h中)
afStatus_t ZDP_PowerDescReq( zAddrType_t *dstAddr, int16 NWKAddrOfInterest,byte SecuritySuite );
tuzhuke

2010-11-09 09:26:30

构建和发送电源描述请求。实际是调用宏ZDP_NWKAddrOfInterestReq()
afStatus_t ZDP_PowerDescMsg( byte TranSeq, zAddrType_t *dstAddr, byte Status,
                int16 nwkAddr, NodePowerDescriptorFormat_t *pPowerDesc,
                byte SecuritySuite );
回应电源描述请求。
Status      -   SUCCESS         0
DEVICE_NOT_FOUND    1
pPowerDesc  -指向电源描述的指针(定义在AF.h中)
afStatus_t ZDP_SimpleDescReq(  zAddrType_t *dstAddr, uint16 nwkAddr, byte epIntf, byte SecuritySuite );
构建和发送简单描述请求。
epIntf      -希望的应用终端/接口
afStatus_t ZDP_SimpleDescRsp( byte TranSeq, zAddrType_t *dstAddr,  
            byte Status,  SimpleDescriptionFormat_t *pSimpleDesc,
            byte SecuritySuite );
回应简单描述请求。
Status
SUCCESS         0
INVALID_EP      1
NOT_ACTIVE      2
DEVICE_NOT_FOUND    3
afStatus_t ZDP_ComplexDescReq(  zAddrType_t *dstAddr, uint16 nwkAddr, byte SecuritySuite );
构建和发送复杂描述请求。实际是调用宏ZDP_NWKAddrOfInterestReq()
zigbee设备以描述项数据结构刻画自己,包含在描述项中的具体数据在描述中定义,有5种描述:节点,电源,简化,复杂和用户。
afStatus_t ZDP_ActiveEPIFReq( zAddrType_t *dstAddr, uint16 NWKAddrOfInterest,byte SecuritySuite );
构建和发送活动终端/接口请求,实际是调用宏ZDP_NWKAddrOfInterestReq(),用来请求远端设备上所有活动的终端/接口
NWKAddrOfInterest - 搜寻的16位短地址
afStatus_t ZDP_ActiveEPIFRsp( byte TranSeq, zAddrType_t  *dstAddr,
            byte Status, uint16 nwkAddr, byte Count, byte *pEPIntfList,
            byte SecuritySuite );
回应发送的活动终端/接口请求,实际是调用宏ZDP_EPIFRsp()
Status
SUCCESS         0
DEVICE_NOT_FOUND    1
Count – pEPIntfList中活动终端(endpoint)/接口数目
pEPIntfList – 包含器件上终端(endpoint)/接口的数组
afStatus_t ZDP_MatchDescReq( zAddrType_t *dstAddr, uint16 nwkAddr, uint16 ProfileID,
                byte NumInClusters, byte *InClusterList,
                byte NumOutClusters, byte *OutClusterList,
                byte SecuritySuite );
构建并发送匹配描述请求,用来搜寻符合应用列表中某些输入输出簇得器件/接口
ProfileID       - cluster ID相关的ProfileID
NumInClusters       - 输入簇中的cluster ID数目
InClusterList       - 输入cluster IDs的数组
afStatus_t ZDP_MatchDescRsp( byte TranSeq, zAddrType_t *dstAddr, byte Status,
            uint16 nwkAddr, byte Count, byte *pEPIntfList, byte SecuritySuite );
Status      -   SUCCESS         0
DEVICE_NOT_FOUND    1
Count – pEPIntfList中活动终端(endpoint)/接口数目
pEPIntfList – 包含器件上终端(endpoint)/接口的数组
afStatus_t ZDP_UserDescSet( zAddrType_t *dstAddr,uint16 nwkAddr,
                 UserDescriptorFormat_t *UserDescriptor,
                 byte SecurityEnable );
构建并发送User_Desc_set消息来设置远端设备的用户描述,这个请求单播到包含有发现信息的远端设备。远端设备需要定义NV_RESTORE来使能整个函数。
UserDescriptor –配制的用户描述,包含最多16个字符的ASCII字符串,若不足16个字符,则用空字符(0x20)填充到16个
afStatus_t ZDP_UserDescConf( byte TranSeq, zAddrType_t *dstAddr, byte Status, byte SecurityEnable );
调用这个函数来回应User_Desc_Conf
Status      -   SUCCESS         0x00
INV_REQUESTTYPE     0x80
DEVICE_NOT_FOUND    0x81
            NOT_SUPPORTED   0x84
afStatus_t ZDP_UserDescReq( zAddrType_t *dstAddr, uint16 nwkAddr, byte SecurityEnable );
构建并发送User_Desc_Req
ZStatus_t ZDP_UserDescRsp( byte TransSeq, zAddrType_t *dstAddr,
                uint16 nwkAddrOfInterest, UserDescriptorFormat_t *userDesc,
                byte SecurityEnable );
userDesc        -本地设备的用户描述
afStatus_t ZDP_EndDeviceAnnce( uint16 nwkAddr, byte *IEEEAddr,byte capabilities, byte SecurityEnable );
为ZigBee节点设备构建并发送End_Device_annce命令,通知其他ZigBee设备,此设备已加入或者已重新加入网络。此命令包含节点设备的新16位网络地址和64位IEEE地址,即以节点设备的功能。此消息已广播式发送。
afStatus_t ZDP_ServerDiscReq( uint16 serverMask, byte SecurityEnable );
构建并发送包含16位服务器掩码的System_Server_Discovery_req请求消息,以发现特殊系统服务器的位置或者服务器掩码指示的服务器。消息包含RxOnWhenIdle,以广播式发送。
ZStatus_t ZDP_ServerDiscRsp( byte transID, zAddrType_t *dstAddr, byte status,
                uint16 aoi, uint16 serverMask, byte SecurityEnable );

转载于:https://www.cnblogs.com/yqh2007/archive/2011/04/27/2030053.html

ZigBee学习之——ZStack API解读相关推荐

  1. zigbee学习参考(1~42 )

    [原创]ZigBee学习之1--SPI&LCD - 小组 - EDN China [原创]ZigBee学习之2--SPI&LCD - 小组 - EDN China ZigBee学习之3 ...

  2. ZigBee学习之10——MAC层API解读

    ZigBee学习之10--MAC层API解读 其实也算不上什么解读拉,基本上是把官方的文档翻译了一下.在Zigbee中,是分层结构 的,这样做有很多的好处,每一层只负责自己的东西,数据传输更加透明和有 ...

  3. ZigBee学习之11——MAC层API解读2

    ZigBee学习之11--MAC层API解读2 回调函数事件 呵呵,名字很恐怖,其实就是用来应答请求函数的函数调用而已,不要想的太深奥哦! MAC_MLME_ASSOCIATE_IND 当MAC从其他 ...

  4. ZigBee笔记(zstack篇)

    前言 由于一些原因放弃个人博客,先逐渐将博客内容搬运至CSDN,本文原写于年初.zigbee篇默认掌握8051框架. zstack协议栈是ZigBee学习中极为重要的一部分,在实践中我们主要利用官方的 ...

  5. 揭开ZigBee 2006协议栈Z-Stack的”开源“面纱

    我们都在说ZigBee 2006协议栈Z-Stack是开源的,但是这个协议栈到底是全部开源的,还是只是开源一部分,让我们来揭开它的"开源"面纱?     Z-Stack是在2007 ...

  6. Zigbee学习(一)架构及入网

    Zigbee学习(一)架构及入网 文章目录 Zigbee学习(一)架构及入网 前言 一.zigbee是什么? 1.zigbee的特点 2.zigbee的重要概念 二.zigbee架构 1.PHY物理层 ...

  7. 第三章:zigbee学习笔记之物理层和mac层帧格式分析

    本文原地址:https://blog.csdn.net/tainjau/article/details/81634681 IEEE802.15.4工作组致力于无线个人区域网络(wireless per ...

  8. Zigbee学习笔记

    作为一个硬件从业人员,虽然不是从事物理网行业的,但是多少得了解一些,以下是笔者最近学习Zigbee的笔记,包含了Zigbee基本知识,正确的学习方法. Zigbee无线传感网络 先搞清楚IEEE802 ...

  9. 初学api测试_面向初学者的API-在此免费视频课程中学习如何使用API

    初学api测试 What exactly is an API? How do you use an API? We've just published a full beginner's course ...

  10. TF学习——TF之API:TensorFlow的高级机器学习API—tf.contrib.learn的简介、使用方法、案例应用之详细攻略

    TF学习--TF之API:TensorFlow的高级机器学习API-tf.contrib.learn的简介.使用方法.案例应用之详细攻略 目录 tf.contrib.learn的简介 tf.contr ...

最新文章

  1. 高速电路中的AC耦合电容
  2. 基于JSP/SERVLET的省心物流管理
  3. centos下yum安装mysql5.7_CentOS下yum安装mysql5.7
  4. [NSTaggedPointerString text]:unrecognized selector sent to instance
  5. 爬虫技术python流程图_基于Python的网络爬虫技术研究
  6. The valid characters are defined in RFC 7230 and RFC 3986问题
  7. Maven的Pom文件 ( Eclipse中创建Maven工程, 使用注意点,DevOps相关)
  8. Apache Flink 零基础入门(七):Table API 编程
  9. Linux---Samba文件共享服务
  10. java写ev3程序_EV3程序(一)直行
  11. 在线教育直播平台对比(钉钉/保利威/小鹅通)
  12. Hadoop 启动 HDFS DataNode 时报错:Invalid dfs.datanode.data.dir
  13. 面向对象之抽象类与接口【Java】
  14. C++中的常对象和常对象成员
  15. 群晖Docker百度网盘套件一直灰界面
  16. 高效记录任务和提醒的极简ToDo待办事项便签应用
  17. 人工智能的三个阶段——三个阶段总结分析
  18. loadIdealTree:loadAllDepsIntoIdealTree: sill install loadIdealTree
  19. 安卓学习底层开发学习方法?
  20. 【JMX】1. 什么是JMX、JDK中的JMX实现

热门文章

  1. 《Spring Boot极简教程》 第6章 Springboot数据库集成
  2. Java Design Demo -简单的队列-异步多任务队列(java android)
  3. shell 学习之if语句
  4. [转载] 民兵葛二蛋——第7集
  5. Samba服务器配置(2)--认识smb.conf配置文件
  6. JAVA 基础语法(四)——循环结构(while,do...while,for,break,continue)
  7. [2018.04.29 T3] 矩阵
  8. Code[VS]1273 风战
  9. php常用数组,php常用数组函数
  10. oracle ora-27544,数据库启动后,大量报错ORA-27300