为 Project Things Gateway 创建插件

Project Things Gateway 是一个平台,使用标准化的基于 HTTP 的 API 将所有 IoT 设备整合到一个统一的框架下。目前,该平台仅支持有限数量的设备,我们需要您的帮助来扩展我们的覆盖范围!为新设备添加支持非常简单,我们将引导您完成操作。最棒的是:您可以使用您喜欢的任何编程语言!

高级概念

插件

插件 是一组代码,Gateway 运行这些代码以获得新功能,通常是新的适配器。这松散地模拟了 Firefox 中的 插件系统,其中每个插件都以新颖有趣的方式增加了 Gateway 的功能。

适配器

适配器 是一个对象,它管理与一个或多个设备的通信。这可能是非常细粒度的,例如一个适配器对象与一个 GPIO 引脚进行通信,也可能更广泛,例如一个适配器与 WiFi 上的任何数量的设备进行通信。您决定!

设备

设备 就是它,一个硬件设备,例如智能插座、灯泡或温度传感器。

属性

属性 是设备的单个属性,例如其开/关状态、能耗或颜色。

支持的语言

到目前为止,插件是用 Node.js、Python 和 Rust 编写的,Gateway 平台提供了官方的 JavaScript 和 Python 绑定。如果您想直接跳到主题,可以查看 示例列表。但是,您可以自由地使用您选择的任何语言开发插件,前提是以下内容:

  • 您的插件是 正确打包的
  • 您的插件包捆绑了所有 Gateway 平台上不存在的必需依赖项。
  • 如果您的包包含任何已编译的二进制文件,则必须为 armv6l 架构编译它们。 所有 Raspberry Pi 系列 都与该架构兼容。最简单的方法是在 Raspberry Pi 1/2/Zero 上构建您的包。

实现:深入细节

评估您的目标设备

首先,您需要考虑您要定位的设备。

  • 您的插件将与一个还是多个设备通信?
  • 插件将如何与设备通信?是否需要单独的硬件加密狗?
    • 例如,Zigbee 和 Z-Wave 适配器需要单独的 USB 加密狗才能与设备通信。
  • 这些设备有哪些属性?
  • 您是否可以宣传现有的 Thing 类型?
  • 是否有可以用来与您的设备对话的现有库?
    • 您会惊讶于有多少 NPM 模块、Python 模块、C/C++ 库等存在用于与 IoT 设备通信。

关键是要充分了解您要支持的设备。

从示例开始

最简单的开发方法是从一个 现有插件 (列在下面)开始。您可以下载、复制粘贴或 git 克隆其中一个到

/home/pi/.mozilla-iot/addons/

或者,您可以在其他机器上进行开发。只需确保您在 Raspberry Pi 上进行测试。

之后,您应该编辑package.json文件,以适合您的需求。特别是,name 字段需要与您刚刚创建的目录的名称匹配。

接下来,开始编辑代码。插件生命周期的关键部分是设备创建和属性更新。设备创建通常作为发现过程的一部分发生,无论是通过 SSDP、探测串行设备还是其他方式。在发现设备后,您需要构建它们的属性列表,并确保您处理属性更改(可能是通过您获得的事件,或者您可能需要轮询您的设备)。您还需要处理来自用户的属性更新。

重新启动 Gateway 进程以测试您的更改

$ sudo systemctl restart mozilla-iot-gateway.service

彻底测试您的插件。您可以在 UI 中通过“设置->插件”菜单启用它。

发布您的插件!

运行./package.sh或您必须执行的其他任何操作来打包您的插件。将包托管在某处,例如在 Github 上作为发布。然后,向 addon-list 存储库提交拉取请求或问题。

注意

  • 您的插件将在单独的进程中运行,并通过 nanomsg IPC 与 Gateway 进程通信。希望这对您来说无关紧要。
  • 如果您的插件进程死亡,它将自动重新启动。

示例

Project Things 团队构建了多个插件,这些插件可以作为良好的起点和参考。

Node.js

Python

Rust

参考

其他文档、API 参考等,请参见此处

在我们软件中发现错误?告诉我们!我们很乐意收到问题,或者更好的是,向相应的 Github 仓库提交拉取请求。

关于 James Hobin

25 级电脑巫师,致力于保持物联网的自由和开放。

更多 James Hobin 的文章……

关于 Michael Stegeman

Michael 是 Mozilla 的软件工程师,负责 WebThings。

更多 Michael Stegeman 的文章……


4 条评论

  1. voracity

    HTTP 或 HTTPS?

    有人已经完全或部分地实现了分散式 S 吗?

    2018 年 2 月 10 日 下午 03:09

    1. James Hobin

      当配置为使用我们的隧道服务时,Gateway 通过 HTTPS 提供其 API,使用 Let’s Encrypt 颁发的证书。如果您希望在本地运行,我们支持使用自签名证书进行 HTTPS 运行或作为 HTTP 运行。

      当出现全球实施的标准时,我们当然希望支持分散式 HTTPS。我们一直在关注 W3C HTTPS in Local Networks 社区小组等组织。他们在该领域做了很多有趣的工作:https://www.w3.org/community/httpslocal/

      2018年2月12日 上午8:00

  2. Wim Haanstra

    我正在尝试将自己的适配器集成到这个系统中。我复制了示例插件,并构建了一个小型附加组件,它应该只是向系统添加一个“设备”。

    我有一些问题,希望你能帮忙解答。

    – 我可以关闭SHA256校验和检查吗?每次运行package.sh都比较烦人。
    – 启动服务器(使用npm start)时,它告诉我我的包未启用。但我找不到任何启用它的方法。它没有出现在“设置”>“附加组件”屏幕中。

    2018年2月20日 下午1:11

    1. James Hobin

      感谢你尝试!你可以通过在插件目录中添加一个“.git”目录来关闭SHA256校验和检查,例如 ~/mozilla-iot/gateway/build/addons/philips-hue-adapter/.git。这个目录可以为空,也可以是真正的git目录。

      如果你的包正在加载但未启用,它应该在“设置/附加组件”屏幕中显示,并可以选择启用它。通常网关会提供更多关于正在发生的事情的信息。

      2018年2月20日 下午1:30

本文的评论已关闭。