如何使用Mozilla软件框架扩展物联网网关

描述

网关设备使得云服务与物联网 (IoT) 终端设备的关系变得更加紧密,加快了处理速度、减少了延时并能保持高利用率。但是,在设计网关时,开发人员很快就发现,他们需要厘清一系列容易混淆的硬件和软件选项,才能将各种物联网外设连接到云。

现在,使用来自 Mozilla 的 Raspberry Pi 和开源软件,开发人员可以快速、高效地实现基于新兴物联网标准的网关。

为指导设计人员了解整个过程,本文首先简要回顾网关在物联网网络中的作用、关键要求及相关实现挑战,然后介绍标准的作用,重点说明万维网联盟 (World Wide Web Consortium) 描述物联网中实体的方法。

最后重点向开发人员介绍如何使用 Mozilla 的 Raspberry Pi 3、无线插件和开源软件快速部署网关。同时本文将特别介绍开发人员如何使用 Mozilla 软件框架轻松扩展其网关,以支持任意数量的外设插件,从而满足特定连接要求。

对网关的需求日益增长

在 Web 上,尽管浏览器平台与服务器平台的底层硬件和软件存在很大差异,但通过使用标准协议,用户能够利用多种浏览器来联系多种多样的服务器。物联网虽然是基于上述许多相同的标准协议而建立,但在实现可持续驱动 Web 的互操作性方面,面临的挑战要大得多。正如 Web 浏览器在请求标头中标识自身身份及其功能一样,物联网设备也需要标准方法来标识其功能及其所提供数据的性质。

然而,在典型的多层物联网架构中,实体的数量和类型可能非常复杂,特别是在包含传感器和致动器的最低层。为了满足这些设备的不同连接需求,网关设备已成为首选解决方案。凭借其支持多种有线和无线连接选项的能力,网关为复杂的物联网系统提供关键服务。物联网开发人员不仅利用网关多种多样的连接能力,而且还通过网关在复杂的物联网中提供更多实质性的服务,因此网关的作用得以显著扩展。

网关的角色

网关设备最简单的作用是缓冲高吞吐量云连接与成百上千的物联网外围设备之间的通信,这些外围设备产生的数据流速率彼此各不相同,甚至相差多个数量级。如果无法连接到云,网关就可以向物联网设备提供本地版本的云服务。相反,如果物联网设备出于任何原因离线,网关可以向云提供虚拟物联网设备,以模拟相应实体物联网设备的基本功能和已知最新状态。在任何一种情况下,即使连接中断,较高级别的物联网应用也能够继续正常运行。

物联网边缘设备通常不受物联网外围设备的实时和功率限制,因此可以利用高性能处理器架构,提供接近物联网数据源的强大处理能力。物联网专家通过将更加先进的云服务甚至是高级机器学习算法迁移到这些设备上,进一步利用这种本地处理能力,为本地进程提供更快的响应循环,或者减少上游流向云应用的数据流的大小。

Amazon Web Services IoT、IBM Watson IoT 和 Microsoft Azure IoT 等商用物联网平台在其端到端服务产品中都提供自己的专有接口和协议(图 1)。然而,由于诸多原因,包括担心被套牢或基于更广泛的需求,物联网应用开发人员继续寻找能够简化更多不同物联网设备和服务之应用的解决方案。

物联网

图 1:诸如 Amazon Web Services (AWS) IoT 之类商用物联网平台使用低层互联网标准来支持物联网应用的每一层,但需要针对业界缺乏物联网特定标准的现状提供自己的解决方案。(图片来源:Amazon Web Services)

尽管其他机构也在定义标准物联网架构的元素,但万维网联盟 (W3C) 是定义物联网标准的领导者。在其不断演进的规范中,W3C 万维物联网 (WoT) 确立了一些关键接口,允许单个设备与网关、云服务器、Web 客户端甚至另一个物联网设备进行通信(图 2)。

物联网

图 2:W3C 通过一系列标准接口和数据模型来实现万维物联网的互操作性,例如封装有每个设备信息的事物描述(三角形)。(图片来源:W3C)

虽然 W3C 架构的细节超出本文范畴,但有几个关键定义值得一提。最重要的其中一项是事物,它同时包含了一个物理设备及其元数据(或事物描述),在图 2 中用小三角形表示。

事物描述不仅列出名称和人类可读描述等基本元数据,还可以凭借各种功能直接支持应用,包括数据分类、验证以及其他实体可以调用的特定端点以执行该特定事物的独特功能。

使用标准通信方法(图 2 中的“WoT 绑定模板 (WoT Binding Templates)”),同一物联网应用中的不同参与者只需要使用新设备或网关的事物描述,即可了解其使用方法及数据功能。借助其数据模型和应用编程接口 (API) 定义,Mozilla 为开发人员提供了用于构建此类互操作网关的首批可用框架之一。

Mozilla 网关

作为其 W3C WoT 工作的一部分,Mozilla 的事物网关规范包括针对事物描述的数据模型、相关事物类型,以及使用 WebSockets 或基本 REST 机制的简单 API。Mozilla 的事物描述指定了基本元数据,包括名称、类型、描述以及各种属性,例如连网 LED 灯的“开”和“亮度”(列表 1)。

副本

{

"name":"My Lamp",

"type": "thing",

"description": "A web connected lamp",

"properties": {

“on": {

"type": "boolean",

"description": “Whether the lamp is turned on",

"href": "/things/lamp/properties/on"

},

"level" : {

"type": "number",

"description": "The level of light from 0-100",

"minimum" : 0,

"maximum" : 100,

"href": "/things/lamp/properties/level"

}

},

"actions": {

"fade": {

"description": "Fade the lamp to a given level",

"input": {

"type": "object",

"properties": {

"level": {

"type": "number",

"minimum": 0,

"maximum": 100

},

"duration": {

"type": "number",

"unit": "milliseconds"

}

}

},

"href": "/things/lamp/actions/fade"

}

},

"events": {

"overheated": {

"type": "number",

"unit": "celsius",

"description": "The lamp has exceeded its safe operating temperature",

"href": "/things/lamp/events/overheated"

}

},

"links": [

{

"rel": "properties",

"href": "/things/lamp/properties"

},

{

"rel": "actions",

"href": "/things/lamp/actions"

},

{

"rel": "events",

"href": "/things/lamp/events"

},

{

"rel": "alternate",

"href": "wss://mywebthingserver.com/things/lamp"

},

{

"rel": "alternate",

"mediaType": "text/html",

"href": "/things/lamp"

}

]

}

列表 1:Mozilla 网关事物描述使用标准 JSON 格式来描述事物及其功能。(代码来源:Mozilla)

事物描述中的其他条目包含用于封装不同操作(例如让灯变暗)的更复杂对象。通过访问事物描述中的“渐淡”操作,网关或其他实体就可以找到函数的入口点,以根据指定属性(例如渐淡级别和持续时间)执行“渐淡”操作。因此,事物描述为识别物联网设备和执行其设计的各种操作提供了一种标准方法。

为了与事物进行交互,开发人员可以使用熟悉的 REST Web 协议来读取 (GET) 或写入(PUT 或 POST)事物描述中定义的事物属性。正常的 REST 响应进而将为请求的数据提供读取或写入操作的状态。

例如,要在两秒钟的过渡时间内使 LED 亮度变淡至 50%,开发人员会将相应的 JSON 主体 POST 到关联的渐淡端点,进而接收 201 响应和 JSON 主体,确认设备排队的请求操作的属性和状态(列表 2)。

副本

POST https://mythingserver.com/things/lamp/actions/

Accept: application/json

{

"fade": {

"input": {

"level": 50,

"duration": 2000

}

}

}

201 Created

{

"fade": {

"input": {

"level": 50,

"duration": 2000

},

"href": "/things/lamp/actions/fade/123e4567-e89b-12d3-a456-426655"

"status": "pending"

}

}

列表 2:使用事物描述中指定的入口点和属性,开发人员可以 POST 渐淡请求,进而接收 201 响应和 JSON 主体,确认请求操作的属性和状态。(代码来源:Mozilla)

尽管 Mozilla 说明文档提供了其数据模型和 API 的详细描述,但要将此理论转化为实际运作的网关,开发人员仍要编写大量软件包。幸运的是,Mozilla 通过提供设计用于 Raspberry Pi 系列的完整实现方案,解决了其规范在理论方面的问题。

网关平台

如前所述,网关因其基本角色是提供多种连接选项以混合和匹配不同的物联网外围设备,所以网关设计要求相对较简单。事实上,Raspberry Pi 系列为构建此类设备提供了有效的硬件基础。最新版本的 Raspberry Pi 3 Model B+ 是该系列的升级版,同时显著提高了有线和无线网络的吞吐量。此外,此开发板基于四核 Arm® Cortex®-A53 应用处理器,为探索前文提到的复杂本地处理功能提供一个有效平台。

无需完全使用 Raspberry Pi 3 Model B+ 的处理潜能,开发人员即可以探索基本的网关功能,只需在开发板上加载一个可从 Mozilla github 资料库免费下载的固件映像即可。该固件实现了一个基本网关,开发人员只需将无线控制器适配器插入 Raspberry Pi 3 开发板的标准 USB 连接器,即可连接无线外设。Mozilla 软件实现针对各种无线 USB 适配器(例如 Sigma Designs ACC-UZB3-U-STA Z-Wave USB 控制器)提供开箱即用的支持。

开发板接通电源后,软件将引导开发人员完成一些基本的初始化步骤,然后立即开始在本地无线环境中搜索设备。通过使用 Web 接口,开发人员只需点击按钮即可将发现的设备连接到网关(图 3A),然后查看或修改相应事物描述中定义的设备属性(图 3B)。

图 3:Mozilla 的事物网关软件可以让用户将事物轻松连接到其网关 (A),并根据其在事物描述中定义的功能,与各个设备进行交互 (B)。(图片来源:Mozilla)

使用生态系统硬件增强网关

除了易于实现基本网关外,Raspberry Pi 生态系统与 Mozilla 开源代码的组合还为开发人员提供了用于扩展基本设计的综合环境。开发人员可以下载设计的完整源代码包,以更好地了解网关操作,更改特定操作特性,甚至创建定制网关应用。该源代码旨在运行于 Node.js 之上,展示了复杂网关软件应用的每个组件的关键设计模式。

使用此开发平台,开发人员可以借助大量可用的硬件扩展板,快速创建能够支持广泛连接选项的网关。例如,将 Pimoroni PIM213 Automation HAT 添加到 Raspberry Pi 开发板上,使网关能够支持工业环境中所需的高电压和高电流有线连接。

对于互联网连接欠佳或无连接的操作环境,通过将 Raspberry Pi 开发板连接到配备 NimbleLink NL-SW-LTE-SVZM20 LTE CAT M1 模块和 Taoglas Limited 4G LTE 天线的 NimbeLink NL-AB-RPI 开发板,为网关添加窄带 LTE 连接。

开发人员的选择不只局限于 Raspberry Pi 插件。他们还可以将不同的适配器卡插入其 Raspberry Pi 开发板,以访问其他接口标准所提供的一系列插件。例如,使用 Seeed Technology 103990079 Arduino 适配器,Digi International XK-WDM 开发板可以将 Digi 的高能效 DigiMesh 网状网络连接功能添加到网关。对于需要标准网状连接选项的应用,可插入 Digi 的 XKB2-Z7T-WZM Zigbee 开发板。

同样,开发人员可以使用 Seeed 103010002 Grove 适配器,借助 Seeed 113060006 Grove LoRaWAN 开发板来支持 LoRaWAN 网状网络,或借助 Seeed 113060000 Grove 射频链路插件来支持扩展覆盖范围的 Sub-GHz 网络。

利用丰富的可用插件,开发人员可以快速扩充其硬件平台,提供多种连接选项。在软件方面,Mozilla 项目为实现支持新硬件所需的软件接口提供了一套明确的要求和示例。

如要为事物网关构建插件,开发人员需要为三类实体提供代码:设备、属性和适配器。设备代码通常会利用特定设备或设备类型所特有的属性和方法(功能)扩展基本 Device 类。

例如,设备模块可能包含与基本设备不同变体相关联的独立类 – 例如基本 LED 一个类和智能灯泡另一个类。Property(属性)模块将扩展基本 Property 类,以提供一组属性类别,其中包含更新特定设备属性的方法,例如 LED 的颜色或亮度(列表 3)。

副本

class TPLinkProperty(Property):

"""TP-Link property type."""

def __init__(self, device, name, description, value):

"""

Initialize the object.

device -- the Device this property belongs to

name -- name of the property

description -- description of the property, as a dictionary

value -- current value of this property

"""

Property.__init__(self, device, name, description)

self.set_cached_value(value)

.

.

.

class TPLinkBulbProperty(TPLinkProperty):

"""Property type for TP-Link smart bulbs."""

def set_value(self, value):

"""

Set the current value of the property.

value -- the value to set

"""

try:

if self.name == 'on':

self.device.hs100_dev.state = 'ON' if value else 'OFF'

elif self.name == 'color':

self.device.hs100_dev.hsv = rgb_to_hsv(value)

elif self.name == 'level':

self.device.hs100_dev.brightness = value

elif self.name == 'colorTemperature':

value = max(value, self.description['min'])

value = min(value, self.description['max'])

self.device.hs100_dev.color_temp = int(value)

else:

return

except SmartDeviceException:

return

self.set_cached_value(value)

self.device.notify_property_changed(self)

.

.

.

列表 3:在创建自己的网关插件软件包时,开发人员可以找出关键设计模式,例如在此代码片段中,展示了基于 Python 的针对 TP-Link 智能设备的事物网关插件中使用的 Property 类。(代码来源:Mozilla)

最后,适配器模块将扩展基本 Adapter 类,以提供类来初始化设备通信通道、支持网络调试以及为其他设备或通信特定功能提供支持。

虽然主要网关包是针对 Node.js 采用 Javascript 实现的,但该平台也正式支持 Python。不过,从概念上讲,开发人员可以用任何合适的语言构建兼容的插件。例如,已有开发人员使用 Rust(Mozilla 类似 C++ 的存储器安全语言)创建了插件。对于能够使用现有 Node.js 后端的开发人员而言,这种相对简单的插件方式提供了一种强大的功能,可快速创建能够通过不同连接选项连接各种物联网外围设备的网关。

总结

对于物联网网关,开发人员面临的挑战是确保不同物联网设备、网关和服务器之间的互操作性。尽管相应标准机构正在快速制定物联网互操作性的合适规范,但开发人员在很大程度上需要将规范转化为可行的解决方案。

如本文所述,通过将 Mozilla 的事物网关软件与 Raspberry Pi 3 结合使用,开发人员可以快速、高效地评估网关应用,并轻松扩展网关以支持不同的连接选项。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分