13. Zigbee应用程序框架开发指南 - 多网络支持

1 Zigbee应用程序框架开发指南 - 概述

2 Zigbee应用程序框架开发指南 - 应用程序框架结构

3 Zigbee应用程序框架开发指南 - 应用程序框架目录结构

4 Zigbee应用程序框架开发指南 - 生成应用程序配置文件

5 Zigbee应用程序框架开发指南 - 应用程序框架API

6 Zigbee应用程序框架开发指南 - 应用程序框架Callback接口

7 Zigbee应用程序框架开发指南 - 时间处理

8 Zigbee应用程序框架开发指南 - 事件

9 Zigbee应用程序框架开发指南 - 属性管理

10 Zigbee应用程序框架开发指南 - 命令处理和生成

11 Zigbee应用程序框架开发指南 - 命令行接口(CLI)

12 Zigbee应用程序框架开发指南 - 调试打印接口

13 Zigbee应用程序框架开发指南 - 多网络支持

14 Zigbee应用程序框架开发指南 - 睡眠设备

15 Zigbee应用程序框架开发指南 - 应用程序框架插件

16 Zigbee应用程序框架开发指南 - 扩展ZigBee Cluster Library (ZCL)

17 Zigbee应用程序框架开发指南 - 使用Ember AppBuilder设计应用程序

18 Zigbee应用程序框架开发指南 - 应用框架V6

13 多网络支持

EmberZNet stack支持多种网络配置(请参阅文档AN724:在一个Zigbee芯片上设计多个网络,以获得关于此功能的详细信息)。Zigbee应用程序框架构建于此特性之上,并提供额外的网络管理功能,以帮助客户轻松地构建和部署多网络设备。当发送和接收消息时,在调用回调之前,以及在触发特定类型事件的事件处理程序之前,框架会在网络之间自动切换。这些特性减轻了客户的网络交换负担。

注意:对于EmberZNet PRO 4.7,多网络支持仅限于两个网络。未来将支持两个以上的网络。

13.1 网络上下文

Stack有独立的网络上下文,用于api和stack处理程序。应用于所有stack API调用的“current network”完全由应用程序管理。应用于所有stack处理程序的“callback network”是由stack专门管理的。

应用程序通过使用emberGetCurrentNetwork和emberSetCurrentNetwork来管理当前的网络。当应用程序调用任何stack API时,stack在当前网络的上下文中起作用。例如,调用emberSetCurrentNetwork(0)后接emberGetNodeId()将返回网络0的节点id。一旦设置,当前网络将保持不变,直到应用程序通过对emberSetCurrentNetwork的后续调用进行更改。当前网络不会被stack改变。

Stack处理程序的每次调用都应用于特定的网络。在调用任何Stack处理程序之前,Stack将回调网络设置为适当的网络。例如,当消息到达网络0时,Stack在调用emberIncomingMessageHandler之前设置回调网络。应用程序可以通过使用emberGetCallbackNetwork查询回调网络。在这个例子中,在emberIncomingMessageHandler中,emberGetCallbackNetwork()返回0。回调网络仅应用于Stack处理程序的上下文中。应用程序无法更改回调网络。

在应用程序生命周期的任意给定时刻,当前网络和回调网络可能是不同的。Stack将网络上下文的管理完全留给应用程序。为了减少多网络设备的复杂性,Ember应用程序框架代表应用程序管理网络上下文。

13.1.1 回调网络

在它实现的每个Stack处理程序中,框架在执行任何自己的处理和调用任何自己的回调之前将当前网络设置为回调网络。更具体地说,在每个处理程序的开始,框架执行一个相当于emberSetCurrentNetwork(emberGetCallbackNetwork())的操作。这样,作为Stack处理程序的结果调用的任何代码始终在处理程序本身的上下文中执行。例如,如果设备在网络0上收到GetCurrentPrice消息,Stack调用emberIncomingMessageHandler,回调网络设置为0,框架立即将当前网络设置为网络0。因此,当框架解析消息并最终调用emberAfPriceClusterGetCurrentPriceCallback将消息传递给应用程序时,将设置网络上下文以匹配传入消息的上下文。这就消除了应用程序在接收到消息时检查和设置当前网络本身的需要。

13.1.2 当前网络

由于端点是ZigBee设备执行的许多操作的中心,所以应用程序中的每个endpoint都被分配给一个网络。可以将多个endpoint分配到同一个网络,但是每个endpoint只属于一个网络。网络分配是在AppBuilder的配置过程中设置的,在运行时是不可更改的。当在endpoint上预置任务时,框架会自动将当前网络设置为endpoint的网络。

当使用任何emberAfSend APIs发送消息时,框架在将消息提交到堆栈之前会自动切换到source endpoint的网络。这使应用程序能够构造和发送消息,而不需要检查和设置当前网络。应用程序无法覆盖将在其上发送消息的网络。多网络应用程序必须正确设置所有传出消息的source endpoint。未能设置适当的endpoint将导致错误或意外行为。

当接收到消息时,框架首先验证目标endpoint是否属于消息到达的网络。如果存在不匹配,消息将被丢弃,并且没有zcl级别的响应。这确保了不同网络之间的适当隔离。否则,如前所述,框架切换到传入网络,以便在适当的网络上下文中执行所有后续操作。

框架还在触发cluster、endpoint或网络事件之前设置当前网络。cluster事件对应用程序可用,可用于执行特定于特定cluster和endpoint的操作。endpoint和网络事件在插件中使用,当插件没有实现ZCL cluster或为另一个集群插件提供一些辅助功能时使用。例如,如果endpoint1被分配给网络0,并且endpoint实现了Price cluster server,,那么框架在为endpoint 1调用emberAfPriceClusterServerTickCallback之前将当前网络设置为0。通过在触发这些事件处理程序之前切换网络,应用程序和插件能够立即开始处理,而不需要检查或设置网络。

13.1.3 切换网络

该框架以后进先出(LIFO)数据结构维护活动网络。当它切换网络时,框架实际上通过调用emberAfPushCallbackNetworkIndex、emberAfPushEndpointNetworkIndex或emberAfPushNetworkIndex将新网络“pushes”到LIFO列表中。例如,在实现emberIncomingMessageHandler的开始,框架调用emberAfPushCallbackNetworkIndex将当前网络切换到回调网络。类似地,在发送消息时,框架使用消息的源端点调用emberAfPushEndpointNetworkIndex。在完成处理之后,框架从LIFO列表中“pops”最近的网络,并切换回以前的网络。这是通过调用emberAfPopNetworkIndex来完成的。例如,在emberIncomingMessageHandler和emberAfSendUnicast的末尾,框架调用emberAfPopNetworkIndex切换到先前设置的任何网络。

如果框架因为任何原因必须切换网络,它总是在完成处理后恢复以前的网络。通过这种方式,应用程序可以确保在调用框架API之前和之后,当前网络保持不变。该框架依赖于相同的保证,这意味着当切换网络时,应用程序和所有插件必须单独使用emberAfPush api和emberAfPopNetworkIndex。直接使用emberSetCurrentNetwork将绕过LIFO列表并导致错误。此外,每个成功的推送都必须与相应的pop相匹配。不遵循这个范例将会导致错误。

13.2 配置

AppBuilder用于在框架应用程序中启用和配置多网络功能。配置多网络应用程序的步骤如下:

  • 创建一个或多个网络
  • 为网络分配端点
  • 设置默认网络
  • 为每个网络配置ZigBee设备类型
  • 配置每个网络的安全配置文件

Endpoint被分配到AppBuilder中的“ZCL Clusters”选项卡上的网络。默认情况下,所有endpoints都被分配给一个名为“Primary”的网络。要创建一个新网络并为其分配一个endpoints,请单击Zigbee Stack选项卡的多网络配置区域中的“Add”按钮。出现一个对话框,单击“Create new network”并在相应的文本字段中提供一个惟一的名称,可以在其中创建新网络。要将端点分配到现有网络,请在同一个对话框中选择“Use network”,并从网络列表中选择网络名称。单击“OK”后,端点列表将反映新的网络分配。

为了便于使用, AppBuilder基于用户定义的名称为每个网络生成友好的标识符。这些标识符可用于替代代码中的文字。例如,对于名为“SleepyEndDevice”的网络,应用程序可以调用emberAfPushEndpointNetworkIndex(EMBER_AF_NETWORK_INDEX_SLEEPY_END_DEVICE)来切换到该网络。

使用“ZCL Clusters”可以创建无限数量的网络,但是endpoint最多只能分配给两个网络。在应用程序中有两个以上的活动endpoint是一个错误,Ember AppBuilder不会为这样的应用程序生成配置。另外,如前所述,每个端点属于一个网络,每个网络可以包含多个endpoints。endpoint编号在整个设备上必须是唯一的。例如,网络0和1不能同时包含具有数字标识符1的endpoint。

一旦创建了网络,就可以在AppBuilder中的“Zigbee Stack”选项卡上对其进行配置。网络小部件列出每个网络并显示其是否处于活动状态。活动网络以黑色文本显示,这些网络的endpoint已被分配。非活动网络以灰色斜体显示,这些网络没有分配任何endpoint。非活动网络的名称后面还附加了“(unused)”。

Ember AppBuilder将不活动的网络保存在应用程序配置文件中,但是它不会生成任何与这些网络相关的代码。除了显示网络是活动的还是不活动的之外,网络小部件还指示哪个网络是默认网络。默认网络以粗体显示,并在其名称后面附加了“(default)”。在框架中,默认网络用于初始推送。除非发生另一个push,否则默认网络将应用于所有堆栈API调用。除了前面描述的友好名称的标识符之外,Ember AppBuilder还使用默认网络的索引生成EMBER_AF_DEFAULT_NETWORK_INDEX。要更改默认网络,请选择一个活动网络并单击“Make default”按钮。

可以为每个网络配置ZigBee设备类型和安全配置文件。要更改ZigBee设备类型,请单击网络行中的“ZigBee Device Type”列,然后单击出现在设备类型旁边的按钮。将出现可用的ZigBee设备列表。要配置安全配置文件,请单击网络行中的“Security Type”列,然后单击出现在配置文件旁边的按钮。对于如何为多个网络配置ZigBee设备类型和安全配置文件,存在一些限制,如下所述。

13.2.1 Zigbee 设备类型

在多网络设备中,必须将一个网络配置为休眠终端设备。其他网络可以配置为协调器、路由器、终端设备或休眠终端设备。这个限制在AppBuilder的配置过程中强制执行,并且不能在运行时更改。每个网络的设备类型是在AppBuilder中的“Zigbee Stack”选项卡上配置的。

终端设备支持插件支持单网络终端设备和所有多网络设备的轮询、休眠和重新连接。插件将根据需要进行短轮询或长轮询,在可能的情况下休眠,并在发现自己在没有网络的情况下运行时重新加入。

对于单网络设备,轮询类似于以前的版本,只不过现在轮询是在插件中,而不是构建在核心框架中。这个插件将短轮询时,它期待的数据和长轮询否则。对于多网络设备,插件将在每个网络的基础上进行短轮询或长轮询。例如,如果数据预期在网络0上而不是在网络1上,插件将在网络0上进行短轮询,而在网络1上进行长轮询。该插件允许每个网络使用不同的轮询间隔。例如,网络0可能每秒钟进行一次短轮询,而网络1可能每隔一秒钟进行一次短轮询。这些间隔可以在运行时通过emberAfSetShortPollIntervalQsCallback和emberAfSetLongPollIntervalQsCallback api进行配置。与所有影响单个网络的API一样,应用程序应该在调用任何一个API之前推动适当的网络,然后弹出以恢复之前的网络。

对于单网络设备,sleep也类似于以前的版本。插件将保持清醒、空闲或适当的睡眠状态。对于多网络设备,插件只有在所有网络都处于休眠状态时才会休眠。例如,一个网络上配置为路由器的设备和另一个网络上配置为休眠终端设备的设备将不会休眠,因为预期路由器将保持唤醒状态。对于在所有网络上配置为sleepies的设备,当所有网络都可以休眠时,插件就会休眠。最严格的每个网络睡眠策略决定了每个设备的睡眠策略。

最后,重新连接的工作原理与以前的单网络设备版本相同。在一系列失败的数据轮询之后,插件将尝试重新加入网络。对于多网络设备,过程类似,根据每个网络的数据轮询确定,在每个网络的基础上执行重新连接。

没有终端设备支持插件或应用程序直接提供的等效功能,应用程序将不会轮询、休眠或重新加入。由于管理轮询、休眠和重新连接的复杂性,强烈建议所有构建单网络终端设备的客户和构建任何多网络设备的客户使用该插件。

13.2.2 安全配置

虽然AppBuilder和Zigbee应用程序框架继续支持“None”和“Custom”安全配置文件,但只有“Smart Energy”(SE)和“Home Automation”(HA)配置文件受到多个网络的支持。每个网络可以有不同的安全配置文件,但是在这个版本中只支持SE/SE和SE/HA组合。这个限制在AppBuilder的配置过程中强制执行,并且不能在运行时更改。每个网络的安全配置文件是在AppBuilder中的“Zigbee Stack”选项卡上配置的。
安全性主要由框架来处理,尽管应用程序可以控制在形成和连接设备时使用的初始安全性设置。使用新的emberAfSecurityInitCallback,应用程序可以覆盖每个网络上的初始安全位掩码和扩展安全位掩码。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smartlabs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值