开源技术 * IBM 微讲堂:Kubeflow 系列(观看回放 | 下载讲义) 了解详情

Archived | 从我的第一次 IoT 开发经历中学到的经验

本文已归档

归档日期:: 2020-03-10

此内容不再被更新或维护。 内容是按“原样”提供。鉴于技术的快速发展,某些内容,步骤或插图可能已经改变。

当您着手构建物联网应用程序时,您必须考虑典型软件开发环境之上的各种设备,硬件套件,SDK和通信协议。在初尝 IoT 开发时,我学到了一些重要的经验:

  • 需要试验多种设备 SDK
  • MQTT 是最佳的 IoT 通信协议
  • 容器大大简化了 IoT 开发
  • 可以使用区块链技术来保护 IoT 解决方案

IoT 开发有何独特之处?

由于 IoT 的独特特征,IoT 应用程序开发不同于其他类型的软件开发:

  • 每个 IoT 设备通常都有少量的计算能力。与计算机或智能手机相比,IoT 设备的主要功能不是计算。它们通常仅有一个与为其他用途而设计的设备相连的小型单片机 (MCU) 开发板。

  • IoT 设备拥有自己的编程环境。由于设备的有限计算能力带来的局限性,IoT 设备不可能运行传统的操作系统或开发工具,这些工具是为更强大的设备而设计的。另外,IoT 设备通常没有屏幕或键盘供程序员访问。

  • IoT 设备通常在低带宽和不可靠的网络环境中运行。许多 IoT 设备都是移动设备或位于野外。它们必须连接到可用的无线网络,而且必须在没有网络时保持工作。

  • 部署并管理 IoT 设备软件是一个巨大挑战。没有传统 UI 或可靠的网络,用户几乎不可能在软件升级时手动更新野外的所有设备。

  • IoT 应用程序是机器对机器 (M2M) 应用程序。每个 IoT 设备通常都会生成一系列带时间戳的传感器数据点。对于人类而言,这些数据很难理解,而且提供的价值有限。IoT 数据通常由其他机器和设备进行汇总和处理。

  • IoT 设备可能在野外被篡改。IoT 设备可能比人要多得多。所以,大部分 IoT 设备很长时间无人值守。它们很容易遭到篡改和其他恶意攻击。

经验 1:学习和试验多种设备 SDK

由于 IoT 设备和应用场景的多样性,IoT 应用程序开发偏向于专业化。开发人员必须选择不同的软硬件组合来针对特定用例进行优化,而不选择通用计算机。

在我以前的一篇文章构建实用的 IoT 应用程序 – 空气质量监视器中,我使用 NodeMCU 开发板作为 IoT 应用程序的基础。NodeMCU 拥有一些非常显著的优势(我已在以前的一篇文章初识 NodeMCU 及其 DEVKIT 开发板中介绍过),包括对 wifi 的内置支持、非常低的成本,以及对 LUA 编程语言的支持。但是,NodeMCU 也缺乏大型开发人员社区。因此,NodeMCU 未得到传感器制造商社区的全面测试和支持。尽管大多数传感器都能很好地应用于 NodeMCU(毕竟它支持使用标准数字并模拟 PIN 来实现数据 I/O),但开发人员通常需要执行大量试错工作,才能让系统稳定可靠地工作。

要设计一个简单 IoT 应用程序的原型,还可以从 Arduino 入门工具包开始。Arduino 开发板的优势在于它的简单性。它只是一台带 I/O 引脚的计算机,而且支持多种编程环境,包括对开发人员友好的模块化编程环境和传统的 C 编程语言。因为它有一个大型社区,而且被广泛用于教授开发人员如何编程,所以人们为 Arduino 开发板开发了一个包含传感器、外围设备(比如 wifi、蜂窝网络模块或 LED 灯管)、教程示例和代码示例的生态系统。对于概念证明或教育项目,Arduino 开发工具包是理想选择。

对于需要的不仅是连接传感器的应用程序,可能会发现 Arduino 或 NodeMCU 提供的计算能力不足。Raspberry Pi 开发工具包是一个提供了英特尔 x86 CPU 的低成本开发板。因为 x86 的使用非常广泛,所以许多软件(尤其是开源软件,包括 Linux 社区多年来开发的许多设备驱动程序)可被 Raspberry Pi 开发人员重用。但是,基于 x86 的解决方案的缺点也很明显 – 它很复杂,而且一点也不节能。

除了这些通用的开发工具包之外,还有一些针对特定于行业或应用的解决方案的特殊开发工具包。例如,

  • Nvidia Jetson TX2 模块是一个嵌入式开发板,它支持在监控摄像头和自动驾驶汽车等设备上实现基于 GPU 的深度学习。

  • MATRIX Voice 模块是一个集成开发板,拥有一个麦克风阵列(传感器)、一个专业的语音识别和处理芯片 (FPGA),以及一个 ESP 控制器 (NodeMCU)。它可以嵌入到其他设备中来实现语音控制功能。

此外,还有许多其他垂直行业的专业解决方案。在启动自己的项目之前,一定要研究它们。

经验 2:花点时间学习并使用 MQTT

对于初学者,尽管使用熟悉的HTTP进行网络通信是很有吸引力的,但学习并使用 MQTT 作为通信协议是值得的。对于 IoT 设备生成的时间序列传感器数据,MQTT 是一种更高效、更可靠的协议。

MQTT 提供了一种在服务器与设备之间进行双向通信的机制。服务器可以向设备发送命令,而且可能重新配置设备,以便更好地管理电源、带宽或其他资源。

此外,MQTT 还允许在设备之间进行对等通信。通过将设备组织到不同主题中,设备可以相互或在一个群组中交换数据或命令。这种结构允许开发人员设置一种包含复杂控制模式的设备分层结构。

要进一步了解 MQTT 并开始进行 MQTT 开发,请参阅我以前的一篇文章了解 MQTT – 为什么 MQTT 是最适合物联网的网络协议

经验 3:使用一个容器框架

对于复杂的 IoT 应用程序,有时可能需要管理数百万个野外无人值守设备的软件更新。要完成此工作,我们可以使用软件容器,软件容器可以按需下载新模块并自行更新。OSGi 容器是一个很好的例子。

OSGi 容器是 IBM Pervasive Computing 实验室发明的,它的设计构想是在家庭机顶盒中运行,在无用户干预的情况下,在机顶盒中对它进行远程管理和更新。如今,OSGi 主要用在服务器端应用中,在这些应用中,DevOps 团队需要自动远程管理并跨数据中心更新大量服务器。它成为了重量级 Java EE 应用程序框架的替代方案。但是,由于 OSGi 仍需要 Java 虚拟机和相关的库才能运行,所以它适合那些运行完全成熟操作系统的强大设备上相对复杂的 IoT 应用程序。

开源 OSGi 实现的示例包括以下较流行的实现:

在一个类似 Raspberry Pi 这样的强大设备上,也可以安装 Docker,然后在 Docker 容器中安装 Linux。这使我们能自动在大量设备上安装并管理预先配置的软件。(要进一步了解如何将 Docker 容器用于 IoT 开发,请参阅这篇 IBM Developer 教程。)Docker 和 OSGi 相互补充,因为 Docker 在操作系统级别上管理软件,而 OSGi 在应用程序组件级别上管理软件。

经验 4:IoT 和区块链

最后,安全性和可审计性对 IoT 应用程序至关重要。由于 IoT 应用程序生成了大量的 M2M 数据,而且没有人能实时主动监视这些数据来确保它们的准确性,所以 IoT 应用程序需要在机器之间建立“信任”,并能在发生错误时审计数据。

来自 IoT 设备的数据通常由一系列时间戳事实组成,比如传感器读数和位置。这些数据点是“事实”,因此是不可变的。为了保护数据完整性并预防篡改,系统可能将数据点存储在区块链上。IBM Watson IoT Platform 和 IBM Blockchain 提供了这些服务。要进一步了解如何为 IoT 应用程序实现区块链,可以参阅这篇 IBM Developer 教程将设备数据与 IBM Blockchain 中的智能合约相集成

除了存储数据点之外,区块链还支持 IoT 网络中的交易。一个简单示例是供应链网络中的 RFID。IoT 设备可以跟踪实体商品上贴的 RFID,在商品从一家供应商转移到下一家供应商时记录受信任交易。这些交易并不局限于设备生成的数据。它们还可以用来管理设备自身。例如,对每个设备的位置、状态和配置的任何更改也可以在区块链中记录为事务,以便跟踪设备。

传统区块链有时需要太多计算资源,以至于无法供 IoT 设备使用。现在正在发明类似区块链的新协议来专门解决 IoT 用例。例如,IOTA 项目开发了一个名为 tangle 的网络数据结构(与 chains 相对)来建立信任和不可变性。它可能是 IoT 领域中的区块链的合理替代。时间会证明一切。

结束语

我们讨论了开发 IoT 应用程序的挑战和解决这些挑战的一些方法。具体来讲,由于 IoT 应用程序的多样性和设备上的局限性,学习多种开发工具包、SDK 以及像 MQTT 这样的协议是值得的。为了更好地管理 IoT 应用程序部署和安全性,可以使用容器框架(比如 OSGi 和 Docker)和区块链网络。

本文翻译自:Lessons learned from my first experiences in IoT development(2017-09-13)