【转】物联网开发最佳实践

原文地址:物联网开发最佳实践

IBM development 下的一篇文章。转载的主要目的是看到了作者对于设备离线情况非常充分的考虑,觉得可能对智能硬件开发者会有一些帮助。



假设您已经决定开发一个 IoT 产品。首先,您可以了解许多从移动开发演变而来的实践。具体地讲,考虑以下这些实践:

从服务中分离 API

迭代式地设计解决方案的原型

预测连接问题

化身 (avatar)、服务和解耦的 API

如果您创建过任何类型的 Web 应用程序,那么您可能已经熟悉服务的概念。服务是应用程序提供的能力,是一个系统的传统视图,比如天气数据服务。

使用此服务的是化身,它们是连接 Internet 的 “事物”(可以是软件或实体的智慧事物)。然后,这些化身与此服务的一部分或整个服务进行交互。每个化身独立地与该服务交互,它们联合在一起会让服务变得很强大。

我们以天气数据服务为例。化身可以是一个用户网站或一个显示当前天气读数的移动应用程序。化身也可以是一个连网的气象站,它每分钟都向天气服务报告数据,共享当前温度、湿度和风速。

因为当前一代移动服务非常强大(Google 和具体的 Google Now、Facebook、Twitter,以及其他一些用户应用程序),所以这些服务可通过各种各样的方式来访问,比如桌面应用程序、移动网站、特定的应用程序、第三方应用程序,甚至浏览器插件。每个化身都可以根据需要使用尽可能多或尽可能少的服务,以满足它们一个服务所在的上下文场景的需要。因此,可以将一个 “转发此链接” 按钮(一个服务)嵌入在任何网页(一个化身)上,或者从 Android 上的主屏幕(一个化身)查看一个搜索结果列表(另一个服务)。

促成此方法的关键是设计拥有容易访问的 API 的服务,使每个化身都可有效地根据上下文与之交互。

此方法在硬件领域的一个不错的现代示例是 FitBit。FitBit 拥有一个产品线,它们旨在让健康情况变得更加可度量。尽管某些产品(例如计步器与楼梯跟踪器)之间存在着区别,但核心服务是相同的。这些产品聚合来自传感器的与活动相关的数据,并将聚合的数据提供给用户,使其能根据自己的健康情况制定明智的决策。

从服务角度讲,FitBit 提供了以下服务:

跟踪活动数据(类型、持续时间、消耗的卡路里、发生的时间和心率)

跟踪睡眠数据(睡眠和清醒的持续时间)

跟踪卡路里和水的摄入

跟踪体重数据

向系统中报告数据

从化身的角度讲,不同的化身在 FitBit 设备上表现出不同的行为:

身体健康跟踪器记录信息并将其传回给服务

一个移动应用程序提供聚合的数据的基本视图

一个 Web 应用程序提供更详细的历史趋势视图

第三方系统可将数据推送到该平台中(比如摄食量)

第三方系统可以读取聚合数据(比如步数),将它们添加到自己的服务中

可以看到,解耦服务和生成优秀的 API 为 FitBit 提供了以下这些好处:

服务可以通过不同的化身来表达,从而在不同的位置(您手腕上、口袋里、桌面上)提供值

第三方系统可以通过自己的服务向 FitBit 添加额外的值。

随着移动领域的碎片化(因为更多的公司在与 Apple 竞争),FitBit 可以通过针对任何需要化身的设备(甚至是 Windows Phone)的应用程序来快速且轻松地应对。

这种解耦方法越来越常见,因为应用程序必须同时提供移动和桌面 Web 体验。如果以类似方式设置您的 IoT 服务,随着市场机会的出现,您可以将它用于新的方向。

IoT 产品需要软件和硬件原型

任何构建物理产品的人都知道,您将会从非常简单的原型着手,根据反馈和它们在真实世界中的性能来不断地改进它们。IoT 产品更加复杂,还需要设计软件和网络元素的原型。

考虑可能使用您的 IoT 产品的无数场景时,此挑战会被放大。它可能是一个传感器,但您如何与它交互?是否通过使用移动或 Web 应用程序?配置是否与报告不同?这些接口有多实用?问题清单似乎列不完。

由于移动环境可能导致上下文更改,从而影响服务实用性的性质,移动产品在应对此挑战上已有很长的历史。因此,移动开发通常会从基本的原型开始,随着原型不断完善来提供越来越多的真实功能。这个过程通常包含 4 个阶段:

创建一个简单的交互式 Web 应用程序,它使用一个开发框架来快速说明交互的核心方面。模拟服务对占位符内容的所有调用,以便足以模拟需要呈现信息和与之交互的方式。

随着原型的完善,开始集成服务的简单方面,以便能够确定响应是否合适,以及是否与上下文相关。

开始设计超越功能原型的接口,确保考虑了交互方法、引导需求和反馈

继续完善和集成功能,直到发布该产品

通过迭代式地设计 IoT 产品的原型,可以确保它具有实用价值,而且整合了您服务的正确方面。请注意,不是每个上下文都需要您服务的每个方面。查看一个现代移动银行应用程序,您会看到,除了帐户余额和一些支付/转账交互之外,通常无法自由使用整个银行平台。在移动银行使用的上下文中,用户通常只检查他们是否有足够的钱来就餐或快速支付账单。

除了设计 IoT 服务和化身的原型之外,还可以采用迭代方式设计您在产品中使用的硬件的原型:

从简单、现成的硬件开始。尽管每个人都认为Arduino是一个业余爱好者平台,但实际上它很便宜,而且使用效果很好,足够可靠地快速生成您可以交互的东西。只需几美元,您就可以确定您的想法是否有任何价值,无需投资创建自定义系统主板设计。

使用尽可能多的现成组件来完善原型。将它保持在一定的范围内,以便可以快速拆开重建它。这非常适合通过孔零组件(hole component)和可插拔的模块来设计系统板的原型。使用众所周知的组件,以便您可以设计原型,而不是迷失在实现细节中。

将您的关键组件与它们连接到的系统板分开。利用采用了标准协议(比如 I2C 和 SPI)的组件,这意味着您可以将 Arduino 更换为BeagleBone或Raspberry Pi。

在决定更换硬件之前,尽可能长时间地依靠现有硬件,然后再考虑更换它。

值得注意的是,您可以使用 Raspberry Pi、Arduino、ESP8266 或类似的组件作为 IoT 产品的核心。是的,您有一些很好的理由在需要时使用特定的芯片或系统板。但是,如果创建一个连接 Internet 的花园传感器,ATMEGA328(Arduino 的核心)或 ESP8266 将为您提供足够的自由空间。通过使用现成组件,您可以获得已有的规模优势,以及基本问题已解决的优势。

如今的硬件很容易实施逆向工程。在 IoT 产品中,价值在服务中,而不在各个化身中。因此,昂贵的、定制设计的硬件组件会提高化身的成本,而不会以有意义的方式增加服务的价值(而且可以拉低您产品的价格)。保持您的组件和控制器板模块化。然后,如果需要迁移到更强大或更昂贵的系统板上,您无需再次从头构建所有部分。

原型设计的最后一点是,确保您记录了使用和错误细节。此日志有助于理解系统内有用部分和无用部分,还有助于更快地调试功能,这在原型设计阶段是关键的需求。此日志可以一直保留到生产阶段,记下最终用户在此日志中遇到的明显的隐私问题,以及您需要适当解决的问题。

离线优先设计可以解决连接问题

许多生活在大城市(尤其是美国西部城市)的工程师都认为移动和 wifi 网络的普及是理所当然的。这种错误假设可能导致您的产品完全无用。现代移动和 Web 开发拥有一种称为 “离线优先” 的实践,它旨在构建将能在网络断开时尽可能正常运行的应用程序。所有特性都可能不可用,但断开连接和恢复连接需要是一种不会影响到最终用户的无缝流程。

从移动角度讲,这些一般原则用于促进离线优先设计:

假设网络可能在任何时刻消失 – 甚至(以及特别是)在传输中途消失。

更频繁地使用简短的消息,而不是单条庞大的请求和响应。

使用本地存储来缓冲需要通过网络传输的消息。存储在本地的消息可在离线时排队,或者可在发生故障时再次发送。

确保应用程序评估了连接性,而不要期望用户已经知道连接情况。

在幕后提供数据同步机制,比如首先执行系统状态更新,在以后再同步带版本的数据(使用户可以继续执行自己的任务)。

从 IoT 角度讲,上述许多情况都是存在的,但许多传感器设备都假设永远连接到 wifi。当然,如果您在人口密度很高的地方(比如香港等大城市中心的住宅建筑),可能有 50 – 100 个 wifi 网络在争用同一个信号空间(并相互干扰)。任何参加开发人员大会的人都知道,在 200 位开发人员都使用笔记本电脑、平板电脑和移动电话创建了热点时,wifi 有多可怕。我曾清楚地看到,由于噪音和争用,很多无线模块拒绝在大会上关联。

那么从 IoT 的角度讲,您从这些实践中学到了什么?考虑这些设计要点:

要进一步了解 MQTT,可以阅读 developerWorks 教程 “探索 IBM Bluemix 上的 MQTT 和物联网服务”。

假设网络随时可能中断。

首先在本地编写,然后发送数据。

在服务端,使用 RabbitMQ 等消息排队系统来处理您的消息。

使用轻量型和弹性的消息协议,比如 CoAP 和 MQTT,而不是更重量型的 HTTP。

向服务中构建提醒系统,以便可以诊断某个节点何时断开网络一定时间。此提醒必须是仅供参考的,且不会干扰用户(可能因为设备的电池没电了而出现提醒)。

随着更多设备进入网络空间,网络可靠性无法保证,甚至在家庭网络环境中也是如此。您必须确保离线功能和网络恢复能力是 IoT 开发的关键组件。

结束语

在本文中,我介绍了将 API 与服务解耦,如何能帮助创建强大的 IoT 应用程序。另外,通过使用简单的、模块化的硬件,比如 Arduino 主板,您可以更轻松地开发 IoT 解决方案。最后,通过使用离线优先的移动开发概念,更容易确保您的 IoT 设备在网络上取得成功。您现在已经很好地了解了如何将移动开发最佳实践应用到物联网 (IoT) 开发中,让您的 IoT 更有可能取得成功。

你可能感兴趣的:(【转】物联网开发最佳实践)