阅读更多

4顶
1踩

互联网

转载新闻 物联网开发最佳实践

2015-10-10 15:20 by 副主编 mengyidan1988 评论(1) 有6476人浏览
假设您已经决定开发一个 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 个阶段:

1.创建一个简单的交互式 Web 应用程序,它使用一个开发框架来快速说明交互的核心方面。模拟服务对占位符内容的所有调用,以便足以模拟需要呈现信息和与之交互的方式。
2.随着原型的完善,开始集成服务的简单方面,以便能够确定响应是否合适,以及是否与上下文相关。
3.开始设计超越功能原型的接口,确保考虑了交互方法、引导需求和反馈
4.继续完善和集成功能,直到发布该产品
通过迭代式地设计 IoT 产品的原型,可以确保它具有实用价值,而且整合了您服务的正确方面。请注意,不是每个上下文都需要您服务的每个方面。查看一个现代移动银行应用程序,您会看到,除了帐户余额和一些支付/转账交互之外,通常无法自由使用整个银行平台。在移动银行使用的上下文中,用户通常只检查他们是否有足够的钱来就餐或快速支付账单。

除了设计 IoT 服务和化身的原型之外,还可以采用迭代方式设计您在产品中使用的硬件的原型:
1.从简单、现成的硬件开始。尽管每个人都认为 Arduino 是一个业余爱好者平台,但实际上它很便宜,而且使用效果很好,足够可靠地快速生成您可以交互的东西。只需几美元,您就可以确定您的想法是否有任何价值,无需投资创建自定义系统主板设计。
2.使用尽可能多的现成组件来完善原型。将它保持在一定的范围内,以便可以快速拆开重建它。这非常适合通过孔零组件(hole component)和可插拔的模块来设计系统板的原型。使用众所周知的组件,以便您可以设计原型,而不是迷失在实现细节中。
3.将您的关键组件与它们连接到的系统板分开。利用采用了标准协议(比如 I2C 和 SPI)的组件,这意味着您可以将 Arduino 更换为BeagleBone 或 Raspberry Pi。
4.在决定更换硬件之前,尽可能长时间地依靠现有硬件,然后再考虑更换它。
值得注意的是,您可以使用 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 更有可能取得成功。

本文转自:developerworks
来自: developerworks
4
1
评论 共 1 条 请登录后发表评论
1 楼 qaz1234 2015-10-13 16:34
这翻译的什么东西,能用心点不?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • “undefined reference to“ 问题汇总及解决方法 ------非常非常好的一篇文章

    转载地址:https://segmentfault.com/a/1190000006049907?utm_source=tuicool&utm_medium=referral 在实际编译代码的过程中,我们经常会遇到"undefined reference to"的问题,简单的可以轻易地解决,但有些却隐藏得很深,需要花费大量的时间去排查。工作中遇到了各色各样类似的问题,按照以下几

  • 这些年我记下的一些编程错误

    编程不经历错误或警告,怎能见彩虹,没有人能随随便便成为高手。身为程序员的我们,如果哪一天没有了错误或警告的提示,一定会有一种不祥的预感,对吧,都懂的。编程N年来,碰到过的问题多得自己都记不清了,你也一样,如果可以选择,我愿时光倒流,真希望都能记下来,现在就可以写本《错误集》了,。下面是我心情好时,有想法时,随手记下的几个错误或警告,遗憾的是,这些年,就记下那么几个而已,见笑了,希望能给像我一样在路

  • 一个低级错误

    <br />以前编译php的时候没有加--enable-maintainer-zts参数,前两天由于需要加了这个参数,重新configure了一下,然后再make发现报错了,于是连错误是什么都没有看就开始如无头苍蝇一搬可以瞎折腾,折腾到最后没有任何结果,没办法了就重新下了一个php代码来完全重新搞一次,结果这回编译过去,回过头来再看这个错误,觉得相当无语:<br /> /* Font Definitions */ @font-face {font-family:宋体; panos

  • C++/nvcc/cuda 编译文件 出现 undefined reference to `cv::String::deallocate()'的解决方法

    从错误中可以看出 是CV没用被定义,也就是编译的时候没有包含库 加上 pkg-config --cflags --libs opencv 也就是nvcc -lglut -lGL pkg-config --cflags --libs opencv main.cu 可以解决 如果还是报错 就是没安装Opencv 参考 https://www.cnblogs.com/mypsq/p/6114824....

  • undefined reference to `__ctype_b_loc'

    xxx.a(libbbb.so): undefined reference to `__ctype_b_loc' xxx.a(libbbb.so): undefined reference to `__ctype_tolower_loc' 因为我的编译工具链是mips-linux-uclibc-gnu-gcc-4.7.2 而用了lib-5.4.0的库(交叉编译) 用对应版本的库OK ...

  • 'undefined reference to `__ctype_tolower' 或 '__ctype_b'

    转自:http://zhidao.baidu.com/question/29478934.html 'undefined reference to `__ctype_tolower' 或 '__ctype_b' 用make编译一个open client程序时(rh9+sybase12.5),出现错误: /home/sybase/OCS-12_5/lib/libsybdb.a(dbcursu

  • undefined reference to `__ctype_b'

    最近编译一个程序,老是出错:lib/openssl/linux/lib/libcrypto.a(b_print.o): In function `_dopr:b_print.c:(.text+0xd74): undefined reference to `__ctype_bb_print.c:(.text+0xddf): undefined reference to `__ctype_b到网

  • 更改引用高版本glibc的程序到引用低版本的glibc

    1:问题背景描述 在拥有高版本glibc的机器上编译分布式xgboost程序,结果在拥有低版本glibc版本的集群机器上无法运行,总是报错,显示缺少glibc_2.14,为了解决整个问题,google查阅了很多资料,大体给出了两种方案: 方案一:升级集群所有机器的glibc版本以满足程序运行要求,但是升级glibc是有很大风险的,尤其是在生产环境,风险最大,所以放弃这个方法! 方案二:在低版...

  • glibc: _dl_addr

    文章目录问题分析glibc 调用关系 问题 在调试一个程序的CPU使用率高的案例,发现 _dl_addr 使用比较高; Samples: 895K of event ‘cpu-clock’, Event count (approx.): 223810000000 Children Self Command Shared Object Symbol 40.34% 39.96% manager libc-2.17.so

  • undefined symbol: _dl_sym, version GLIBC_PRIVATE

    ImportError: /home/tux/conda/envs/real_sem/lib/python3.8/site-packages/paddle/fluid/core_avx.so: undefined symbol: _dl_sym, version GLIBC_PRIVATE

  • 查看glibc版本及解决差异

    查看本机glibc版本: ldd --version

  • glibc编译方法

    我们在开发过程中,有时候可能需要根据我们的业务场景对glibc进行定制化修改,因此有必要了解glibc的编译方法。通常编译glibc需要以下几个步骤: 1. 由于我们一般是在x86环境的编译服务器下编译运行在arm环境下的目标固件,因此我们通常需要利用交叉编译工具链。所以,我们首先需要指定我们的交叉编译工具链的路径。 export PATH=$PATH:/home/xxxx(交叉编译工具链路径) 2. 利用configure编译生成makefile文件 ...

  • oracle9i(含oracle9204)安装问题大集_精品

    oracle9i安装问题集锦_精品[oracle@localhost database]$ ./runInstaller -responseFile /oracle/database/response/custom.rsp -...

  • linux下安装oracle9i

    ChinaUnix.net首页 | 论坛 | 博客 | Linux | 人才 | 培训 | 精华 | Wiki | 读书 | 资料 | 手册 | 下载 | 搜索ChinaUnix首页 &gt; 精华文章 &gt; Oracle ...

  • Linux下Oracle9i安装,Linux下oracle 9i图文安装一

    在Liunx下安装Oracle数据库软件对于初学者来说是一件不容易的事,本菜鸟在折腾了许久后安装成功,中间过程不敢独享,公布出来分享一下.有问题的地方还请各位大侠指正.准备工作系统版本:Redhat Linux Enterprise 4内核版本:2.6.9-5Oracle版本:9.2.4内存容量:512M硬盘容量:16G一:安装Linux系统,放入Linux第一张光盘,设置BIOS从光盘引导,启动...

  • linux下安装oracle9i- 9204

    前期准备: linux 32位系统,suse linux 9 ,oracle 9i   oracle9i 有三个安装包,ORACLE9204-1.ISO,ORACLE9204-2.ISO,ORACLE9204-3.ISO   安装:   1.创建用户与用户组 以root用户登录,进行如下操作,建立两个组(dba组与oinstall组)和一个Oracle用户,操作命令如下:    ...

  • Installing Oracle9iR2 on RedHat Linux

    这是2003年11月翻译的一篇关于在 RedHat Linux 7.1, 7.2, 7.3, 8.0, 9, Advanced Server 2.1, and Enterprinse Linux Advanced Server ...

  • 在Linux下安装Oracle9i

    在安装之前有几个地方需要注意的:你的交换分区最好有一个G左右那么大,第二你的硬盘分区最好也要有足够大的空间。下面我那个转贴的中译本:1、创建用户和组:[roko@miniroko] su -[root@miniroko]# groupadd oinstall[root@miniroko]# groupadd dba[root@miniroko]# useradd -g oinstall

Global site tag (gtag.js) - Google Analytics