JN5169 NXP ZigBee PRO 无线网络应用所需的常见操作

Posted Calvin Chan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JN5169 NXP ZigBee PRO 无线网络应用所需的常见操作相关的知识,希望对你有一定的参考价值。

一、NXP ZigBee 软件架构概述

在这里插入图片描述

        NXP ZigBee 3.0 软件包括应用程序编程接口 (API),以促进无线网络的简化应用程序开发。 这些 API 包含可直接合并到应用程序代码中的 C 函数。

提供了两大类 API:

  • ZigBee PRO APIs
  • JCU API

        上图还显示了可用于与 JN516x/7x 设备的片上硬件外设交互的集成外设 API。 此 API 在集成外设 API 用户指南(JN516x 的 JN-UG-3087,JN517x 的 JN-UG-3118)中进行了描述。

        此外,ZigBee 集群库 (ZCL) 为各个集群提供 API,以及更通用的 ZCL 功能。 ZCL 位于堆栈块内。

        ZigBee 3.0 软件开发工具包 (SDK) 中提供了上述所有 API。

1、 ZigBee PRO APIs

        ZigBee PRO API 关注特定于网络的操作以及从应用程序代码与 ZigBee PRO 堆栈的轻松交互。 这些 C 函数 API 在 ZigBee 3.0 SDK 中提供。

共有三个 ZigBee PRO API:

  • ZigBee 设备对象 (ZDO) API:关注本地设备的管理(例如将设备引入网络)
  • ZigBee Device Profile (ZDP) API:关注远程设备的管理(例如设备发现、服务发现、绑定)
  • 应用程序框架 (AF) API:关注创建用于传输和修改设备描述符的数据帧

这些 API 以及 JCU 和 ZCL API 的位置如下图所示。
在这里插入图片描述

2、JCU APIs

        JN51xx 核心实用程序 (JCU) 提供易于使用的界面,以简化一系列非网络特定操作的编程。这些实用程序/模块每个都有一个 C 函数 API,它允许从用户应用程序中使用模块。 JCU 在 ZigBee 3.0 SDK 中提供。

JCU 模块概述如下:

  • 持久数据管理器 (PDM):该模块处理非易失性存储器 (NVM) 中上下文和应用程序数据的存储,以及这些数据的检索。它提供了一种机制,通过该机制 JN516x/7x 设备可以在断电后恢复运行而不会失去连续性。
  • 电源管理器 (PWRM):该模块管理 JN516x/7x 设备进入和退出低功耗模式(例如睡眠模式)的转换。
  • 协议数据单元管理器 (PDUM):该模块涉及管理内存,以及将数据插入要传输的消息中并从已接收的消息中提取数据。
  • 调试模块 (DBG):该模块允许在应用程序运行时输出诊断消息,以帮助调试应用程序代码。

3、API 功能总结

        本节总结了 NXP ZigBee PRO 和 JCU API 在应用程序中的作用。 下表显示了代码中可能需要的不同功能所需的 API:

功能ZigBee PRO APIsJCU APIs
基本功能,包括网络形成和管理ZDO API:网络组建和本地网络管理
ZDP API:网络发现和远程网络管理
基本数据传输AF API:发送和接收数据消息PDUM API:组装和拆卸数据消息
绑定端点以在它们之间传输数据ZDO API:基本绑定
ZDP API:远程绑定表的操作
低功耗模式(睡眠和doze)PWM API:管理低功耗模式
保留上下文数据(例如,用于在不保留内存的情况下在睡眠后恢复操作)PDM API:保存和恢复上下文数据
网络安全ZDO API:管理安全性
用于调试的诊断消息DBG API:生成用于跟踪代码执行的输出

注意:

  • ZigBee PRO API 函数名称以“ZPS”为前缀(用于“ZigBee PRO Stack”函数)。 函数名称还包含“Apl”(用于“应用程序”函数)和函数所属 API 的首字母缩写词:
    • ZDO 函数名称包括“Zdo”(例如 ZPS_eAplZdoPoll())
    • ZDP 函数名称包括“Zdp”(例如 eAplZdpActiveEpRequest())
    • AF 函数名称包括“Af”(例如 ZPS_eAplAfUnicastDataReq())
  • JCU API 函数名称以该函数所属的 JCU 模块的首字母缩写词为前缀:
    • 用于 PDM 功能的“PDM”
    • 用于 PWRM 功能的“PWRM”
    • 用于 PDUM 功能的‘PDUM’
    • DBG 功能的“DBG”

结构和枚举中使用了类似的命名约定。

二、使用 ZigBee PRO API 进行应用编码

        本章概述了如何使用 NXP ZigBee PRO API 的功能来执行 ZigBee PRO 无线网络应用所需的常见操作。

本章涵盖的操作分为以下几个方面:

  • 组建 ZigBee PRO 无线网络
  • 发现已形成网络的属性
  • 管理组地址
  • 绑定节点以便于它们之间的通信
  • 在节点之间传输数据
  • 离开和重新加入网络
  • 返回码和扩展错误处理
  • 实施 ZigBee 安全性
  • 使用支持软件功能 - 消息队列和计时器
  • 使用高级功能

        无线网络生命周期的主要阶段如下图所示。这些阶段包含了本章中描述的许多高级操作。
在这里插入图片描述

        本章中引用的许多函数都是非阻塞函数,它们向网络的相关节点提交请求然后返回——这些函数的名称中有 Request 或 Req。请求的接收者通常会通过向发起请求的节点发送响应来进行回复。收到后,可以使用函数 ZQ_bZQueueReceive() 收集此响应消息。

1、组建和加入网络

        本节介绍如何通过先启动 Co-ordinator 再启动其他节点来组成无线网络,这些节点加入由 Co-ordinator 发起的网络。

重要提示:为了启动任何网络节点,必须为应用程序预先设置某些配置值。此配置是使用 ZPS 配置编辑器执行的。

        在初始化时,所有节点类型都需要相同的函数调用(尽管一旦启动,堆栈将根据特定节点类型执行初始化任务)。下面列出了这些函数调用,按所需顺序排列:

  1. PDUM_vInit() 初始化 JCU 协议数据单元管理器 (PDUM)
  2. PWRM_vInit() 初始化 JCU 电源管理器 (PWRM) 以促进低功耗模式,例如睡眠和 doze
  3. PDM_vInit() 用于初始化 JCU 持久数据管理器 (PDM),以便在断电后保存上下文和应用程序数据以供检索
  4. eZCL_Initialise() 初始化 ZigBee 集群库 (ZCL)
  5. 自定义设备类型的 eZCL_Register(),或标准 ZigBee 设备类型的等效注册函数,为应用程序注册端点
  6. zps_eAplAfInit() 初始化应用程序框架
  7. BDB_vInit() 初始化 ZigBee Base Device
  8. zps_eAplZdoStartStack() 启动 ZigBee PRO 堆栈
  9. u32AHI_Init() 初始化 JN516x 或 JN517x 集成外设 API

注 1:如果您希望使用 JCU 调试模块,则必须在调用上述任何函数之前调用 DBG_vInit()。
注 2:ZigBee PRO 堆栈稍后可以使用 zps_vDefaultStack() 函数重置为其默认状态(删除 NWK 帧计数器之外的上下文数据)。
注 3:路由器或终端设备的 IEEE 802.15.4 MAC 功能可由应用程序使用 zps_vAplAfSetMacCapability() 函数进行配置。

① 启动协调器

        Co-ordinator 必须是第一个启动的节点。该节点是使用 ZPS 配置编辑器预先配置的。必须在 Coordinator 应用程序中调用以初始化节点的函数是本节开头列出的函数。

        使用 zps_eAplZdoStartStack() 启动堆栈后,协调器将通过以下过程建立网络:

  1. 设置网络的无线电频道
    网络的 2.4 GHz 频段信道选择通过 ZPS 配置编辑器预先配置为固定信道(范围 11-26)或一组信道频道将由协调员选择。在后一种情况下,协调器对可能的信道进行能量扫描并选择最安静的信道。
  2. 设置网络的扩展 PAN ID
    请注意,应用程序可以通过在调用 zps_eAplZdoStartStack() 之前调用 zps_eAplAibSetApsUseExtendedPanId() 来覆盖由 ZPS 配置编辑器设置的 EPID 值。
    网络的 64 位扩展 PAN ID (EPID) 获取方式如下:
    • 可以在 ZPS 配置编辑器中的高级设备参数 APS 使用扩展 PAN ID 中设置 预配置值。
    • 如果预设值为零,协调器将使用自己的 IEEE/MAC 地址作为 EPID。
  3. 接受来自其他设备的加入请求(如果启用)协调器现在可以允许其他设备(路由器和终端设备)作为其子设备加入网络,从而使网络能够发展。 Co-ordinator 的(直接)子节点的最大数量通过 ZPS 配置编辑器中的高级网络参数 Active Neighbor Table Size 和 Child Table Size 预先设置,超过此数量协调器将不接受未来子节点的任何进一步加入请求。

注意:初始“允许加入”状态是通过 ZPS 配置编辑器中的协调器参数允许加入时间预先设置的。如果最初禁用此功能,则在使用 zps_eAplZdoPermitJoining() 启用加入之前,协调器可能不会接受子节点。但是,在加入设备上的预设 EPID 不为零的加入期间以及任何重新加入期间,“允许加入”状态将被忽略。上述功能可随时使用,以允许有限时间段或无限期加入,也可用于禁用加入。

        一旦协调器(以及网络)启动,堆栈事件 zps_EVENT_NWK_STARTED 就会在设备上生成。 如果协调器启动失败,则生成堆栈事件 zps_EVENT_NWK_FAILED_TO_START。

        当一个节点加入 Co-ordinator 时,会在 Co-ordinator 上产生堆栈事件 zps_EVENT_NWK_NEW_NODE_HAS_JOINED。

② 启动路由器和终端设备

        路由器或终端设备是使用 ZPS 配置编辑器预先配置的。必须在路由器或终端设备应用程序中调用以初始化节点的函数是本节开头列出的函数。

注意:本节中描述的启动和加入过程仅适用于首次加入(冷启动),而不适用于重新加入。

        使用 zps_eAplZdoStartStack() 启动堆栈后,路由器或终端设备将通过以下过程加入网络:

  • 1、搜索要加入的网络
    作为 zps_eAplZdoStartStack() 函数调用的一部分,设备通过侦听来自附近 ZigBee PRO 网络的路由器和协调器的信标来搜索网络。此搜索的无线电频道通过 ZPS 配置编辑器以与协调器相同的方式预先配置为固定频道(范围 11-26)或一组频道扫描。因此,设备侦听相关信道中的信标。可以选择使用函数 zps_bAppAddBeaconFilter() 引入信标过滤器,以仅考虑来自感兴趣网络的信标 - 可以根据 PAN ID、扩展 PAN ID、LQI 值和设备加入状态/容量过滤信标。完成此搜索后,后续操作取决于 64 位扩展 PAN ID (EPID) 的预设值,该值通过 ZPS 中的高级设备参数 APS Use Extended PAN ID 设置配置编辑器:
    • 如果预设的 EPID 值非零,则该值标识要加入的特定网络(假设协调器已预设为相同的 EPID)。如果在搜索中发现了具有此 EPID 的网络,设备将尝试加入此网络,如下面的步骤 3 中所述(因此绕过步骤 2)。
    • 如果预设的 EPID 值为零,则在 zps_EVENT_NWK_DISCOVERY_COMPLETE 堆栈事件中报告搜索结果,其中包含发现的网络的详细信息。然后设备必须选择要加入的网络,如下面的第 2 步所述。
  • 2、选择要加入的网络
    根据 zps_EVENT_NWK_DISCOVERY_COMPLETE 中的结果,应用程序必须选择设备将尝试加入的网络。搜索结果包含一个推荐网络,该网络被选为检测到的第一个允许节点加入的 ZigBee PRO 网络。但是,应用程序可以自由选择另一个网络,其中该选择可能基于 LQI 值(检测到的信号强度)。
  • 3、向网络提交加入请求
    一旦设备识别出要加入的网络,就必须提交加入网络的请求。如果已设置非零预配置 EPID(见上文),则此加入请求将自动提交,否则必须调用函数 zps_eAplZdoJoinNetwork() 来提交请求。此请求的结果在请求设备上的以下堆栈事件之一中报告:
    • zps_EVENT_NWK_JOINED_AS_ROUTER(如果作为路由器加入)
    • zps_EVENT_NWK_JOINED_AS_ENDDEVICE(如果作为终端设备加入)
    • zps_EVENT_NWK_FAILED_TO_JOIN(如果加入失败)
    在成功的情况下,上面的堆栈事件包含网络已经分配给本地设备的16位网络地址。此外,事件 zps_EVENT_NWK_NEW_NODE_HAS_JOINED 在父节点上生成。如果失败,设备可以通过调用 zps_eAplZdoJoinNetwork() 尝试另一个加入,并在 zps_EVENT_NWK_DISCOVERY_COMPLETE 事件中报告不同的结果。
  • 4、记录网络的EPID供应用使用
    函数 zps_eAplAibSetApsUseExtendedPanId() 现在可用于创建节点已加入网络的 EPID 的持久记录(首先需要使用函数 zps_pvAplZdoGetNwkHandle() 和 zps_u64NwkGetEpid() 获取 EPID 值)。如果创建了此 EPID 记录,则节点将在重置后自动继续在网络中,而无需明确重新加入。
  • 5、路由器接受来自其他设备的加入请求(如果启用)
    路由器现在可以允许其他设备(路由器和终端设备)作为其子设备加入它。路由器的(直接)子节点的数量将受到节点的最大邻居数量的限制,这是通过 ZPS 配置编辑器中的高级网络参数 Active Neighbor Table Size 和 Child Table Size 预先设置的。

注意:初始“允许加入”状态是通过 ZPS 配置编辑器中的路由器参数允许加入时间预先设置的。如果这最初被禁用,路由器可能不会接受子节点,直到使用 zps_eAplZdoPermitJoining() 启用加入。但是,在加入设备上的预设 EPID 不为零的加入期间以及任何重新加入期间,“允许加入”状态将被忽略。上述功能可随时使用,以允许有限时间段或无限期加入,也可用于禁用加入。

        一旦节点加入网络,节点上的每个端点应用程序接下来可能会在远程节点上搜索可与其通信的兼容端点。

注意:可以设置网络,使终端设备或路由器加入特定的父节点。

③ 预定父节点

        可以强制父节点(路由器或协调器)接受某些节点作为其(直接)子节点。函数 zps_eAplZdoDirectJoinNetwork() 可用于此父节点,通过将此节点添加到 Neighbor 表来注册潜在的子节点(具有指定的 IEEE/MAC 和网络地址) - 永远不要直接写入 Neighbor 表。然后父节点将此节点视为孤立的子节点。仅当父节点完全启动并运行时才应调用此函数。

        当指定的子节点之一启动时,其应用程序应调用函数 zps_eAplZdoOrphanRejoinNetwork() 以尝试加入网络,就好像它是以前孤立的节点一样。此函数将启动 ZigBee PRO 堆栈并尝试加入其 EPID 已在节点上预配置的网络(使用 ZPS 配置编辑器)。该函数将只允许节点加入已经知道节点的父节点(在父节点的邻居表中)。

注 1:当使用 zps_eAplZdoOrphanRejoinNetwork() 时,5.1.2 节中描述的启动过程不适用于加入节点,并且不得在该节点上显式调用函数 zps_eAplZdoStartStack()。
注2:当节点以这种方式加入网络时,父节点上的“允许加入”状态将被忽略。

        如果节点成功加入网络(通过指定的父节点),则在父节点上生成堆栈事件 zps_EVENT_NWK_NEW_NODE_HAS_JOINED 并在加入的节点上生成以下堆栈事件之一:

  • zps_EVENT_NWK_JOINED_AS_ROUTER(如果作为路由器加入)
  • zps_EVENT_NWK_JOINED_AS_ENDDEVICE(如果作为终端设备加入)

        这些事件包含父节点分配给加入节点的网络地址。

        如果加入请求不成功,则在加入节点上生成 zps_EVENT_NWK_FAILED_TO_JOIN 事件。

        一旦节点加入了预先确定的父节点,该节点接下来可能会在它可以与之通信的远程节点上搜索兼容的端点。

2、发现网络

        本节介绍如何发现网络的属性,包括一般网络属性、节点地址和特征以及节点提供的服务。 描述了寻找可以相互通信的节点的重要任务。 还描述了节点的“主要发现缓存”的维护 - 该缓存包含有关网络其他节点的信息(并非所有节点都将托管主要发现缓存 - 只有协调器和路由器被允许)。

① 获取网络属性

        当调用函数 zps_eAplZdoStartStack() 以在终端设备或路由器节点(需要找到要加入的网络)上启动堆栈时,就会实现“网络发现”。此外,可以通过调用函数 zps_eAplZdoDiscoverNetworks() 显式启动网络发现。例如,如果初始网络发现没有找到任何合适的网络加入,则可以调用此函数,在这种情况下,该函数可用于启动对先前未扫描的通道的扫描(在下面描述的堆栈事件中详细说明,由初步发现)。

        这两个函数调用最终都会导致终端设备或路由器上的堆栈事件 zps_EVENT_NWK_DISCOVERY_COMPLETE,该事件报告发现的网络的以下属性:

  • 扩展 PAN ID
  • ZigBee 版本
  • ZigBee 堆栈配置文件

        此堆栈事件还指示要加入的推荐网络,该网络被视为检测到的第一个允许节点加入的 ZigBee PRO 网络。

② 寻找兼容的端点

        新加入节点上的端点必须在与之通信的远程节点上找到兼容的端点。远程端点是否兼容的决定基于存储在其简单描述符中的端点属性,特别是支持的输入/输出集群。

        端点应用程序可以通过发送识别所需集群的 Match_Desc_req 请求来发现兼容节点。该请求是通过调用函数 zps_eAplZdpMatchDescRequest() 提交的,它允许将请求作为广播发送到所有节点或作为单播发送到特定节点(发送节点可能已经有网络节点及其地址的记录,因为每个节点在加入网络时会自动在广播中宣布自己)。该请求在 APDU(应用程序协议数据单元)中发送,该 APDU 必须首先使用 PDUM 函数 PDUM_hAPduAllocateAPduInstance() 进行分配。

        满足所提供标准的接收端点使用 Match_Desc_rsp 响应回复请求,收到该响应后,必须使用函数 ZQ_bZQueueReceive() 在请求节点上收集该响应。请求应用程序可以绑定到兼容的端点并使用绑定或寻址与端点通信。

③ 获取和维护节点地址

        为了访问节点信息、将数据从一个节点发送到另一个节点以及将节点绑定在一起,需要网络节点的地址。在大多数这些操作中,应用程序可以指定 64 位 IEEE/MAC 地址或 16 位网络地址,但 ZigBee PRO 堆栈始终使用网络地址。如果应用程序指定了远程节点的 IEEE 地址(而不是网络地址),则网络地址必须仍可用于地址映射中的堆栈 - 见下文。

        节点的 IEEE 地址是在设备制造时分配的并且是固定的,而其网络地址是在设备加入网络时由其父节点动态分配的(如果网络重新启动或设备稍后离开并重新加入网络,此地址可能会更改)。提供函数来获得节点的 IEEE 地址,给定节点的网络地址,或者获得给定 IEEE 地址的网络地址。

注意:节点的 IEEE/MAC 和网络地址可以使用函数 zps_eAplZdpDeviceAnnceRequest() 广播到网络中的所有其他节点。例如,这个函数通常会在节点加入或重新加入网络时被调用。该信息在 Device_annce 公告中发送,必须由接收节点使用函数 ZQ_bZQueueReceive() 收集。

        可以在节点上维护地址映射表,其中该表的每个条目都包含远程节点的地址对 - 64 位 IEEE/MAC 地址和 16 位网络地址。实际上,IEEE/MAC 地址并没有直接存储在地址映射表中,而是存储在 MAC 地址表中——地址映射表包含该地址在 MAC 地址表中的索引。当从远程节点收到 Device_annce 通知时,堆栈会自动更新地址映射(在上面的注释中描述),但也可以使用函数 zps_eAplZdoAddAddrMapEntry() 向此表添加地址对 - 永远不要直接写入地址映射表。如果应用程序使用 IEEE/MAC 地址来识别远程节点,则必须正确维护地址映射。此外,当应用程序级安全性用于从一个节点向另一个节点发送数据时,发送节点上的地址映射必须包含目标节点的条目。

a、获取 IEEE 地址

        您可能希望获得具有给定网络地址的节点的 IEEE 地址 - 例如,为了知道哪个物理节点对应于特定的动态分配的网络地址。

        只需调用函数 zps_u64AplZdoGetIeeeAddr() 即可获取本地节点的 IEEE 地址。

        远程节点的 IEEE 地址可以通过两种方式之一获取,具体取决于本地地址映射表中是否存在该节点的条目:

  • 函数 zps_u64AplZdoLookupIeeeAddr() 可用于在本地地址映射表中搜索与给定网络地址对应的 IEEE 地址。
  • 通过使用函数 zps_eAplZdpIeeeAddrRequest() 提交对具有特定网络地址的节点的 IEEE 地址的请求,可以直接从远程节点获取所需的 IEEE 地址。这个 IEEE_addr_req 类型的请求是在 APDU(应用协议数据单元)中发送的,它必须首先使用 PDUM 函数 PDUM_hAPduAllocateAPduInstance() 进行分配。请求详细信息通过结构 zps_tsAplZdpIeeeAddrReq 指定,其中包括一个选项,用于请求所有目标节点的子节点(如果有)的 IEEE 地址。结果在 IEEE_addr_resp 响应中报告。

b、获取网络地址

        您可能希望获得具有给定 IEEE 地址的节点的网络地址 - 例如,为了了解已动态分配给特定物理节点的网络地址。

        只需调用函数 zps_u16AplZdoGetNwkAddr() 即可获取本地节点的网络地址。

        根据本地地址映射表中是否存在该节点的条目,可以通过两种方式之一获取远程节点的网络地址:

  • zps_u16AplZdoLookupAddr() 可用于在本地地址映射表中搜索与给定 IEEE 地址相对应的网络地址。
  • 通过使用函数 zps_eAplZdpNwkAddrRequest() 提交对具有特定 IEEE 地址的节点的网络地址的请求,可以直接从网络内部获取所需的网络地址。此请求可以是单播或广播,如下所示:
    • 单播到另一个将“知道”所需网络地址的节点(这可能是感兴趣节点的父节点或协调器)
    • 广播到网络
    该请求类型为 NWK_addr_req,在 APDU(应用协议数据单元)中发送,该 APDU 必须首先使用 PDUM 函数 PDUM_hAPduAllocateAPduInstance() 进行分配。请求详细信息通过结构 zps_tsAplZdpNwkAddrReq 指定,其中包括一个选项,用于请求所有目标节点的子节点(如果有)的网络地址。结果在 NWK_addr_resp 响应中报告。

④ 获取节点属性

        提供函数来获取有关网络节点属性的信息。大部分信息都保存在特殊结构的节点上,称为描述符。使用了五种类型的描述符:

  • 节点描述符
  • 节点功率描述符
  • 简单描述符
  • 用户描述符
  • 复杂描述符

        除上述内容外,还可以获得有关节点的活动端点、主要发现缓存和服务的信息。

        下面详细介绍了所需的功能。提供了从本地节点和远程节点获取描述符的函数。当从远程节点获取信息时,该函数在 APDU(应用协议数据单元)中发送请求,必须首先使用 PDUM 函数 PDUM_hAPduAllocateAPduInstance() 分配该请求。请求的结果在必须使用函数 ZQ_bZQueueReceive() 收集的响应中报告。

注 1:当获取远程节点的描述符时,请求可以提交给节点本身或另一个节点,该节点可能在其主要发现缓存中保存所需的描述符。
注 2:包含描述符的结构(参考下文)。
注 3:当 64 位 IEEE/MAC 地址用于识别远程节点时,相应的 16 位网络地址必须在本地地址映射中可用。

a、节点描述符

        节点描述符包含有关节点的基本信息,例如其 ZigBee 节点类型和支持的无线电频段。 以下函数可用于获取节点描述符:

  • zps_eAplAfGetNodeDescriptor() 获取本地节点的节点描述符。 结果存储在 zps_tsAplAfNodeDescriptor 类型的结构中。
  • zps_eAplZdpNodeDescRequest() 请求远程节点的节点描述符。 结果存储在 zps_tsAplZdpNodeDescriptor 类型的结构中。

b、电源描述符

        节点电源描述符包含有关节点支持的电源和当前电源的信息。 以下函数可用于获取功率描述符:

  • zps_eAplAfGetNodePowerDescriptor() 获取本地节点的节点功率描述符。 结果存储在 zps_tsAplAfNodePowerDescriptor 类型的结构中。
  • zps_eAplZdpPowerDescRequest() 请求远程节点的节点功率描述符。 结果存储在 zps_tsAplZdpNodePowerDescriptor 类型的结构中。

        请注意,可以使用 ZPS 配置编辑器在本地节点上设置节点电源描述符的元素。

c、简单描述符

        节点上的每个端点都有一个简单描述符。该描述符中的信息包括端点支持的 ZigBee 设备类型及其输入和输出集群的详细信息。以下函数可用于获取简单描述符:

  • zps_eAplAfGetSimpleDescriptor() 获取本地节点上特定端点的简单描述符。结果存储在 zps_tsAplAfSimpleDescriptor 类型的结构中。
  • zps_eAplZdpSimpleDescRequest() 请求远程节点上特定端点的简单描述符。结果存储在 zps_tsAplZdpSimpleDescReq 类型的结构中。

        返回的简单描述符包括端点的输入簇列表和输出簇列表。

        当从远程节点请求 Simple 描述符时,如果集群列表很长,则 Simple 描述符可能不适合响应的 APDU。在这种情况下,返回的 Simple 描述符将包含不完整的集群列表,但可以使用 zps_eAplZdpExtendedSimpleDescRequest() 恢复列表的其余部分。

        还可以根据端点的简单描述符中的某些标准来搜索节点 - 例如,搜索具有特定输入集群和/或输出集群列表的端点。可以使用函数 zps_eAplZdpMatchDescRequest() 执行此类搜索。

d、用户描述符

        用户描述符是用户定义的字符串,通常用于描述节点(例如“Thermostat”)。 默认情况下,字符串的最大长度为 16。 一个节点不需要有用户描述符——如果有的话,必须在节点描述符中指明。 以下函数可用于访问用户描述符:

  • zps_eAplZdpUserDescSetRequest() 设置远程节点的用户描述符。
  • zps_eAplZdpUserDescRequest() 请求远程节点的用户描述符。 结果存储在 zps_tsAplZdpUserDescReq 类型的结构中。

        上述函数只能用于访问非 NXP 设备(支持该描述符)的用户描述符,因为不支持在 NXP JN516x/7x 设备上存储用户描述符。

e、复杂描述符

        Complex 描述符是一个可选的描述符,它包含设备信息,如制造商、型号和序列号。 函数 zps_eAplZdpComplexDescRequest() 允许请求远程节点的复杂描述符。 但是,NXP ZigBee PRO 堆栈不支持产生有效响应的功能,并且提供此功能只是为了与支持相关功能的非 NXP 产品兼容。

f、活动端点

        可以使用函数 zps_eAplAfSetEndpointState() 将本地节点上的端点配置为启用或禁用。启用的端点被描述为“活动”。可以使用函数 zps_eAplAfGetEndpointState() 获取本地端点的当前状态。

        还可以配置本地端点是否包含在网络发现操作的结果中,例如当 zps_eAplZdpMatchDescRequest() 被调用时。可以使用函数 zps_eAplAfSetEndpointDiscovery() 设置本地端点的“可发现”状态,而可以使用函数 zps_eAplAfGetEndpointDiscovery() 获取此状态。

        可以使用函数 zps_eAplZdpActiveEpRequest() 获取远程上的活动端点列表。此函数向目标节点提交 Active_EP_req 请求,目标节点回复 Active_EP_rsp 响应。如果活动端点列表太长而无法放入响应的 APDU,则返回的列表将不完整。但是,可以使用函数 zps_eAplZdpExtendedActiveEpRequest() 恢复列表的其余部分。请注意,只有当端点处于活动状态且可发现时,它才会包含在列表中。

g、主要发现缓存

        ZigBee 路由节点(路由器或协调器)可能能够托管“主要发现缓存”。这是一个保存在内存中的数据库,包含关于一组网络节点的“发现信息”,通常是子节点,也可能是其他后代节点。保存的关于节点的信息包括节点的地址、描述符(Node、Node Power、Simple)及其活动端点列表。然后远程节点可以询问主要发现缓存以获取有关网络中其他节点的信息。

注意:NXP 节点没有能力保存主要发现缓存,但提供了与保存在其他制造商节点上的主要发现缓存接口的功能。

        函数 zps_eAplZdpDiscoveryCacheRequest() 允许检测包含主要发现缓存的节点。此函数向网络提交 Discovery_Cache_req 请求。具有主要发现缓存的节点使用 Discovery_Cache_rsp 响应进行回复。

        此外,函数 zps_eAplZdpFindNodeCacheRequest() 可用于搜索具有保存有关特定节点信息的主要发现缓存的节点。该函数向网络提交 Find_node_cache_req 请求。在其缓存中具有所需节点信息的节点使用 Find_node_cache_rsp 响应进行回复。

h、服务器

        一个节点可以在 ZigBee PRO 网络中托管一个或多个以下“服务器”:

  • 主要信任中心
  • 备份信任中心
  • 主绑定表缓存
  • 备份绑定表缓存
  • 主要发现缓存
  • 备份发现缓存
  • 网络管理员

        函数 zps_eAplZdpSystemServerDiscoveryRequest() 可用于发现网络中其他节点托管的服务器。 该函数向所有节点广播 System_Server_Discovery_req 请求。 远程节点回复 System_Server_Discovery_rsp 响应,其中包含指示节点托管的服务器的位图。

⑤ 维护主发现缓存

        ZigBee PRO 网络的某些路由节点可能能够托管主发现缓存,其中包含与网络中其他节点相关的“发现信息” 。

注意:NXP 节点没有能力保存主要发现缓存,但提供了与保存在其他制造商节点上的主要发现缓存接口的功能。

        提供了用于将本地节点的“发现信息”存储在另一个节点的主要发现缓存中(通常在父节点或另一个上升节点中)的功能。首先,必须调用 zps_eAplZdpDiscoveryStoreRequest() 为远程节点缓存中的此信息分配内存空间。此函数向远程节点发送 Discovery_store_req 请求,该请求以 Discovery_store_rsp 响应进行回复。然后,本地节点的信息可以使用以下函数存储在远程节点的主要发现缓存中(它们都在请求/响应的基础上运行):

  • 节点描述符:使用 zps_eAplZdpNodeDescStoreRequest() 存储
  • 功率描述符:使用 zps_eAplZdpPowerDescStoreRequest() 存储
  • 简单描述符:使用 zps_eAplZdpSimpleDescStoreRequest() 存储
  • 活动端点列表:使用 zps_eAplZdpActiveEpStoreRequest() 存储

        可以使用函数 zps_eAplZdpRemoveNodeCacheRequest() 从主要发现缓存中删除节点的信息。可以在本地节点上调用此函数以从远程节点的主要发现缓存中删除第三个节点的信息。

⑥ 路由发现

        从一个网络节点到另一个网络节点的路由可以通过实现路由发现来预先建立。 因此,沿途的每个路由节点都将包含一个目标节点的路由表条目,其中该条目由目标地址和“下一跳”地址组成。

ZigBee PRO API 提供了两个函数来启动路由发现:

  • zps_eAplZdoRouteRequest() 可用于建立从本地节点到特定目标节点的路由。
  • zps_eAplZdoManyToOneRouteRequest() 可用于“集中器”节点以实现返回自身的“多对一”路由发现。 结果是集中器一定半径内的路由节点中的路由表将获取以集中器为目的地的条目。

3、管理组地址

“组地址”是一个概念,它简化了到多个节点/端点的数据传输。它是一个集合的 16 位地址,指的是一组目标端点(可能位于不同的节点上)。因此,例如,当一个组地址被指定为数据传输的目标地址时,数据将被传送到相关组中的所有节点/端点。在网络范围的基础上分配和管理组地址是无线网络应用程序的责任。

要接收组寻址通信的节点必须具有组地址表。此表包含有关节点上端点所属的所有组的信息 - 即每个组地址和相关的本地端点号。在接收具有组地址的数据包时查阅该表——如果该组地址存在于表中,则该数据包被传递到相应的端点。

使用 ZPS 配置编辑器在节点上创建组地址表。然后应用程序可以按如下方式维护该表:

  • 可以通过调用本地节点(包含端点)上的函数 zps_eAplZdoGroupEndpointAdd() 将端点添加到组中。
  • 可以通过调用本地节点(包含端点)上的函数 zps_eAplZdoGroupEndpointRemove() 从组中删除端点。或者, zps_eAplZdoGroupAllEndpointRemove() 可用于从它所属的所有组中删除指定的本地端点。

网络中使用的组地址由应用程序开发人员定义。

以上是关于JN5169 NXP ZigBee PRO 无线网络应用所需的常见操作的主要内容,如果未能解决你的问题,请参考以下文章

JN5169 ZigBee 3.0 协议栈之 ZigBee 网络参数

JN5169 JN-AN-1217-Zigbee-3-0-Base-Device

在 BeyondStudio for NXP 使用 Gawk(for JN5169)

在 BeyondStudio for NXP 使用 Gawk(for JN5169)

在 BeyondStudio for NXP 使用 Gawk(for JN5169)

JN5169 ZigBee 3.0 协议栈之 ZPS 配置编辑器