一、物联网和数据
Electronic supplementary material The online version of this chapter (doi:10.1007/978-1-4842-1293-6_1) contains supplementary material, which is available to authorized users.
互联网使开发者能够创建解决方案,生成世界上任何地方的任何人都可以查看的数据。调整解决方案的原型或较小版本以融入互联网可能是一项挑战。这并不像在本地网络或类似的通信机制上采用一个可行的解决方案并增加互联网连接那么简单。例如,将您的传感器网络从几个传感器监控几个人查看的数据发展到一个包含数百个传感器的传感器网络,并且数据可能可供所有人查看,这可能需要重新设计您的通信方法、数据收集和数据存储。
你不仅要弄清楚如何扩展传感器、数据收集器和数据托管服务或数据库服务器之间的通信,还要处理数据的爆炸。也就是说,从十几个传感器中捕获数据相对容易,并且可能不需要太多的仔细规划来保存数据,但是从数百甚至数千个传感器中捕获数据要困难得多,因为数据以索引方式积累。
显然,将数据存储在可移动介质或文件中是不可能的——尤其是当您考虑数据将如何被使用时。此外,如何存储或更恰当地检索数据会使理解所有这些数据变得复杂。例如,如果你家里、汽车里、办公室里的每一个设备都产生数据,会发生什么?再加上对可穿戴传感器和类似设备日益增长的兴趣,你有可能产生比任何人都能管理甚至破译的数据更多的数据。
然而,不仅仅是传感器网络面临类似的数据危机。事实上,新兴和发展中物联网世界(IOT)的创新者最大的担忧是随着越来越多的设备生成、交流和呈现数据,数据爆炸的可能性。我们需要的是一种探索和利用这些数据的方法,一个起点是如何在较小的规模上收集和存储数据,如传感器网络。
What Is The Internet Of Things?
IOT 的本质是简单的互联设备,它们从观察、事实和其他数据中生成和交换数据,使其可供任何人使用。虽然似乎有一些营销努力试图将连接到互联网的任何东西都变成 IOT 的解决方案或设备(就像无耻地将一切都贴上“云”的标签一样),但 IOT 的解决方案旨在使我们对周围世界的知识更加及时和相关,使我们可以随时随地获得任何东西的数据。无论如何,很明显 IOT 设备的数量有可能超过地球上的人口数量。
本书将指导您成功规划和实施传感器网络的数据存储组件以及类似的 IOT 解决方案。让我们先简短讨论一下 IOT 解决方案,然后看看开发以数据为中心的 IOT 解决方案的主要挑战。
IOT 解决方案
IOT 解决方案就是一组设计用于产生、消费或呈现关于某个事件或一系列事件或观察结果的数据的设备。这可以包括生成数据的设备(如传感器)、组合数据以推断某些东西的设备、设计用于制表和存储数据的设备或服务,以及设计用于呈现数据的设备或系统。任何或所有这些都可以连接到互联网。
IOT 解决方案可能包括一个或所有这些品质,无论它们是结合在一个单一的设备,如网络摄像头,使用传感器包和监测单元,如气象站,或使用专用传感器,聚合器,数据存储和演示的复杂系统,如完整的家庭自动化系统。图 1-1 展示了通过数据库、数据收集器或集成器、显示服务甚至其他设备连接到互联网的所有设备的未来图景。
图 1-1。
The future of IOT—all devices, everywhere2
IOT 不仅仅是连接到互联网
那么,如果一个设备连接到互联网,这是一个 IOT 解决方案吗?那取决于你问谁。一些人认为答案是肯定的。然而,其他人(比如我自己)认为答案是否定的,除非这样做有好处。
例如,如果你把你的烤面包机连接到互联网,这样做有什么好处?如果你的烤面包机给你的手机发短信说你的烤面包准备好了,这是毫无意义的(或者至少是极端古怪的)。因此,在这种情况下,答案是否定的。然而,如果你想监控不负责任的青少年或老年人,那么查看他们使用烤面包机的频率和时间可能会有所帮助。也就是说,您可以使用这些数据来帮助您对他们的护理和安全做出决策。
请允许我用另一个例子来说明。我有幸参加了 20 世纪 90 年代末在微软校园举行的设计研讨会。在我们参观校园期间,我们看到了世界上第一台可以上网的冰箱(也称为智能冰箱)。 3 货架上有传感器来检测食物的重量。有人建议,只要有点独创性,有人可以在牛奶供应不足时使用传感器通知杂货店,这将使人们不仅可以在线购物,而且可以自动购物。如果你住在杂货店送货上门的地方,这就太好了,但对我们这些生活在农村地区的人来说没什么帮助。虽然它没有被吹捧为 IOT 设备(该术语是后来创造的),但许多人认为该设备展示了如果设备连接到互联网可能会发生什么。
因此,连接到互联网不是 IOT 的事情,也不是一个新概念。相反,IOT 解决方案必须是那些提供一些意义的东西——无论对某人或其他设备或服务的好处有多小。图 1-2 比图 1-1 描述得更清楚一些。
图 1-2。
“Connect the world” by Wilgengebroed on Flickr,5 via Wikimedia Commons
请注意,在这里您可以看到连接到互联网的逻辑分组。观察相连的植物。该图描绘了几个传感器,但每个传感器不一定直接连接到互联网。将来自一个或多个工厂的传感器连接到中间节点更有可能且更实际,该中间节点将数据发送到互联网上的服务或网络中的另一个节点以供以后处理。图 1-3 显示了这在逻辑形式下的样子。
图 1-3。
How IOT devices connect to the Internet
图 1-3 的左侧是 IOT 装置。这些可能是简单的传感器、整个传感器网络、具有一个或多个传感器的设备、具有传感器的嵌入式微控制器解决方案、更复杂的基于微处理器的解决方案,甚至是微波炉、闹钟或电视等设备。一些设备将直接连接到互联网,如图 1-3 顶部所示。这些设备是具有内置网络功能的更复杂的设备。底部是连接到中间节点的设备,如数据聚合器、计算机等,它们在通过互联网连接呈现数据或将数据发送到云服务之前过滤、增强和存储数据。最右边是通过互联网或云服务访问数据的用户。当然,这可以是任何类型的设备,如笔记本电脑、台式机、平板电脑、手机、手表或其他智能设备或电器(包括另一个 IOT 设备)。
IOT 服务
可悲的是,有些公司吹嘘拥有 IOT 的产品和服务,这只不过是营销炒作——就像一些公司通过在名称前加上“云”或附加“为了云”所做的那样。幸运的是,有一些真正好的产品和服务是专为 IOT 打造的。这些范围从数据存储和托管到专门的硬件。
事实上,企业在他们的产品中加入 IOT 服务的速度比任何人都快。它不是通常的嫌疑人,如互联网巨头。我看到思科、美国电话电报公司、惠普以及无数初创公司和小型企业提供 IOT 解决方案和服务。我使用术语 IOT 供应商来描述那些为 IOT 解决方案提供服务的企业。
你可能想知道这些服务和产品是什么,为什么有人会考虑使用它们。也就是说,什么是 IOT 服务,你为什么会决定购买它?您决定购买服务的最大原因是成本和上市时间。
如果您的开发者没有资源或专业知识,并且获得这些资源或专业知识所需的费用超过了服务的费用,那么购买服务可能更经济。但是,您也应该考虑在决策中任何必要的重组。我曾经遇到过一个善意的、有良好文档记录的合同服务,它允许一个产品比预期的更快地进入市场,从而节省了大量成本。可悲的是,虽然该合同的冠军赢得了技术成就奖,但他们没有考虑到系统必须重新调整才能使用新服务。更具体地说,采用新服务比从头开始编写新服务需要更长的时间。因此,该组织没有节省资金,而是花费了近三倍的资金,并且上市时间较晚。显然,你必须考虑所有的因素。
同样,如果您的时间不多,或者您很难在截止日期前准备好解决方案,那么购买 IOT 服务可能比创建或修改您自己的服务更快。这可能需要多花一点钱,但在这种情况下,动机是时间,而不是(必然)成本。当然,实际上这是成本和时间的混合。
那么,IOT 有哪些服务呢?以下是过去几年出现的几个例子。随着 IOT 解决方案和服务的成熟,可能会提供更多的服务。
- 企业 IOT 数据托管和显示:允许您的用户开发企业 IOT 解决方案的服务,如连接、管理和定制友好形式的数据显示,如图形、图表等。例如:Xively (
https://xively.com/
)。 - IOT 数据存储:允许您存储 IOT 数据并获得简单报告的服务。例如:Sparkfun 的 IOT 数据服务(
https://data.sparkfun.com/
)。 - 网络:为 IOT 提供网络和类似通信协议或平台的服务。大多数专门从事机器对机器(M2M)服务。例如:美国电话电报公司的蜂窝全球 SIM 卡服务(
http://business.att.com/enterprise/Family/mobility-services/internet-of-things
)。 - IOT 硬件平台:允许您使用硬件平台和一系列受支持的模块和工具快速开发和制作 IOT 设备原型的供应商,用于构建从简单组件到完整设备的设备。例如:英特尔的 IOT 网关开发套件(
http://intel.com/content/www/us/en/embedded/solutions/iot-gateway/development-kits.html
)。
How To Raise Capital For Development: Kickstarter
在开发新的解决方案时,有时可能需要资金来赚钱。无论听起来多么滑稽,大多数开发者并不富裕,也没有资金投入到他们设备的大规模生产工具和生产中。幸运的是,互联网为开发商提供了一个筹集资金的机制,以将他们的想法推向市场。
虽然有几个网站提供类似的服务,但 Kickstarter ( http://kickstarter.com
)提供了一种革命性的融资方式。你可以在网站上发布你的想法,并提供你的产品或服务,收取少量的捐款。事实上,大多数成功的 Kickstarter 活动都会为捐款者提供回报和同情。例如,小额捐赠可以让你得到一件 t 恤或者打折购买产品的机会。对于一个更大的捐赠,你可能会得到第一个生产单位,免费升级到新的模式,甚至在利润的股份。
Kickstarter 不仅允许开发者筹集资金,还允许个人以比典型的风险投资家低得多的货币承诺参与项目融资。如果你感兴趣,请访问 Kickstarter 主页,浏览数百个可用的活动。你永远不知道,你可能会找到你想投资的东西。
为了让你知道什么是可能的,看看 Kossel Pro 的 Kickstarter 活动( http://kickstarter.com/projects/ttstam/openbeam-kossel-pro-a-new-type-of-3d-printer
)。开发商的资金目标增加了一倍多,他们的产品已经成为现实,订单源源不断。我应该知道;我拥有首批生产单位之一!
IOT 解决方案示例
让我们来看一些 IOT 解决方案的例子。本节中描述的 IOT 解决方案是多种解决方案的组合,您应该对 IOT 解决方案的规模和复杂性有所了解。我还指出了其中一些解决方案如何利用 IOT 供应商的服务。
传感器网络
传感器网络是 IOT 解决方案最常见的形式之一。简单地说,传感器网络让你可以观察你周围的世界并理解它。传感器网络可以采取池塘监测系统的形式,提醒你水位、水的纯度(污染)和水温;探测捕食者;甚至可以自动开启照明或喂鱼等功能。如果你或你认识的人在医疗机构呆过一段时间,就有可能使用传感器网络来监控身体功能,如体温、心脏和呼吸,甚至运动。现代汽车还包含传感器网络,专用于监控发动机、气候,甚至一些汽车的路况。例如,车道警告功能使用传感器(通常是摄像头、微处理器和软件)来检测您何时偏离车道或道路分界线太远。
因此,传感器网络采用一个或多个传感器,这些传感器对事件或状态进行测量(观察),并将该数据传送给网络中的另一个组件或节点,然后以某种形式呈现该数据以供分析。让我们来看一个有趣的替代天气服务的例子。
Weather Underground ( http://wunderground.com
)是一个社区驱动的网站,它允许世界各地的业余和专业气象爱好者将他们的气象站连接到互联网,并共享他们的传感器提供的数据。这意味着您只需点击地图并放大即可获得您所在地区、城市甚至地方的最新天气信息。您将看到代表每个当地气象站(显示当地温度)的图标,单击这些图标可以查看更多信息。图 1-4 显示了 Weather Underground 使用谷歌地图显示气象站的神奇地图。如你所见,你可以点击任何一个气象站来查看更多信息。
图 1-4。
Weather Station Network (courtesy of http://wunderground.com/wundermap
)
你可以用神奇地图做更多的事情。正如你所看到的,地图还显示了雷达数据,你可以使用它来查看哪里可能会发生降水。您还可以看到地图在动态回放以前从雷达和气象站更新的数据。对于那些对天气感兴趣的人来说,Weather Underground 是一个非常棒的网站——无论你是否有自己的气象站,你都可以从这个网站上获得大量的信息。
这可能是我发现的最好的例子之一,来说明 IOT 的力量,特别是传感器网络。您不仅可以看到邻居气象站的传感器生成的数据,还可以看到来自该地区、该州甚至整个国家的几十个气象站的数据!这就是 IOT 物化的真正力量。
车队管理
IOT 解决方案的另一个例子是车队管理系统( https://en.wikipedia.org/wiki/Fleet_management
)。虽然远在 IOT 一词出现之前就已开发和部署,但车队管理系统允许企业监控他们的汽车、卡车、船只——几乎是任何移动设备——不仅可以跟踪他们的当前位置,还可以使用位置数据(一段时间内获得的 GPS 坐标)来规划更有效的路线,从而降低运输成本。
车队管理系统不仅仅是为了路由。事实上,车队管理系统允许企业监控每个单位进行诊断。例如,可以知道每辆卡车中有多少燃料,上次维护是什么时候进行的(或者更重要的是,下次维护是什么时候),等等。车辆地理跟踪和诊断的结合被称为远程信息处理。图 1-5 说明了车队管理系统。
图 1-5。
Fleet management example6
在该图中,您将看到 GPS 系统如何跟踪位置,以及如何通过卫星通信传输更多数据,如诊断信息、有效负载状态等。所有这些最终都会通过互联网,业务分析师可以访问这些数据。
你可能认为船队管理系统只适用于大型航运公司,但随着 GPS 模块甚至微控制器市场的激增,任何人都可以创建船队管理系统。也就是说,它们不需要花费数百万美元来开发。例如,如果您拥有一家自行车送货公司,您可以轻松地将 GPS 模块与每个送货人的蜂窝或无线连接相结合,以跟踪他们的位置、平均行程时间等。更具体地说,您可以用一个 Arduino 和一组小型支持电子设备构建一个 GPS 跟踪解决方案。事实上,我建议这样一个解决方案可以用来最小化递送时间,它允许包裹从一个递送人交给另一个递送人,而不是让他们在每次完成一组递送后都返回仓库。
家庭自动化
另一个越来越流行的 IOT 解决方案是家庭自动化 8 (也称为智能家庭)。虽然从任何意义上来说都不新鲜(家庭自动化已经存在很长时间了),但家庭自动化解决方案已经变得越来越有趣,因为许多供应商正在让它们为互联网做好准备。事实上,大多数解决方案要么提供从互联网直接访问,要么通过云服务访问。
家庭自动化解决方案通常是一组传感器、致动器和设备,允许您控制家中的事物。您可以找到传感器来检测运动、门窗状态(开/关)、温度、湿度等。你还可以找到像锁这样的致动器,让你远程解锁或锁门,打开和关闭车库门,甚至开灯和关灯。最后,你可以找到更复杂的设备,如可以远程编程的智能恒温器、可以观看和记录图像的摄像机、机器人吸尘器,甚至可以让你像在家里一样拨号的电话。虽然这些都不是新的,但新的是将这些设备打包到 IOT 解决方案中。
例如,许多家装商店,如 Lowes 和 Home Depot 都有自己的家庭自动化解决方案系列。您可以找到现成的安装设备,如门锁、摄像头、恒温器等,您可以快速轻松地安装这些设备,并借助随附的软件进行远程访问。甚至有一种设备可以让你开关厨房的水龙头!
Lowes 解决方案名为 Iris ( http://irisbylowes.com
),是一种订阅服务,结合了一个特殊的网络集线器(称为 Iris smart hub),所有设备都连接到这个网络集线器。要访问生成的数据和家庭安全、宠物监控等功能,您可以使用适用于 Android 或 IOS 设备的应用(app)。该订阅有几个级别,从免费的基本服务(允许您连接到设备以获得基本服务,如锁定和解锁门、检测移动、查看相机的短视频等)到。付费服务允许您更多地访问设备并远程控制它们,例如安排设备电源(当您离开时随机开灯,让它看起来像您在家)等等。Iris 是作为入门套件出售的,带有一些设备,您可以根据预算或需求进行扩展。有关更多信息,请参见 Iris 页面。
家得宝解决方案( http://homedepot.com/c/Home_Automation_Basics
)也使用了一个集线器(称为 Wink),但与 Lowe 的解决方案不同,您可以添加的设备不需要来自单一供应商。事实上,您可以添加通过 Wi-Fi、蓝牙 LE、Z-Wave、ZigBee、Lutron、ClearConnect 和 Kidde 进行通信的设备。因此,您可以更自由地混合搭配您的设备,根据您的需求扩展您的解决方案。像 Lowe 的解决方案一样,你可以通过一个名为 Wink app 的应用监控各种事情并查看数据。我还应该补充一点,家得宝提供的一些家庭自动化设备可以在没有集线器的情况下运行,但远程访问需要集线器。像劳氏一样,你可以购买易于安装和使用的初学者工具包。请参见家得宝家庭自动化页面,了解更多详细信息和可用套件的链接。
劳氏公司和家得宝公司的解决方案只是众多可用方案中的两个。在谷歌上快速搜索会有几十个结果供你选择——有些是像 Lowe’s solution 这样的专利产品,有些则更加开放,或者可以被多家厂商的设备扩展。
您还可以使用 Arduino、Raspberry Pi 和 BeagleBone 等微控制器构建自己的家庭自动化解决方案。有很多关于这个主题的书,从简单的解决方案到复杂的解决方案。以下只是越来越多的 DIY 家庭自动化书籍中的几本。
- Steven Goodwin,使用 Linux 和 Raspberry Pi 的智能家庭自动化(Apress,2013 年)
- Marco Schwartz,Arduino 家庭自动化项目(Packt 出版社,2014 年)
- Onur Dundar,《采用英特尔 Galileo 的家庭自动化》( Packt 出版社,2015 年)
您还可以在互联网上找到创建家庭自动化解决方案的说明。复杂解决方案的一个例子是 Eric Tsai 在 http://instructables.com/id/Uber-Home-Automation-w-Arduino-Pi/
发表的文章(称为 instructable)。在他的文章中,Eric 描述了一个家庭自动化解决方案的基础,您可以使用易于获得和易于使用的组件来构建自己的解决方案。图 1-6 展示了 Eric 文章中的一个例子,描述了一点想象力就能实现的事情。
图 1-6。
DIY home automation (courtesy of Eric Tsai, http://etsai.net
)
如你所见,有了 DIY 家庭自动化解决方案,你可以随心所欲地建造它。您可以添加通过 ZigBee 模块通信的 Arduino 控制的传感器、监控摄像机的 Raspberry Pi 板、控制车库门的定制电子设备等等!事实上,如果你渴望成为一名创造者或者是一名有成就的创造者,你可以修改现有的设备来增加远程功能。例如,车库门开启器很容易添加无线模块,以便通过本地 WiFi(甚至互联网)发送信号。即使你不是一个经验丰富的软件开发者,你也可以使用 XIV ly(http://xively.com/
)等服务来发送你的家庭自动化数据进行监控。当然,如果你花一点时间开发一个简单的网页,你可以通过本地网络连接你的家庭自动化解决方案。虽然它可能不像商业单位那样花哨,但你可以让它做你想做的任何事情。
现在,您已经知道了什么是 IOT 解决方案,并且已经看到了一些例子,让我们来讨论一下 IOT 解决方案中最重要的组成部分:数据。
什么是 IOT 数据?
无论您的 IOT 解决方案是在您洗完澡后看着您的玉米煎饼早餐,还是在暴风雨中依靠仪器将您的船引导到安全的地方,产生和处理的数据都是最重要的工件,实际上是 IOT 解决方案的生命线。
为什么呢?因为没有数据,解决方案是没有意义的。例如,如果你有一个 IOT 解决方案,监测你的身体功能,但从来没有存储数据,你最多可以实现的是一个瞬时读数。如果不存储数据,您将无法对过去的事件进行任何诊断。显然,数据很重要。
或许同样重要的是如何存储这些数据并防止被利用或滥用。这是 IOT 解决方案的一个特别重要的方面,我将在后面详细讨论。现在,让我们从一个简单的工厂监控系统开始考虑 IOT 解决方案的数据。图 1-7 显示了单个工厂的简单解决方案。虽然一个好的解决方案还包括一个光传感器来监控植物接收到多少光,但这个已经被简化了,所以你可以看到产生的数据。
图 1-7。
Plant monitoring with Arduino
在本例中,您会看到一台连接了土壤湿度传感器的 Arduino。Arduino 从放置在植物土壤中的土壤湿度传感器生成一个读数列表。这样做的代码并不复杂,如清单 1-1 所示。
Listing 1-1.Plant Soil Monitoring
/*
Simple Plant Monitor Example
Display the value of the soil moisture sensor and threshold status.
*/
// Thresholds for sensor to detect wet/dry conditions. Adjust these
// to match your soil characteristics.
int upper = 400;
int lower = 250;
// Pin for reading the sensor
int sensorPin = A0;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial);
Serial.println("Simple plant monitor");
Serial.println("raw value, moisture state");
}
void loop() {
int value;
// Read the sensor
value = analogRead(sensorPin);
Serial.print(value);
Serial.print(",");
// If value is less than lower threshold, soil is dry else if it
// is greater than upper threshold, it is wet, else all is well.
if (value <= lower) {
Serial.print("dry");
} else if (value >= upper) {
Serial.print("wet");
} else {
Serial.print("ok");
}
Serial.println();
delay(1000);
}
我使用串行监控器作为输出,这样做很简单,以便您可以看到生成的数据。清单 1-2 显示了一个示例运行的输出,其中我在运行期间给植物浇水。请注意,在输出列表中,当我给植物浇水时,传感器正确地测量到了一个变化(数值没有显著变化)。如果您正在构建一个更复杂(更有用)的工厂监控器,您可能会使用某种形式的输出,如 LCD 面板或 web 服务器,或者您会将数据存储在数据库中。
Listing 1-2.Output of Soil-Monitoring Example
Simple plant monitor
raw value, moisture state
159,dry
217,dry
225,dry
224,dry
225,dry
225,dry
226,dry
248,dry
249,dry
256,ok
261,ok
279,ok
276,ok
254,ok
266,ok
295,ok
291,ok
302,ok
394,ok
467,wet
506,wet
419,
wet
Note
您可以从 Apress 网站下载本书的源代码示例。
对于这个示例,文本输出就足够了。这是因为我想提醒大家注意数据行。第一列是从传感器读取的原始值。显然,这些数据几乎没有人类可读的信息。毕竟对于模拟信号来说只是一个数值。这就是我使用阈值来确定或限定数据的原因。随着数值的变化和水分含量的上升,您可以看到这一点。
如您所见,对我们最有意义的数据是“干”、“湿”和“正常”值。原始值并不那么有趣。这是一个很好的,虽然过于简单的例子,说明了来自传感器的原始数据如何需要额外的增强才能变得有用。但是,我还必须指出,如果您只存储了派生值,如果您需要调整阈值,您就不能重新评估派生值。例如,如果您确定阈值上限需要更改,并且您想要对该更改如何影响过去的读数进行一些分析,因为您只有“干”、“湿”和“正常”值,所以您不能执行此分析。因此,保存原始数据总是一个好的做法。
Tip
始终保存原始数据以及计算值或导出值。你永远不知道你什么时候会需要它。
如果您有兴趣构建这个示例,或者用 LCD 或 LED 来修饰它,以便在植物需要水时发出警告,或者更好地用伺服或步进电机和水源来自动给植物浇水,我鼓励您这样做。这是一个有趣的项目。您甚至可以修改代码来支持一个 web 服务器,您可以使用它来远程检查您的植物的状态。 9 这些零件很容易找到,可以从大多数在线电子商店买到,如 SparkFun ( http://sparkfun.com
)、Maker Shed ( http://makershed.com
)、AdaFruit ( http://adafruit.com
)。我包含了一些文章的链接,这些文章从简单到复杂,解释了如何构建这个项目和类似的项目。图 1-8 显示了传感器如何连接到 Arduino。
图 1-8。
Wiring the simple plant monitor
- Sparkfun 的土壤水分教程(
https://learn.sparkfun.com/tutorials/soil-moisture-sensor-hookup-guide?_ga=1.98811421.2053037341.1391972341
) - 土壤水分与小树林成分(
http://seeedstudio.com/wiki/Grove_-_Moisture_Sensor
) - Make’s 盆栽植物保护器(
http://makezine.com/projects/potted-plant-protecto
【r/) - 自动浇水的植物(
http://instructables.com/id/Self-Watering-Plant/
) - Adafruit 的无线花园教程(
https://learn.adafruit.com/wireless-gardening-arduino-cc3000-wifi-modules
)
我想向你们展示这些数据还有一个原因。IOT 解决方案通常采用网络中的中间节点。更具体地说,通常情况下,传感器被安装或连接到更小的一组电子设备,例如微控制器或甚至简单的集成电路。然后,该节点将获取传感器值,并将它们发送到网络上其他地方的另一个节点。值得注意的是,该级别可以使用除以太网或 WiFi 之外的网络协议来简化和减少每个设备拥有唯一地址的需求。这些设备通常没有足够的资源来支持更复杂的网络协议,因此需要可以用有限资源实现的更轻量级的东西。
当像这样在节点之间交换数据时,它被称为机器对机器数据交换,并且通常以原始形式传输。这有几个原因。最值得注意的是节省内存,有助于加快通信速度,特别是对于小型微控制器和类似的嵌入式处理器。也就是说,发送单个整数甚至浮点值比发送格式化的文本字符串要快得多。如果传感器级别的节点使用在较低资源(内存)下运行的通信协议,如 XBee 模块,这可能是至关重要的。
谈到 IOT 解决方案中的所有数据,人们一定想知道这些数据都去了哪里,这些数据将如何积累。
物联网预测:数据霸主?
你不用在网上找太多或太久就能发现一些关于 IOT 的可怕预测。 10 这提出了两个问题:需要更多的地址空间(IP 地址)和可寻址性,以及需要更好的方法来管理极其大量的数据(大数据)。不太受欢迎但同样重要的是 IOT 数据、设备和服务的安全性。我将在接下来的章节中逐一讨论这些问题。
寻址 IOT 设备
仅仅因为你可以在地球上的任意一个地方找到一个地址,就不一定容易找到。也就是说,如果你在沙漠中的某个地方用一个鲜红色的“X”标记一块石头,或者简单地在上面写一个数字,没有人会找到它。即使人们花时间去搜索沙漠,他们也需要一个大概区域的提示来找到它。当然,您可以添加元数据,如纬度和经度,甚至是 GPS 导航信标,但您放在岩石上的“X”显然是不够的信息。这说明了寻址 IOT 设备的两个问题:拥有唯一标识设备的方法和查找或寻址设备。
有足够的地址吗?
人们有理由担心 IOT 设备的数量将很快超过可用 IP 地址的最大容量。目前,IPv6 协议 11 允许大约 3.4×10 38 个地址。那是 340 个十亿分之一的数字!虽然这是一个巨大的数字,但公共地址的可用范围可能会少得多,但仍处于十一亿分之一的水平。这很好,因为有人预测未来 IOT 设备的数量将达到数十亿,甚至数千亿、数千亿或数百万亿。
即使公共可寻址 IPv6 地址的数量是可用 IPv6 地址的一半甚至四分之一,我们也不会很快用完。事实上,IPv6 有可能在未来为所有可能的 IOT 设备提供足够的寻址能力,但是所有这些设备都被寻址并不意味着它们会很容易被发现。
你如何找到一个 IOT 设备?
给 IOT 设备分配一个 IP 地址并不一定容易找到。事实上,如果每台 IOT 设备都有自己的 IP 地址,那么所有设备都可以连接到互联网,甚至可以互相连接,但是你怎么找到你要找的设备呢?如果他们是您的设备或您认识的愿意分享其地址的人,您可以通过了解正确的信息找到他们。但是如果你想知道你的邻居中是否有人有户外摄像机呢?假设您需要访问他们的图像来帮助破案或识别流浪动物的行踪?除了敲邻居的门,没有简单的方法找到这些 IOT 相机。
A Simple Search Is Not Enough
仅仅搜索可用的 IPv6 地址来寻找 IOT 设备是不够的。一些人估计,即使使用速度适中的搜索引擎,搜索和识别所有连接到互联网的 IPv6 设备也可能需要许多年甚至数千年的时间。这还不包括每天添加或删除的内容。显然,我们不能简单地将 IPv6 功能添加到我们生活中的每一个移动(或不移动)的电子设备或事物中,并期望能够在不了解它们是什么、它们在哪里以及它们做什么的情况下访问它们。
就像沙漠中的岩石一样,你需要更多的信息。你需要知道那个设备是如何连接的,它是做什么的,它是如何使用的,它产生什么数据。因此,您需要某种形式的代理或服务来跟踪设备。也许一个更尖锐的问题是,为什么你首先需要知道或使用这个设备?你不是更有可能把邻居的家当作可以请求数据的服务吗?例如,如果您可以使用谷歌地图找到您的邻居,并点击您周围的家庭,以查看哪些 IOT 数据是公开可用的,这难道不比试图找到一个特定的 IOT 设备(相机)更有用吗?这听起来不耳熟吗?应该的。这正是 WunderMap 在 Weather Underground 网站中的工作方式。
在这种情况下,每个家庭都是一个生成数据的 IOT 服务提供商。一些数据可以公开,如面向外部的摄像头,而其他数据可能是私人的,需要安全登录才能访问家中的设备。回想一下家庭自动化用例。想象一下,如果能够远程检查你的家,或者允许保姆看电视或使用厨房里的设备,会有多方便。
不管 IOT 服务是什么,事实是你不太可能需要直接访问 IOT 设备。该服务可以提供所有需要(或允许)的功能。这不仅大大减少了搜索问题,还有助于限制可公开寻址的 IOT 设备的数量。也就是说,IOT 服务“背后”或“内部”的设备不需要公开。更重要的是,这使您能够以更强大的方式保护您的 IOT 设备。想象一下,如果你发现你的 IOT 相机可以被任何地方的任何人通过简单的黑客攻击访问,那将意味着什么。
通过将 IOT 设备置于 IOT 服务(或代理、应用等)之后,您还允许使用资源较少的通信协议。也就是说,IOT 设备可以由更便宜和更有限的硬件构建。例如,您不需要笔记本电脑来监控植物传感器。此外,如果您有一个家庭自动化解决方案,允许您连接一个使用 XBee 协议的工厂监控器,那么您可以使用更少的硬件来构建工厂传感器,从而降低成本。
更小或更低资源的硬件和通信协议解决了特别是 IOT 设备和传感器的另一个问题。传感器没有按照预设的时间间隔生成数据。虽然有些传感器包含计时器电路或只能定期生成值,但传感器通常会由另一个设备(如 Arduino、Raspberry Pi 等)以特定间隔轮询。
此外,诸如 XBee 之类的通信协议不是无损机制。事实上,尽管很少,数据丢失是可能的,并且协议支持数据包的完全丢失。如果您的传感器每分钟生成 30 个值,那么您只收到 29 个而不是 30 个值真的有关系吗?也许有些解决方案可能需要更高的精度,但对于监控事件的传感器来说,这是可以接受的,并且非常适合传感器模型。它考虑了值未准备好的可能性;传感器没有改变它的状态,等等,允许您支持更广泛的传感器行为。
我在这里描述的解决方案已经以多种方式被标记,但是最正确的和实际上最深刻的 IOT 架构被称为 Chirp。弗朗西斯·达科斯塔(Francis daCosta)在他的著作《重新思考物联网》(Apress,2013)中描述了这种架构。
啁啾只是一个小数据包的名称,它只包含将数据传送到目的地所需的最少信息。这符合轻型协议的小开销要求,也允许偶尔丢失数据包。在 IOT 解决方案的最低端,设备使用支持将啁啾发送到节点的协议,这些节点可以监控数据并采取适当的行动。例如,可以构建节点来获取一分钟内生成的 30 个样本,并在一段时间内(比如每五分钟)对它们进行平均,以生成更平滑的数据样本。我见过这种技术被用于使用不太精确的传感器的解决方案,其中不使用超过阈值的尖峰(高或低),从而允许以较低的速率从传感器获得更平滑的读数。这是更少的数据,但可能更准确。
因此,IOT 解决方案将由几个层构成。在最底层,IOT 设备通过网络连接到收集或处理数据的节点,这些节点再连接到提供或支持特定服务的设备。例如,IOT 摄像机可以连接到一个中间节点,该节点从更高层的节点接收命令。类似地,可以使用几个数据聚合和数据处理节点来使用和监控传感器网络,这些节点将数据发送到数据库,然后由更高层中的节点访问该数据库。图 1-9 显示了这个概念的一个例子。
图 1-9。
Concept of layered IOT solution
请注意,在顶部,我已将 IOT 服务背后的图层标记为私有。这表明这些层和其中的设备不能从互联网直接访问。这并没有停止让它们成为 IOT 设备;相反,它有助于定义解决方案分层的架构,以便通过仅使用必要的协议(以及每层所需的硬件)来实现优化。例如,设备、安全实践和编程的复杂程度在图中从左向右增加。
例如,图 1-9 的左侧是一组使用 ZigBee 网络连接的传感器或轻型 IOT 设备。这可以采用小型设备的形式,使用 XBee 模块将数据发送到包含数据聚合和数据库节点的下一层。在这一层,您可以使用私有的 IPv4 以太网。为什么选择 IPv4?因为像 Arduino 和 Raspberry Pi 这样的小设备大多是原生默认支持的。因此,您可以开始将这些节点与一个应用节点连接起来,该应用节点提供了到基于云的服务的网关。此时,您可以继续使用 IPv4 或切换到 IPv6,因为这可能是一个更复杂的服务器。在图 1-9 的右侧是您将用来授权访问您的 IOT 解决方案的 IOT 服务的描述。这可以是任何东西,从前端 web 服务器到由商业 IOT 供应商提供的完整的 IOT 解决方案。
显然,像这样的架构允许较低层(左边的那些)与资源较少的协议通信,甚至处理偶尔的数据丢失,而较高层(右边的那些)与更复杂的协议通信。这还允许您将解决方案中更复杂的部分放在最适合该任务的层或设备上。例如,虽然你可以将 Arduino 连接到 MySQL 数据库服务器, 12 但你不太可能将它托管在与其他服务相同的平台上(但你可以在 Raspberry Pi 上托管)。最后,它允许您为每一层设计适当的安全级别。
现在您已经了解了 IOT 设备的寻址问题,让我们来讨论一下数据。随着数十亿台 IOT 设备生成数据,这些数据将流向哪里?您将如何访问这些数据?
IOT 和大数据
IOT 专家担心的另一个问题是,IOT 解决方案生成的数据量会以多快的速度增长。也就是说,随着越来越多的 IOT 设备的添加和数据的归档,数据的大小将呈索引级增长。当数据变得足够大时,使用传统的数据库访问机制来访问它就不再可行了。例如,访问位于美国的所有恒温器的传感器数据最终可能会变成一个大得离谱的数字(行数、字节数等等)。即使你有理由看到这些数据,数据量也是巨大的。如果按州来缩小范围,数据可能仍然比可能搜索或检索的要多。
What Is Big Data?
大数据 13 是指将被处理、分析、查看或以其他方式操纵以得出结论的数据的相对大小(例如,数据分析、数据仓库等)。相对大小是指大数据超出了大多数计算平台在合理时间内容纳或处理数据的能力这一特征。也就是说,它超出了单个系统甚至复杂系统的处理能力。 14
有许多处理大数据的方法,但大多数解决方案使用几十到几千个计算平台来分而治之。两个显著的例子是 Oracle 的大数据产品( http://oracle.com/big-data/index.html
)和 MySQL + Hadoop ( http://mysql.com/why-mysql/white-papers/mysql-and-hadoop-guide-to-big-data-integration/
)。虽然这些解决方案基于客户或用例而有所不同,但它们都解决了利用分布式数据库和执行来处理数据的问题(在较高层次上)。
因此,一些专家认为 IOT 将产生大量数据,并且只能用于大数据解决方案。例如,如果您想要分析某个地理区域(州、国家)内某类 IOT 设备的使用模式,即使每台 IOT 设备可能单独托管其数据,也需要汇总数据以进行编译和处理。因此,即使每台设备只有少量数据,将数百万甚至数十亿台 IOT 设备上的数据聚合起来也会产生大数据危机。
此外,虽然我和其他人提出了 IOT 解决方案的分层方法,并且大多数解决方案很可能构建为托管自己的数据,但在某个时候,我们仍可能希望在类似的 IOT 解决方案中搜索和挖掘数据。虽然恒温器的例子有点虚构,但更有可能的是,您需要研究这些解决方案的数据,以开发温度波动、高峰天气月份的燃料使用量,甚至池塘和水库的蒸发率等模式,从而帮助预测耗水量和节水率。在这种情况下,您可能需要从多个存储库中挖掘数据。
因此,即使对数据进行了划分,没有一个数据库可以容纳所有的数据,您挖掘的数据也可能需要临时存储以供分析,这使得数据分析成为处理大数据的一种情况。然而,从某种程度上来说,从 IOT 获取、聚合和处理数据确实需要专业的大数据解决方案。
Not Everyone Agrees
您可能会觉得有趣,关于大数据有几个思想流派。一些人批评它的存在,另一些人批评我们用来处理大数据的机制,还有一些人坚持认为真正的解决方案尚未实现。无论如何,大数据的前景仍在发展。
幸运的是,有许多供应商正在解决这个问题,云服务提供商的激增确保我们不必自己创建大数据解决方案。然而,我们仍然需要处理存储和访问我们的 IOT 解决方案数据——这也是本书的全部内容。
Tip
如果您想了解更多关于大数据及其与 IOT 的关系,请参阅 Stackowiak、Licht、Mantha 和 Nagode 的书《大数据和物联网》(Apress,2015)。
既然您已经了解 IOT 数据不是小事,而且确实有可能成为一个大规模的档案库,可以从我们周围的世界中获取更多的知识,那么让我们讨论一下除了如何存储数据之外的首要问题,即如何保护数据和 IOT 解决方案免受利用。
IOT 安全
IOT 开发者还需要考虑保护他们的设备、数据和服务。事实上,所有使用互联网的解决方案都必须开发更好的安全实践。由于存在多个漏洞,IOT 解决方案的独特之处使得计划和实施严格的安全措施变得尤为困难。更具体地说,每个组件可能有不同类型的漏洞,从对传感器和 IOT 设备的物理访问到针对 IOT 服务的远程攻击。
最近一连串的大规模数据泄露事件证明,安全性根本不够好。我们已经看到了从直接盗窃到利用从知名企业(如 Target)和政府机构(如美国人事管理办公室)窃取的数据(超过 4000 万个信用卡号码可能已被泄露)的一切。有趣的是,违规的源头可以追溯到第三方承包商和服务。显然,没有人是安全的。我们需要一个革命性的步骤,而不是改进行之有效的机制。
可悲的是,在保护我们的解决方案方面,我们能走的路是有限的。任何信息技术(IT)专业人士都会告诉您,应用最好的、严格的密码策略和严密的安全措施会迫使用户危及旨在保护他们及其数据的策略。例如,考虑要求密码为 16 个或更多字符的密码策略,其中至少有四个大写字母、六个数字、三个特殊字符,并且没有英语词典单词;每 60 天过期一次;并且与以前的密码相同的字符不超过七个。在这种情况下,一些用户将被迫写下他们的密码,因为他们记不住字母、大写字母、数字和特殊字符的随机组合。
然而,让密码更难猜测或破解只是一种策略。事实上,关于如何正确保护系统有各种各样的理念。虽然对所有技术的深入讨论超出了本书的范围,但考虑一种我们可以用于 IOT 解决方案的更流行的理念是很重要的。这是一种使用多个组件来识别个人的理念。
例如,用户可能需要知道一个关键短语(密码),拥有一个授权的有形护身符(RFID 徽章),并拥有一个生物特征签名(指纹)。要进入其中一个系统,用户必须知道密码,出示有效的 RFID 徽章,并读取和验证他们的指纹。
这听起来可能有点像科幻小说,甚至是超级机密的间谍工作,但它确保访问权限将只授予满足所有三个组成部分的人。也就是说,有可能猜测、破解或简单地窃取用户的密码,并且有可能获取甚至欺骗 RFID 徽章;甚至有可能(无论多么牵强)复制某人的指纹。在不泄露用户身份的情况下获取所有三个组件要困难得多。然而,缺点是用户无法获得访问权限,除非她拥有所有这三个组件。虽然用户不太可能丢失他们的指纹(但受伤和皮肤状况可能会使读取器失败),但用户可能会丢失或放错他们的徽章或忘记他们的密码。因此,安全实践再次削弱了用户的体验,使用户更难访问系统。
那我们该怎么办?我们是否实施了良好的实践来确保系统不被轻易破坏,或者我们是否为了易用性而冒降低安全性的风险?底线是,您必须选择最能满足保护数据和服务需求的安全解决方案,而不会迫使用户忍受繁重的工作,也不会给他们的生活带来困难。
您可能想知道这与您基于 Arduino 的传感器平台有什么关系。毕竟,没有什么人可以利用 Arduino,不是吗?这取决于 Arduino 及其连接方式。例如,可以利用支持通用轻量级操作系统或连接到您的网络的较新的 Arduino。我不会详述这一点,但可以说这是可能的。IOT 设备越复杂,被利用的风险就越大。例如,一般来说,Raspberry Pi 可能比裸机传感器和 XBee 模块具有更大的风险。这是因为 Raspberry Pi 能够运行 Linux,因此支持各种黑客工具和实用程序。
Caution
无论您对用户可访问的设备采用哪种安全理念或策略,您仍然必须考虑保护网络中其余节点的安全。
但是不仅仅是软件可以被利用。例如,将 IOT 设备放置在通过以太网连接的室外机箱中,很容易受到黑客的攻击,黑客可以访问以太网电缆。诚然,有人必须知道 IOT 设备的存在,但被利用的风险是真实的。为了解决这个问题,你可以使用重量更轻的硬件和更简单的通信协议 17 ,它们不容易被黑客攻击。
但是,对于设计良好的 IOT 解决方案来说,安全性真的是一个问题吗?让我们看一个最近的例子。美国(和世界)最大的汽车品牌之一吉普最近因其信息娱乐 18 解决方案的漏洞而受到抨击。一群技术高超的黑客能够远程访问该系统,侵入车内的其他电子设备。该小组能够鸣喇叭,打开雨刷,甚至影响操纵和刹车。更糟糕的是,这一切都发生在《黑客在高速公路上远程杀死一辆吉普车:我在里面》一文的作者安迪·格林伯格驾驶?? 19T7 的时候!不,这不是神话。这种情况确实发生了,Jeep 已经针对其系统的安全补丁发布了两次召回,而不是一次。那么,这对于 IOT 驱动汽车的未来意味着什么呢?你最好确定安全性不仅是内置的,而且做得非常好。显然,吉普有更多的工作要做。
Why Security?
您可能想知道为什么我们在一本专门讨论 IOT 解决方案中的数据库的书中讨论安全性。你可能听说过“慈善始于家庭”,这意味着我们必须教导我们的孩子通过慷慨照顾他人的道德和伦理。对于 IOT 解决方案,有一个适用于安全的类比。我们必须从一开始就将安全纳入我们的 IOT 解决方案。也就是说,我们必须以保护数据和对数据的访问不被利用或窃取为首要目标进行设计。每个组件都必须有安全设计目标,从连接到无害、分立通信电子设备的简单传感器,到可以完全访问互联网的复杂嵌入式微处理器。出于本书的目的,我们将重点关注从数据收集点(例如,传感器和设备)到数据库以及其间所有节点的安全性。正如您将看到的那样,一点点安全预防措施对保护您的数据大有帮助。
对于对人类来说风险更高的解决方案,如核电站或医疗机构,您可能还会考虑安全性需要更强。虽然这些确实是我们期望非常好的安全性的解决方案,但是考虑一下家庭自动化的情况。如果有人能够侵入你的智能家居,并且能够锁门和开门,会发生什么?事实上,最近流行的婴儿监控器被发现很容易被黑客攻击,黑客可以查看图像,监听对话,甚至操纵摄像头。
你可能想知道有人如何利用普通数据进行邪恶的活动。考虑这样一种情况,一个拥有智能住宅的家庭决定去度假。让我们也考虑一下这家人的安全意识,他们没有通过社交媒体公布他们的假期计划。 20 让我们也假设黑客能找到的唯一漏洞是家庭智能电表的数据转储。那又怎样?嗯,考虑到当一家人去度假时,他们用的电更少。空调可能会被设置为较高(较低)的温度以节省电力,没有电视将被打开,没有热水将被使用,没有烹饪正在进行,等等。因此,用电量的突然下降可以告诉小偷,这家人不在家。因此,即使无害的数据也可能被利用。
Tip
安全没有金科玉律或灵丹妙药。安全实践必须不断调整,需要发明新的机制,并且您必须积极主动地走在那些规避安全措施的人的前面。也就是说,您必须认真对待安全性,并围绕可靠的最佳实践开发您的解决方案。
现在我已经吓到你了,让我们谈一谈 IOT 解决方案的安全性,首先概述最常见的安全威胁以及如何应对它们。同样,我们正在研究这些问题,以便能够在我们的 IOT 解决方案中从头开始构建安全性。
常见的安全威胁
IOT 解决方案的几乎每个方面都存在安全风险。您已经看到了有人利用 IOT 设备是多么容易。即使是内置安全功能的 IOT 设备也可能不够。例如,惠普 21 最近的一项研究显示,10 台设备中有 8 台未能实施强密码访问要求。事实上,大多数人用的是简单的“1234”正如我们已经讨论过的,密码安全性只是安全性需要改进的一个方面。
该报告还得出结论,在测试的设备中,60%的具有某种形式的用户界面的设备容易受到攻击,70%的设备使用未加密的网络服务,80%的设备根本不需要密码(即使是他们的云和移动组件),90%的设备收集了某种形式的个人信息或数据。考虑到这一点,以下部分讨论了我们 IOT 开发者在规划我们的 IOT 解决方案时需要考虑的几个关键领域。
通信协议
使用的网络或通信协议可能会被拦截,特别是如果数据是使用定义明确、格式化的明文数据块(在某些协议中称为数据包)传输的。检测网络电缆上的电流或截取 WiFi 信号来确定交换的数据并不困难。解决这个问题的一个方法是使用加密。
数据加密虽然有点普遍,但却是保护数据的好方法。如果您使用的加密使用难以猜测的 128 位算法和密钥,情况尤其如此。幸运的是,加密技术已经被嵌入到几种形式的集成电路中,这使得将它添加到小型电子设备中成为可能。的确,你可以为一个有加密功能( http://sparkfun.com/products/13183
)的 Arduino 买一个盾。
无论您是否使用加密,保护您的通信协议不被直接访问是一些解决方案失败的另一个方面。也就是说,不要把你的以太网电缆放在你家外面容易够到的地方。如果您必须运行以太网或类似电缆,请确保将它们埋在导管中,这样就不会有人意外发现它们。如果您无法隐藏或保护电缆,请将任何暴露的电缆涂上与周围区域相同的颜色,使其更难被发现。白色围栏柱上的白色电缆,如果你不知道它在那里,你很难看到它。
隐私政策
一个经常被忽视的安全方面是收集和保留数据的隐私政策(有时称为数据保留政策)。如果您正在为自己开发一个 IOT 解决方案,并将数据存储在您自己的数据库服务器上,可能不会有问题。但是,如果您正在使用 IOT 云服务,您可能需要考虑该服务的隐私政策。例如,如果您使用一项服务来存储数据以供以后访问或分析,并决定取消该服务,公司会如何处理这些数据?他们会把它放在任何人都可以偶然发现的地方,还是在你的帐户到期后公司会删除它?
对于价值很小或没有价值且不能用来对付您的数据,隐私政策可能不是问题。但是对于诸如您的地址、姓名、病史等数据,隐私政策可能是一个问题。因此,您应该经常检查您计划使用的所有服务的隐私和数据保留政策。
远程维护
提供具有嵌入式软件的 IOT 设备和解决方案的公司通常会提供定期更新固件或软件的方法。事实上,考虑提供这种功能的解决方案非常重要,这样您就可以获得最新的修复和改进。您不仅可以获得新功能,更重要的是,您可以获得最新的安全更新。例如,Jeep 已经修补了其信息娱乐系统,并提供补丁(需要经销商安装)来提高安全性。
但是,如何传输和应用补丁或修复程序的机制应该是安全的。例如,如果修补程序需要特殊的管理帐户,请确保该帐户使用您设置的密码进行保护。换句话说,永远不要使用默认因子。此外,补丁如何到达您的系统是另一个问题。如果你不得不将你的解决方案暴露给互联网上的机器或人,你可能要重新考虑。仅使用安全的补丁传输机制。也就是说,将补丁下载到 USB 驱动器,然后将其传输到 IOT 系统,并故意应用它,这比允许 IOT 供应商自动更新您的系统更安全。
密码策略
我之前讨论过密码策略。在回顾中,确保尽可能在所有账户上使用密码,并选择足够复杂的密码(不是 1234 或你的狗、街道或配偶的名字),但也不至于让你记不住。不要使用默认密码、没有密码的用户帐户或多个帐户使用同一个密码。
人身安全
我之前也提到过这个话题。对于 IOT 解决方案,这适用于系统中的所有设备。对于物理上必须位于安全区域之外的设备,请确保通过最大限度地减少暴露的硬件并锁定机箱来尽可能确保它们的安全。例如,向 IOT 服务器发送视频的摄像机可以被分割,使得只有摄像机部分在建筑物外部(例如),而通信电子设备在建筑物内部。虽然有人有可能黑进相机(或破坏它),但除了拦截信号,他们不太可能做任何事情。
同样,将 IOT 设备锁在 Shell 中可以降低风险,但风险要根据锁和 Shell 的坚固程度来权衡。也就是说,如果围栏是由可以切割的材料制成的,或者锁可以很容易地被移除,那么安全措施只会减慢犯罪者的速度。意志坚定的人仍将获胜。 22
软件和固件
另一个值得关注的方面是 IOT 解决方案中使用的固件和软件(操作系统)。我们需要确保基本操作系统和其他软件的安全。更具体地说,该软件使用安全的帐户,不能被远程破坏,使用加密,并可以加强攻击。例如,安全的 Linux 操作系统优于开放的访问系统。这也适用于防火墙外的任何 IOT 服务(公众可访问),包括 web 服务器、IOT 云服务等。
现在,您已经看到了一些更常见、更严重的安全风险,让我们从 IOT 解决方案的角度来讨论安全性。
保护 IOT 解决方案
让我们将注意力转向如何为 IOT 解决方案采用安全实践。虽然本节并未涵盖所有可能的安全实践,但它旨在让您思考如何保护自己的 IOT 解决方案。但在此之前,让我们回顾一下 IOT 解决方案的一般架构和术语。下面从最底层(IOT 设备)到最高层(IOT 云服务)介绍了几种可用于构建 IOT 解决方案的节点。请记住,就功能而言,这些层也是从简单到复杂排序的。这恰好也大致对应于每个级别的安全性。也就是说,较低层比较高层更容易保护(除了一些例外,如外部传感器的物理访问)。图 1-10 显示了如何在 IOT 架构中安排节点。
图 1-10。
IOT device architecture Tip
我在整本书中使用这些术语。
- 数据收集器:传感器、IOT 设备等,从某些事件或观察中产生数据。
- 数据聚集器:从一个或多个数据收集器接收信息的节点(嵌入式控制器、微控制器、小型计算机等)。其目的是聚合和扩充数据,以便在下一层进行存储。
- 可操作设备:一种 IOT 设备,提供一些用户可控制的功能,如移动传感器、操作锁等。
- 数据库服务器:一个节点,通常是存储收集的数据以供以后检索和分析的服务器。
- IOT 服务:为数据库服务器和可操作设备提供访问层的计算机系统。它可能是位于解决方案防火墙内部或外部的系统。系统通常是互联网服务器或云服务,允许用户查看数据和操作可操作的设备。
现在让我们讨论如何保护每一层。
保护数据收集器
数据收集器(或 IOT 设备)是指那些具有一个或多个产生数据的传感器的设备。这些设备通常由低成本的电子设备构成,仅提供最低限度的数据传输能力。我已经建议使用 XBee 模块通过简单的协议传输数据。我还提到了从物理上保护设备不被篡改。除了这些原则之外,你应该考虑用低成本的电子设备制造数据收集器,避免使用更复杂的小型计算机,例如微控制器或 XBee 模块。如果计划得当,这个级别的设备不需要帐户或其他登录功能。
保护数据聚合器
数据聚合器代表了成熟的下一步。这里我们需要更强大的电子设备来处理数据。例如,我们可能希望像前面工厂监控示例中那样对数据进行限定。此外,数据聚合器是开始使用更复杂的通信协议(如以太网或 WiFi)的第一层。因此,您需要考虑帐户访问安全性(密码)以及远程访问能力。例如,您的数据聚合器可能支持通过远程登录进行网络访问。这些需要以与网络上任何其他计算系统相同的方式进行保护。
保护可操作的设备
保护可操作的设备可能更具挑战性。这是因为,除非你自己制作,否则这种设备很可能是一种商用设备,其功能比你需要的更多。您应该考虑禁用任何不需要的功能,尽可能确保远程访问的安全。此外,我建议将设备放在防火墙或 IOT 服务之后,如具有更安全访问机制的计算机应用或系统。例如,使用可通过加密和高度安全的远程访问来保护的应用向设备发送命令。如果这样做,不仅会使它更加安全,还可以限制外部(互联网)可用的功能或操作。
保护数据库服务器
数据库服务器(如果使用的话)应该像任何其他计算机系统一样受到保护,不被访问。有许多文本(书籍、博客、维基等等)非常详细地涵盖了这个主题。我将在后面的章节中介绍一些最佳实践。在此期间,考虑使您的数据库服务器成为解决方案中的一个节点,防止防火墙外的访问,所有帐户都使用密码保护,数据也防止本地文件访问。换句话说,强化您的数据库服务器。
Tip
您可以在 http://mysql.com/why-mysql/presentations/mysql-security-best-practices/
找到 MySQL 安全最佳实践。
保护 IOT 服务
这一层是最难保护的。如果您从第三方购买(租赁)IOT 服务,安全性是为您构建的。您有责任确保使用所有可能的合理做法来保护您在服务中的数据。例如,使用良好的密码策略。另一方面,如果您构建自己的面向互联网的服务,您应该尽可能以最安全的方式对待系统。也就是说,如果没有加密、安全登录等等,您的服务器不应该被远程访问。如果您计划这样做,您应该考虑精通如何保护 web 服务。
摘要
物联网对每个人来说都是一个激动人心的新世界。我们这些内心年轻但年龄足够大的人还记得杰特森的电视连续剧,回想起在虚幻的土地上看到的可能。尽管会说话的烤面包机、从公文包里蹦出来的会飞的汽车和有态度的机器人,几十年前的电视幻想正在成为现实。我们有手表,可以兼作电话和视频播放器,我们可以从世界各地解锁我们的汽车,我们可以知道我们的狗是否出去了,我们甚至可以在城市的另一边开门。所有这些都是可能的,并且随着 IOT 的出现而发挥作用。
在本章中,您了解了什么是 IOT 以及 IOT 解决方案是如何构建的,了解了一些描述 IOT 解决方案架构的术语,并看到了一些著名的 IOT 解决方案的示例。我们还讨论了 IOT 解决方案的两个最关键的问题:大数据和安全性,通过实际例子和对问题要点的讨论。在这个过程中,您甚至看到了一些源代码!
在下一章中,您将看到许多可用于构建 IOT 解决方案的硬件。你将会看到用于装载或读取传感器的设备,以及用于收集、扩充、存储和展示数据的设备。
Footnotes 1
https://en.wikipedia.org/wiki/Internet_of_Things
。
https://pixabay.com/en/network-iot-internet-of-things-782707/
。
https://en.wikipedia.org/wiki/Internet_refrigerator
。
许多企业在软件中内置了自动再订购功能。大多数是由软件或数据库事件(如数量不足)触发的,而存储单元中的传感器会触发其他事件。
CC 乘 2.0 ( http://creativecommons.org/licenses/by/2.0
)。
CC 乘 2.0 ( http://creativecommons.org/licenses/by/2.0
)。
见 http://makezine.com/projects/make-37/gps-cat-tracker-2/
关于如何为宠物建造一个小型 GPS 追踪器的信息。技术将是相同或相似的。
https://en.wikipedia.org/wiki/Home_automation
。
提示:请参见 Arduino IDE 中以太网类别下的 web 服务器示例。
我曾经看到过一个保险杠贴纸,上面写着,“互联网已经满了。去外面玩吧。”虽然这个口号异想天开,但它包含了一点事实和对年轻一代的一些建议。
https://en.wikipedia.org/wiki/IPv6
。
https://github.com/ChuckBell/MySQL_Connector_Arduino
。
https://en.wikipedia.org/wiki/Big_data
。
比如,不应该用 750 万年才能得到 42 的答案。
这太荒谬了。
不,真的,这是真的。这是一个很好的例子,说明良好的安全实践可能会出问题,不管意图多么好。也就是说,如果该策略使用户的生活如此艰难,以至于他们必须违反最佳安全实践来应对,那么该策略就走得太远了。
这不是一个真正的解决方案,但它确实降低了风险。
我完全厌恶组合词( https://en.wikipedia.org/wiki/Portmanteau
)。为什么不能只说“资讯娱乐”?。
http://wired.com/2015/07/hackers-remotely-kill-jeep-highway/
。
你不会这么做的,对吧?如果你这样做,停止它!在你回来后贴这些照片,而不是当你在 3000 英里外的沙子里。
www8.hp.com/h20195/V2/GetPDF.aspx/4AA5-4759ENW.pdf
。
有点像窗户。当然,我们都锁窗户,但是一块砖头或大小合适的石头会很快打破玻璃。
二、IOT 解决方案的硬件
Electronic supplementary material The online version of this chapter (doi:10.1007/978-1-4842-1293-6_2) contains supplementary material, which is available to authorized users.
大多数 IOT 解决方案,无论是手工制造的还是用于商业销售的大规模生产的,都是从使用分立元件的基本设计原型化而来。大多数业余爱好者和发烧友的解决方案都是基于他们可以从零售商(或者批发商,如果他们生产很多产品的话)那里买到的组件。因此,许多商用硬件都是现成的。
本章介绍了几个在构建 IOT 解决方案时可以使用的较为流行的商用硬件示例。因为每样东西都有如此多的种类,我不会试图或声称这一章包罗万象。例如,我简要描述了几种常见的低成本计算板,但每天都有更多的板被添加进来。要把它们全部列出来,需要几倍于这本书的大部头。然而,我在第 8 章中展示了如何使用本章提到的一些硬件的例子。
本章讨论了流行的 Arduino 微控制器板,简要介绍了 Arduino 软件的使用,讨论了流行的低成本计算板,调查了通信硬件,甚至简短讨论了可用的传感器类型。
虽然您不需要成为列出的任何硬件的专家,通读本章将使您获得选择要购买的硬件和开始使用硬件所需的知识。毕竟,这是一本关于使用 MySQL 实现 IOT 解决方案的书,而不是关于如何构建 IOT 解决方案的深入指导——但我在本章中有一些这方面的信息,更多信息在第 8 章中。
让我们先来看看 IOT 解决方案中最常见、也可能是唯一最通用的硬件元件——微控制器。
Hobbyist Or Enthusiast: What’S The Difference?
爱好者建造东西是因为他们可以,而且通常是因为他们从建造中获得了很多乐趣,而不一定是因为他们需要建造。爱好者也倾向于囤积或收集。业余爱好者为一个单一的目的建造东西,通常不像爱好者那样沉迷。因此,一个爱好者就是一个在业余爱好和痴迷之间转了弯的爱好者。
微控制器
微控制器微控制器的可用内存量有限,命令功能有限(例如与硬件交互的操作),连接很少(通常是编程和电源连接器),并且通常使用专门的编程语言。
有许多可用的微控制器,从安装了 AVR 固件的裸 IC2到支持可加载程序和各种硬件扩展的基于微控制器的平台。幸运的是,有很多这样的平台。
Arduino 是最受欢迎和最广泛使用的微控制器平台之一。以下部分提供了大量关于 Arduino 的信息,包括您可以购买的主板示例,甚至还有如何对 Arduino 进行编程的教程。
Note
我经常用术语微控制器或微控制器平台来讨论产品类别,用主板来指代特定版本的平台。
什么是 Arduino?
Arduino 是一个由开源软件环境支持的开源硬件原型平台。它于 2005 年首次推出,设计目标是使硬件和软件易于使用,并尽可能提供给最广泛的受众。因此,使用 Arduino 并不需要成为电子专家。
最初的目标受众包括艺术家和爱好者,他们需要一个微控制器来使他们的设计和创作更有趣。然而,由于其易用性和多功能性,Arduino 很快成为更广泛的受众和更广泛的项目的选择。
这意味着您可以将 Arduino 用于各种项目,从对环境条件做出反应到控制复杂的机器人功能。Arduino 还通过实际应用使学习电子学变得更加容易。
有助于 Arduino 平台迅速采用的另一个方面是,通过 Arduino 官方网站( http://arduino.cc/en/
)提供丰富信息的贡献者社区越来越多。当您访问该网站时,您会发现一个优秀的“入门”教程,以及一个有用的项目想法列表和一个完整的类似 C 语言的参考指南,用于编写控制 Arduino 的代码(称为草图)。
Arduino 还提供了一个名为 Arduino IDE 的集成开发环境。IDE 在您的计算机(称为主机)上运行,在那里您可以编写和编译草图,然后通过 USB 连接将它们上传到 Arduino。IDE 可用于 Linux、Mac 和 Windows。它是围绕一个专门为编写代码而设计的文本编辑器和一组旨在支持编译和加载草图的有限功能而设计的。
草图是以一种特殊的格式编写的,只包含两个必需的方法——一个在 Arduino 复位或通电时执行,另一个持续执行。因此,您的初始化代码放在setup()
中,控制 Arduino 的代码放在loop()
中。这种语言类似于 C 语言,你可以定义自己的变量和函数。关于写草图的完整指南,见 http://arduino.cc/en/Tutorial/Sketch
。
您可以通过编写封装了某些功能(如联网、使用存储卡、连接数据库、做数学等)的库来扩展草图的功能并提供重用。IDE 中包含了许多这样的库。也有一些由他人编写并通过开源协议贡献给 Arduino.cc 的库——其中一些已经与 IDE 捆绑在一起。
Arduino 支持许多模拟和数字引脚,您可以使用这些引脚来连接各种设备和组件并与之交互。主流主板有特定的引脚布局或接头,允许使用称为屏蔽的扩展板。Shields 允许您为 Arduino 添加额外的硬件功能,如以太网、蓝牙和 XBee 支持。Arduino 和盾牌的物理布局允许你堆叠盾牌。因此,您可以拥有以太网屏蔽和 XBee 屏蔽,因为两者使用不同的 I/O 引脚。在探索如何将 Arduino 应用于 IOT 网络的过程中,您将了解插针和屏蔽的用法。
在开发电路或制作电路原型时,Arduino 最适合与试验板一起使用。试验板旨在允许您插入电气元件,并提供各列之间的互连,以便您可以将两个元件的引线插入同一列,从而实现连接。电路板分为两行,便于在电路板中央使用 IC。电线(称为跳线)可用于将试验板上的电路连接到 Arduino。在本章的后面你会看到一个这样的例子。
接下来的几节将研究各种 Arduino 板——Arduino 品牌板和第三方板。有更多的电路板和变体可供使用,在本书出版时可能会有一些新的电路板问世,但这些是我在 IOT 项目和实验中使用的电路板。这些都可以成为你自己项目的良好基础。
Arduino 型号
越来越多的 Arduino 板可供使用。一些是为特殊应用而配置的,而另一些是为不同的处理器和内存配置而设计的。一些主板被认为是官方的 Arduino 主板,因为它们是由 Arduino.cc 品牌化和认可的。因为 Arduino 是开源的,更具体地说,是使用知识共享归属共享许可授权的,任何人都可以构建 Arduino 兼容的主板(通常称为 Arduino 克隆)。但是,您必须遵守 Arduino.cc. 3 制定的规则和指南。本节将介绍一些更受欢迎的 Arduino 品牌主板。
Arduino 板的基本布局由一个 USB 连接、一个电源连接器、一个复位开关、用于电源和串行通信的 led 以及一组用于连接屏蔽的标准间距接头组成。官方电路板上有一个独特的蓝色印刷电路板,上面印有白色字体。除了一个型号之外,所有官方主板都可以安装在一个机箱中(它们在 PCB 上有孔,用于安装螺钉)。例外情况是 Arduino 设计用于安装在试验板上。
Arduino 零号
Arduino Zero 是 Arduino.cc 提供的最新小尺寸 Arduino 板。它与 Arduino Uno 系列( http://arduino.cc/en/Main/ArduinoBoardUno
)中的板具有相同的物理布局,但具有更快的 32 位处理器。该板类似于 Leonardo 板(参见“Arduino Leonardo”部分),有 20 个数字 I/O 引脚,其中 18 个可用作模拟引脚。它有更多的内存,256KB 的闪存和 32KB 的 SRAM。时钟速度也更快,为 48MHz。图 2-1 显示了 Arduino Zero 板的早期版本。
图 2-1。
Arduino Zero
该板配有 USB 主机端口,因此您可以通过 USB 编写草图来访问设备,如键盘或鼠标。
Arduino Zero 是大多数 Arduino 项目的绝佳选择,可以解决许多使用旧主板的内存和性能问题。虽然 Arduino Zero 不能取代糟糕或低效的编程,但它可以改善需要更高处理能力,更重要的是需要更多内存的解决方案。
Tip
Arduino Zero 在 3.3V 下运行。使用屏蔽和连接组件时要格外小心,确保不会损坏主板。
虽然这是我的微控制器产品组合中最新的 Arduino 板,但我已使用该板测试需要更多内存的草图。事实上,在我的 IOT 解决方案中,它已经被证明是一个很好的节点选择,我可以在这里聚合或扩充数据。增加的内存意味着我还可以在数据库服务器上发出查询来查找计算值。
您可以在 http://arduino.cc/en/Main/ArduinoBoardZero
找到 Arduino Zero 的具体文档。
arduino yún
Arduino Yún 是非常不同的 Arduino 板。虽然它是并支持作为普通 Arduino 板使用(您可以运行相同的草图),但 Yún 有两个处理器:Atmel ATmega32U4 是一个与 Leonardo 兼容的微控制器,Atheros AR9331 运行一个缩小版本的 Linux 和 OpenWrt 无线堆栈。
Yún 有一个 USB 主机控制器以及 WiFi 和以太网网络。事实上,您可以使用 WiFi 功能来形成无线接入端口,使 IOT 解决方案能够托管自己的 WiFi 连接设备。与 Zero 一样,该板采用 3.3V 电源供电,要求您仔细选择组件和屏蔽,以确保不会损坏该板。图 2-2 描绘了 Arduino Yún。
图 2-2。
Arduino Yún
Yún 并不适合所有人。但是,如果您需要能够将 Arduino shields 的使用与用 Python 编写的更强大的脚本结合起来,那么对于将 Python 的强大功能与 Arduino 兼容组件和 shields 的多功能性结合起来,Yún 可能是一个不错的选择。有其他一些主板在这方面做得更好,但大多数都不包括 WiFi 接入端口功能。如果您需要或希望在您的解决方案中提供强大的无线接入端口功能,可以运行您的任何 Arduino 草图,Yún 是一个不错的选择。
到目前为止,我已经使用我的 Yún 创建了离散的 WiFi 网络,用于网络问题的取证和诊断。使用 Yún 作为接入端口,我可以做我在自己的 WiFi 网络上不会做的事情。毕竟,如果事情变糟了,我可以重置我的 Yún,再试一次。用你自己的无线接入路由尝试这种方法要危险得多。
您可以在 http://arduino.cc/en/Guide/ArduinoYun
找到 Arduino Yún 的具体文档。
阿尔狄诺·莱昂纳多
莱昂纳多董事会是一个基于 Uno 的老董事会的演变。虽然它支持标准的头部布局,但它不支持一些旧的盾牌。但是,它增加了一个更快的处理器和一个 USB 控制器,使主板可以作为主机的 USB 设备。较新的 ATmega32u4 处理器有 20 个数字 I/O 引脚,其中 12 个可用作模拟引脚,7 个可用作脉宽调制(PWM)输出。它有 32KB 的闪存和 2.5KB 的 SRAM。
莱昂纳多比它的前辈有更多的数字 pin,但继续支持大多数盾牌。USB 连接使用较小的 USB 连接器。该板有带接头和不带接头两种。图 2-3 描绘了一个官方的莱昂纳多董事会。
图 2-3。
Arduino Leonardo
我已经用 Leonardo 升级了我的许多基于 Arduino 的老项目。虽然该板并没有提供比一些旧板更多的功能(但有一些,特别是内存),我可以使用新的盾牌,这开始需要新的头部布局。
你可以在 http://arduino.cc/en/Main/ArduinoBoardLeonardo
找到 Arduino Leonardo 的具体文档。
arduino 号
Arduino Due 是一款基于 Atmel SAM3X8E ARM Cortex-M3 处理器的新型、更大、更快的主板。处理器为 32 位处理器,板卡支持海量的 54 个数字 I/O 端口,其中 14 个可用于 PWM 输出;12 路模拟输入;以及 4 个 UART 芯片(串口);以及两个数模(DAC)和两个双线接口(TWI)引脚。新处理器有几个优点。
- 32 位寄存器
- DMA 控制器(允许独立于 CPU 的内存任务)
- 512KB 闪存
- 96KB SRAM
- 84 兆赫时钟
Due 具有更大的外形尺寸(称为 mega footprint ),但仍然支持使用标准屏蔽,但它也支持 mega 格式屏蔽。这种新板有一个明显的限制:不像其他板在 I/O 引脚上可以接受高达 5V 的电压,在 I/O 引脚上的 Due 限制为 3.3V。图 2-4 显示了一个 Arduino Due 板。
图 2-4。
Arduino Due
Arduino Due 可用于需要更多处理能力、更多内存和更多 I/O 引脚的项目。我在极少数需要更多 I/O 引脚或更多内存的情况下使用 Due。然而,对于新的 Zero,除非我需要增加 I/O 引脚,否则我可能会在物理大小是一个问题的情况下使用 Zero。如果你没有空间问题,看看你的项目需要最大的硬件性能。
您可以在 http://arduino.cc/en/Main/ArduinoBoardDue
找到 Arduino 的具体文档。
Arduino Mega 2560
Arduino Mega 2560 是 Due 的旧版本。它基于 ATmega2560 处理器(因此得名)。与 Due 一样,该板支持大量的 54 个数字 I/O 端口,其中 14 个可用作 PWM 输出;16 路模拟输入;和 4 个 UARTs(硬件串行端口)。它使用 16MHz 时钟和 256KB 闪存。图 2-5 显示了 Arduino Mega 2560 板。
图 2-5。
Arduino Mega 2560
Mega 2560 本质上是标准 Arduino (Uno、Duemilanove 等)的更大形式,并支持标准盾牌。有趣的是,Arduino Mega 256 是 Prusa Mendel 和类似 3D 打印机的首选主板,这些打印机需要使用名为 rep rap Arduino Mega polo Lu Shield(RAMPS)的控制板。事实上,这就是我的 Mega 2560 主板现在所在的位置——在我的 3D 打印机中!也就是说,像 Due 一样,如果您需要额外的 I/O 引脚或更多内存,并且大小不是问题(大小与 Due 相同),您可以使用此板。
您可以在 http://arduino.cc/en/Main/ArduinoBoardDue
找到 Arduino 的具体文档。
arduino 翻制
第三方 Arduino 板卡(也叫克隆体)越来越多。它们的外形、组件甚至功能都各不相同。幸运的是,大多数都 100%兼容 Arduino,这使得在基于 Arduino 的项目中使用它们变得很容易。即使该板与特定的 Arduino 板(例如 Leonardo)不是 100%兼容,第三方板也已经添加到 Arduino 集成开发环境中,只需要您在编译时选择特定的板。你将在本章后面看到这一点。
以下部分描述了我在项目中使用的一些第三方 Arduino 板。你可能会遇到一些这样的人,甚至更像他们。正如你将看到的,有些有非常不同的布局,在实现你的项目时给你更多的选择。由于这些主板保持了与 Arduino 品牌主板的兼容性,因此我将通过关注其独特的功能来简要描述它们。
Sparkfun 红板
Sparkfun Redboard ( http://sparkfun.com/products/12757
)是 Arduino Uno 的高级版本。它使用相同的引导加载程序,增加了一个 FTDI 接口(用于旧的 Duemilanove 主板),以及最新 Arduino UNO R3 的 R3 shield 兼容性。事实上,Sparkfun 通过带回旧主板的最佳品质,彻底改造了 Arduino Uno。是的,它是红色的。图 2-6 显示了 Sparkfun 红板。
图 2-6。
Sparkfun Redboard
我最喜欢 Redboard 的一点是,它比 Arduino 品牌的电路板便宜一点,而且很容易从 Sparkfun 买到。更好的是,Sparkfun 库存了许多补充 Redboard 的盾牌和配件。事实上,Sparkfun 有一个非常棒的工具包,叫做 spark fun Inventor ’ s Kit(http://sparkfun.com/products/12060
),可以帮助你学习 Arduino 编程和构建电路。
Tip
如果你的朋友和家人有兴趣了解更多关于 Arduino 的知识,Sparkfun Inventor 的工具包将是一个很好的礼物。
你可以在 https://learn.sparkfun.com/tutorials/redboard-hookup-guide
找到 Sparkfun Redboard 的具体文档。
TinyCircuits TinyDuino
TinyDuino 是对标准 Uno 物理布局的有趣改变。顾名思义,就是一个小板子。事实上,它只比美国的四分之一稍大一点! 4 如图 2-7 所示,主板(中底)约 21×21mm。那很小。
图 2-7。
TinyDuino
图 2-7 显示了四个模块(也称为板卡或核心模块);最上面一排从左到右是一个用于编程 TinyDuino 的 USB 盾、一个 MicroSD 读卡器和一个原型板。中间底部的模块是主处理器模块。
TinyDuino 与 Arduino Uno 兼容,具有相同的处理器、内存、引脚等。有一些小差异,但没什么大不了的。事实上,TinyDuino 将运行你所有的草图,并且可以像 Arduino Uno 一样进行编程。你不能用 Arduino 护盾来对付 TinyDuino。
除了尺寸小之外,TinyDuino 处理器板还有一个电池座,使用 CR1632 纽扣电池为板供电。这使得你的 Arduino 解决方案非常小,甚至可以用电池供电!更好的是,还有其他版本的主处理器板具有锂电池连接器,甚至没有电池支持,您可以使用它来硬连线电源。
这些板通过一个微型连接器连接起来,这样你就可以把它们堆叠起来。除了一些例外,它们可以按任何顺序堆叠。处理器板底部没有连接器,原型板顶部也没有连接器。不管怎样,即使你把四块板子都叠起来,TinyDuino 叠起来也只有 20 毫米高。
Tip
为了对 TinyDuino 进行编程,您必须有 USB 板,但是一旦编程完成,您就可以移除该板。
如果您需要使用多个引脚,我认为还有一种板是必备的。原型板有一些引脚断裂,但不是全部。图 2-8 中所示的端子模块允许访问所有 Arduino 引脚,并为每个引脚配备螺丝端子!那很酷。虽然它比核心处理器模块大一点,但仍然非常小。
图 2-8。
TinyDuino terminal board
更好的是,TinyDuino 的制造商 TinyCircuits ( http://tiny-circuits.com/
)提供了越来越多的模块选择,可以添加到你的小 Arduino 套件中。有用于 LED、蓝牙、WiFi、实时时钟(RTC)、加速度计、音频、双七段显示器、GPS 甚至微型有机发光二极管屏幕的模块。有了这么多可用的模块,您可以在普通 Arduino 板的一小部分大小上构建一个真正强大的 Arduino 解决方案。
因此,对于需要尽可能小的解决方案来说,TinyDuino 是一个极好的选择。我在可穿戴设备中见过这些板, 5 在小玩具中,甚至在手表大小的 Arduino 设备中也见过。体积小,功耗低,非常适合藏在小地方。
您可以在 http://tiny-circuits.com/tinyduino_overview
找到 TinyDuino 的具体文档。
spikenzielabs 啜饮
SpikenzieLabs ( www.spikenzielabs.com
)的 Sippino 可以用在无焊料的试验板上。它的成本更低,因为它的元件更少,占地面积更小。幸运的是,SpikenzieLabs 还提供了一种称为 shield dock 的特殊适配器,允许您将 Sippino 与标准 Arduino shields 一起使用。
它基于 ATmega328 处理器,具有 14 个数字 I/O 引脚,其中 6 个可用作 PWM 输出,6 个模拟输入引脚。Sippino 板有 32KB 的闪存和 2KB 的 SRAM。图 2-9 显示了带有试验板接头的 Sippino。
图 2-9。
Sippino
Sippino 没有 USB 连接,所以你必须使用 FTDI 电缆对其进行编程。好消息是,无论您的项目中有多少个 Sippinos,您都只需要一根电缆。我有许多 Sippinos,并在我的许多 Arduino 项目中使用它们,这些项目的空间非常宝贵。
shield dock 是一个令人惊叹的附件,它可以让您像使用标准的 Uno 或 Duemilanove 一样使用 Sippino。图 2-10 显示了安装在屏蔽坞上的 Sippino。
图 2-10。
Sippino shield dock
我已经在许多项目中使用了 Sippino,从小型极客闹钟(想想伺服系统、模拟仪表和老式发光灯泡)到传感器网络中的传感器节点。小尺寸和卡布局使得 Sippino 很容易隐藏在一个小 Shell 中。如果您需要或想要在一个小封装中兼容较旧的 Arduino 板(或偶尔需要使用 Arduino Uno 兼容屏蔽), Sippino 是一个不错的选择。
我喜欢这些板的另一个原因是它们作为套件出售,你可以自己组装板。组装很容易,除了读取电阻值(这是每个电子爱好者都必须掌握的技能),元件很容易对准电路板上的正确位置。
你可以在 http://spikenzielabs.com
找到西皮诺和神盾局船坞的具体文档。
斯皮肯齐实验室普罗托蒂诺
Prototino 是 SpikenzieLabs 的另一个产品。它与 Sippino 具有相同的元件,但它不是一个友好的试验板布局,而是安装在一个包含完整原型制作区域的 PCB 上。与 Sippino 一样,它基于 ATmega328 处理器,具有 14 个数字 I/O 引脚,其中 6 个可用作 PWM 输出,6 个模拟输入引脚。Prototino 板有 32KB 的闪存和 2KB 的 SRAM。
Prototino 是构建具有支持组件和电路的解决方案的理想选择。在某些方面,它类似于 Nano、Mini 和类似的板,因为您可以将其用于永久安装。但与这些电路板(甚至 Arduino Pro)不同的是,Prototino 为您提供了一个直接将组件添加到电路板的空间。我在项目中使用了许多 Prototino 板,在这些项目中,我将组件添加到 Prototino 中,并将其安装在机箱中。这让我可以使用一块板创建一个解决方案,甚至可以快速轻松地构建几个副本。
像 Sippino 一样,Prototino 没有 USB 连接,所以你必须使用 FTDI 电缆来编程。图 2-11 显示了一个 Prototino 板。
图 2-11。
Prototino
我在许多项目中使用过 Prototino,在这些项目中,我在试验板上制作了一个电路原型,并希望将其快速转移到一个永久电路板上。事实上,我开始在我的许多早期项目中使用 Prototino,因为它非常容易处理焊盘的试验板布局。
与 Sippino 一样,Prototino 仅提供自组装套件。您可以在 http://spikenzielabs.com
找到 Prototino 的具体文档。
Sparkfun ESP8266 WiFi 模组
在我收集的第三方 Arduino 板中,还有最后一块板。ESP8266 WiFi 模块是该类别的最新产品之一。由于其独特的特征,它有时被列入 IOT 类别。Sparkfun 的 ESP8266 有许多很酷的功能,如 LiPo 电池连接器,开/关开关(非常方便),外部天线连接器(也方便增加范围),USB 编程端口,当然还有所有可用的引脚。板子也很小。
您可以通过添加一个特殊的插件,使用 Arduino 集成开发环境对 ESP8266 进行编程。有关如何配置板管理器的更多详细信息,请参见 https://github.com/esp8266/Arduino
。图 2-12 显示了 Sparkfun ESP8266 板。
图 2-12。
ESP8266 Thing
ESP8266 是另一种小型物理布局板,可用于为 IOT 网络(或单一解决方案)创建节点。我还没有在任何真正的项目中使用过我的模块,但是这个模块的功能非常吸引人。
Sparkfun 还出售一种 Arduino 大小的电路板,称为 ESP8266 WiFi shield,你可以与你的 Arduino 电路板一起使用( http://sparkfun.com/products/13287
)。它可以用来为您的 Arduino 项目提供 WiFi 功能。我也有一个,我用它来代替普通的 Arduino WiFi shield(参见“推荐附件”侧栏),主要是因为我想尝试 ESP8266 WiFi 功能,而不需要额外的工作来编程 ESP8266。
你可以在 Sparkfun 的优秀资源库 https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide
找到更多关于 ESP8266 的信息。
Recommended Accessory
如果你打算用你的 Arduino 或其他微控制器板做任何原型,我建议你买一个或做一个你自己的实验底座(有时叫做试验板支架)。你可以很容易地用丙烯酸做一个,就像我在这里展示的例子中所做的那样。在这种情况下,我有一个旧的 Duemilanove 板安装在一个半尺寸的试验板旁边。我甚至有空间放置一个 9V 的电池架来为实验供电。
您也可以购买预钻孔的产品,用于大多数 Arduino Uno 尺寸的主板。既有 Sparkfun ( http://sparkfun.com/products/11235
)又有 Adafruit ( http://adafruit.com/products/275
)的股票优秀例子。你也可以找到这些其他板,如树莓派。
将微控制器和试验板放在一起,可以将实验从一个地方移到另一个地方,或者停止实验,以后再继续。
Arduino 教程
本节是一个简短的教程,介绍如何开始使用 Arduino。它涵盖了获取和安装 IDE 以及编写示例草图。我没有重复本书之前的优秀作品,而是涵盖了重点,并向不太熟悉 Arduino 的读者推荐在线资源和其他提供更深入介绍的书籍。此外,Arduino IDE 有许多示例草图,您可以使用它们自己探索 Arduino。大多数在 http://arduino.cc
网站上都有相应的教程。
学习资源
有很多关于 Arduino 平台的信息。如果您刚刚开始使用 Arduino,Apress 提供了一系列令人印象深刻的书籍,涵盖了与 Arduino 相关的各种主题,从微控制器入门到学习其设计和实现的细节。以下是一些比较受欢迎的书籍:
- 迈克尔·麦克罗伯茨的《Arduino 入门》
- 实用的 Arduino:开源硬件的酷项目(技术在行动中)
- 戴尔·威特的 Arduino 内部(2011 年出版)
还有一些优秀的在线资源,可以帮助您了解更多关于 Arduino、Arduino 库和示例项目的信息。以下是一些最好的:
- Arduino.cc:
http://arduino.cc/en/
- 阿达果教程:
http://learn.adafruit.com/
- 制作教程:
http://makezine.com/category/electronics/arduino/
Arduino IDE
Arduino IDE 可供 Mac、Linux (32 位和 64 位版本)和 Windows 平台下载。你可以从 http://arduino.cc/en/Main/Software
下载 IDE。每个平台都有链接,如果需要为不同的平台编译 IDE,还可以链接到源代码。
安装 IDE 非常简单。为了简洁起见,我省略了安装 IDE 的实际步骤,但是如果您需要安装 IDE 的指导,您可以点击下载页面上的入门链接,或者阅读 Michael McRoberts 的《Arduino 入门》( Apress,2010)中的更多内容。
Tip
如果您需要在 Windows 上安装驱动程序的帮助,请参见 http://arduino.cc/en/Guide/Howto
。
IDE 启动后,您会看到一个简单的界面,其中有一个文本编辑器区域(默认情况下为白色背景),编辑器下方有一个消息区域(默认情况下为黑色背景),顶部有一个简单的按钮栏。按钮(从左至右)是编译、编译和上传、新建、打开和保存。右边还有一个打开串行监控器的按钮。您可以使用串行监控器查看通过串行库发送(或打印)的 Arduino 消息。您将在您的第一个项目中看到这一点。图 2-13 显示了 Arduino IDE。
图 2-13。
The Arduino IDE
注意,在图 2-13 中,你可以看到一个样本草图(称为闪现)和一个成功编译操作的结果。注意在底部,它告诉你你正在一个特定的串行端口上编程一个 Arduino Uno 板。
由于处理器和支持架构的不同,编译器构建程序的方式(以及 IDE 上传程序的方式)也有所不同。因此,当您启动 IDE 时,首先要做的事情之一就是从“工具”“➤板”菜单中选择您的板。图 2-14 显示了在 Mac 上选择板卡的示例。
图 2-14。
Choosing the Arduino board
请注意可用的电路板数量。请务必选择与您的主板相匹配的产品。如果您使用的是克隆板,请查看制造商的网站,了解推荐使用的设置。如果你选择了错误的板,你通常会在上传时得到一个错误,但是你选择了错误的板可能并不明显。因为我有很多不同的主板,所以我养成了每次启动 IDE 时都选择主板的习惯。
接下来您需要做的是选择 Arduino 板连接的串行端口。要连接到板,使用工具➤端口菜单选项。图 2-15 显示了一个 Mac 上的例子。在这种情况下,没有列出串行端口。如果您没有将 Arduino 插入电脑的 USB 端口(或集线器),如果您插入了它但在某个时候断开了它,或者如果您没有加载 Arduino 的驱动程序(Windows ),就会发生这种情况。通常,这可以通过简单地拔出 Arduino 并将其插回,然后等待直到计算机识别该端口来解决。
图 2-15。
Choosing the serial port Note
如果你使用 Mac,你选择哪个端口并不重要——无论是以tty
开头的端口还是以cu
开头的端口都可以。
现在您已经安装了 Arduino IDE,您可以连接 Arduino 并设置板和串行端口。您会看到 Arduino 上的 led 亮起。这是因为 Arduino 从 USB 获得电源。因此,当 Arduino 连接到电脑时,您不需要提供外部电源。接下来,让我们深入一个简单的项目,这样您就可以看到 Arduino IDE,并了解如何构建、编译和上传基本草图。
项目:硬件“你好,世界!”
无处不在的“你好,世界!”Arduino 的项目是闪烁的灯。该项目使用一个 LED,一个试验板,和一些跳线。Arduino 在loop()
迭代过程中打开和关闭。这是一个很好的开始项目,但它与如何使用传感器无关。
因此,在本节中,您将通过添加传感器来扩展闪光灯项目。在这种情况下,您仍然可以通过使用可以说是最基本的传感器来简化事情:按钮。目标是每当按钮被按下时,LED 就会亮起。
给电路布线
让我们从组装 Arduino 开始。确保首先断开(关闭)Arduino。您可以使用任何带有 I/O 引脚的 Arduino 变体。在试验板上放置一个 LED 和一个按钮。将 5V 引脚连接到试验板电源轨,将接地引脚连接到接地轨,并将按钮放在试验板的中心。将 LED 放在试验板的一侧,如图 2-16 所示。
图 2-16。
Diagram of an LED with a pushbutton Tip
如果您打开闪亮的新 Arduino,您可能会看到板上的 LED 闪烁。这是因为一些 Arduino 板预装了闪烁草图。
你就快到了。现在,将一根跳线从电源轨连接到按钮的一侧,并将按钮的另一侧连接到 Arduino 上的(数字)引脚 2(位于带有 USB 连接器的一侧)。接下来,将 LED 连接到试验板上的地和一个 150 欧姆的电阻(颜色:棕色、绿色、棕色、金色)。电阻的另一端应连接到 Arduino 上的第 13 号针脚。你还需要一个电阻在按钮没被按下时把按钮拉低。将一个 10K 欧姆电阻器(颜色:棕色、黑色、橙色、金色)放在按钮的侧面,导线连接到引脚 2 和接地。
LED 最长的一边是正极。正极应该是连接到电阻的一侧。电阻接哪个方向都没关系;它用来限制 LED 的电流。再次检查图纸,以确保您有一个类似的设置。
Note
大多数 Arduino 板都有一个连接到引脚 13 的 LED。您将重复使用该引脚来演示如何使用模拟输出。因此,您可能会看到引脚 13 附近的一个小 LED 与试验板上的 LED 同时亮起。
写素描
这个项目需要的草图在 Arduino 上使用了两个 I/O 引脚:一个输出和一个输入。输出引脚将点亮 LED,输入引脚将检测按钮接合。将正电压连接到按钮的一侧,另一侧连接到输入引脚。当您检测到输入引脚上的电压时,您告诉 Arduino 处理器向输出引脚发送正电压。这种情况下,LED 的正极连接到输出引脚。
如图 2-17 中的图所示
图 2-17。
Arduino Ethernet shield
,输入引脚为引脚 2,输出引脚为引脚 13。让我们使用一个变量来存储这些数字,这样您就不必担心重复硬编码的数字(并冒着出错的风险)。使用pinMode()
方法设置每个引脚的模式(INPUT
、OUTPUT
)。您将变量语句放在setup()
方法之前,并在setup()
方法中设置pinMode()
调用,如下所示:
int led = 13; // LED on pin 13
int button = 2; // button on pin 2
void setup() {
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}
在loop()
方法中,您放置代码来检测按钮按压。使用digitalRead()
方法读取管脚的状态(LOW
或HIGH
),其中LOW
表示管脚上没有电压,HIGH
表示管脚上检测到正电压。
您还可以在loop()
方法中放置当输入引脚状态为HIGH
时打开 LED 的代码。在这种情况下,当输入引脚状态为HIGH
时,使用digitalWrite()
方法将输出引脚设置为HIGH
,同样,当输入引脚状态为LOW
时,将输出引脚设置为LOW
。下面显示了所需的语句:
void loop() {
int state = digitalRead(button);
if (state == HIGH) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}
现在让我们来看看完整的草图,以及相应的文档。清单 2-1 显示了完成的草图。
Listing 2-1.Simple Sensor Sketch
/*
Simple Sensor - MySQL for the IOT
For this sketch, we explore a simple sensor (a pushbutton) and a simple
response to sensor input (a LED). When the sensor is activated (the
button is pushed), the LED is illuminated.
*/
int led = 13; // LED on pin 13
int button = 2; // button on pin 2
// the setup routine runs once when you press reset:
void setup() {
// initialize pin 13 as an output.
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// read the state of the sensor
int state = digitalRead(button);
// if sensor engaged (button is pressed), turn on LED
if (state == HIGH) {
digitalWrite(led, HIGH);
}
// else turn off LED
else {
digitalWrite(led, LOW);
}
}
当你已经输入了草图,你就可以编译和运行它了。
编译和上传
写好草图后,使用 IDE 左上角的 Compile 按钮测试编译。修复消息窗口中出现的任何编译错误。典型的错误包括变量或方法的拼写错误或大小写改变(编译器区分大小写)。
修复任何编译错误后,单击上传按钮。IDE 编译草图,并将编译后的草图上传到 Arduino 板上。您可以通过消息窗口上方右下角的进度条来跟踪进度。当编译好的草图上传后,进度条会消失。
测试项目
上传完成后,你会在 Arduino 上看到什么?如果你做对了每一件事,答案是什么都没有。它只是用一个黑暗的 LED 回望着你——几乎是嘲弄地。现在,按下按钮。LED 是否点亮?如果是这样,那么恭喜你:你是一名 Arduino 程序员!
如果指示灯不亮,按住按钮一两秒钟。如果这不起作用,请检查您的所有连接,以确保您插入了试验板上的正确走线,并且您的 LED 正确就位,长边连接到电阻器,电阻器连接到引脚 13。
另一方面,如果 LED 灯一直亮着,尝试将按钮重新调整 90 度。您可能将按钮设置在了错误的方向。
尝试这个项目几次,直到兴奋过去。如果你是 Arduino 的老手,那可能是一段很短的时间。如果这一切对你来说都是新的,那就按下那个按钮,享受建造第一个传感器节点的荣耀吧!
What About Other Microcontrollers?
是的,除了 Arduino,还有其他微控制器可供选择。事实上,有些在 Arduino 之前就存在了。如果你有使用这些设备的经验,特别是如果你已经拥有一些这样的主板和它们的附件,你应该考虑使用它们,因为它们提供了许多与 Arduino 相同的好处。
一些更受欢迎的微控制器替代品包括。我提供了一个链接,可以获得关于每一个的更多信息。
- Esquillo:这是一个相对较新的 IOT 平台,具有基于 web 的板载开发环境,用于在 Squirrel 中进行开发,具有交互式调试器、云支持等等。它还支持一些 Arduino 盾牌。(见
http://esquilo.io/
)。) - mbed:这是一个新的 IOT 平台解决方案(目前处于测试阶段),使用 ARM 处理器。(见
http://mbed.com/en/
)。) - Photon(以前的 Spark):这是一个 IOT 开发平台,支持 WiFi,甚至还有一个板载 web IDE。哦,它是 Arduino 兼容的。(见
http://particle.io
)。) - Propeller:这是一个功能强大的处理器,有多种附件可供选择。许多较老的项目使用这种处理器,它是用类似 C 的编程语言编程的(见
http://parallax.com/catalog/microcontrollers/propeller
)。) - Teensy:这是一个小型的微控制器,用一个特殊的基于 USB 的加载程序编程。由于它使用与 Arduino 相同的处理器系列,因此可以使用 Arduino IDE 进行编程(参见
http://pjrc.com/teensy/
)。)
你可以在 Sparkfun ( http://sparkfun.com
)和 Adafruit ( http://adafruit.com
)等受欢迎的在线电子商店找到许多这样的东西。
现在你已经看到了一些 Arduino 板,让我们来讨论一些常见和流行的 Arduino 硬件附件。
附加 Arduino 硬件
回想一下,Arduino 通过安装在 Arduino 接头上的子板(称为屏蔽板)支持附加硬件。有许多这样的屏蔽,从简单的原型屏蔽到复杂的电机控制器。在本节中,我将从以太网屏蔽开始,讨论一些您可能在 IOT 解决方案中使用的屏蔽。还有更多可用的 Arduino 屏蔽,但我将讨论集中在这些方面,以突出我在 IOT 解决方案中最常用的屏蔽。
Arduino 以太网盾
Arduino Ethernet shield 使您的 Arduino 能够通过以太网连接连接到网络,并最终连接到互联网。Arduino Ethernet shield 由 Arduino.cc 制造,与大多数 Arduino 板兼容,包括大型 Mega。
该板还配备了一个 MicroSD 读卡器,使其成为需要在本地存储或读取存储数据的项目的绝佳选择。板上有一个重置按钮,与 Arduino 上的重置按钮相同。图 2-17 显示了 Arduino 以太网屏蔽。
该板使用内置的以太网库与网络资源进行交互。有一些可用的示例草图,你可以用来学习如何使用盾牌以及优秀的文档( http://arduino.cc/en/Reference/Ethernet
)。
Arduino 以太网屏蔽是复制最多的屏蔽之一。我发现许多第三方防护罩的价格很低。事实证明,有些不是 100%兼容,有些没有配备 MicroSD 读卡器。有趣的是,该板有一个变体,允许您使用以太网供电(POE),允许您使用以太网电缆和交换机或路由上的特殊电源为 Arduino 供电。
如果您需要让您的 Arduino 解决方案具备网络感知能力,并且可以使用以太网连接,Arduino 以太网屏蔽是一个绝佳的选择。如果想省点钱,可以选择其中一个第三方版本;在你购买它之前,确保它是 100%兼容的。
A Warning About Ethernet Shield Variants
你可能认为所有的以太网屏蔽都是平等的,就像台式电脑中的网卡一样工作。那就是,任何一个都行;把它扔进去就走。但事实远非如此。Arduino 兼容的以太网屏蔽不仅仅是因为它可以与您的 Arduino 兼容;它还必须使用内置的以太网库。
例如,有许多 Arduino 以太网屏蔽,甚至一些以太网模块(如分线板)使用不同的芯片组,如 CC3000 或其他几种芯片组中的任何一种。其中许多与以太网库不兼容。你能辨别的方法是盾牌是自带的还是需要你下载一个库才能使用。
对于单个项目来说,这可能不是什么大事,但对于 IOT 开发商来说,至少还有另外两个问题。首先,如果您的解决方案中有许多节点,您可能需要为使用的每种类型的以太网屏蔽写一个不同的草图。第二,如果你计划使用 Arduino 与 MySQL 服务器对话,你必须有一个使用以太网库的屏蔽。这是因为设计用来与 MySQL 对话的特殊库(称为 MySQL 连接器/Arduino)是为以太网库编写的。使用不支持以太网的不同库。客户端类可能使其与连接器不兼容。您将在第 6 章的中了解更多关于连接器的信息。
Arduino WiFi 盾牌 101
Arduino WiFi shield 101 是 Arduino.cc 的最新产品,用于通过 WiFi 信号将 Arduino 连接到互联网。有更老的 WiFi 屏蔽可用,你将在下面的章节中看到其中的一些。这种盾的有趣和新颖之处在于它具有板载加密认证,使用支持 WEP 和 WPA2 安全企业协议的更安全的认证,使其更容易在无线网络上使用。由于这些特点,它是为 IOT 解决方案营销的。然而,与旧的 Arduino WiFi shield 不同,它没有配备 MicroSD 读卡器。图 2-18 显示了 Arduino WiFi shield 101。
图 2-18。
Arduino WiFi shield 101
有一个缺点,这取决于你将如何使用盾牌。像一些 Arduino Ethernet shield 克隆一样(参见“关于 Ethernet shield 变体的警告”侧栏),它不使用以太网库。您必须下载一个新的库来使用它( http://arduino.cc/en/Reference/WiFi101
)。如果您只有几个节点,这可能不是问题,但是如果您想要将 shield 与现有草图或为以太网库编写的草图一起使用,您可能需要进行一些修改以使其工作。
幸运的是,新的库有许多例子可以用来写你的草图。我还没有在我的项目中使用 shield,但是初步的实验表明新的库类似于以太网库,因此代替 Arduino 以太网 shield 应该不难使用。
Arduino WiFi 盾
Arduino WiFi shield 是最新的 101 shield 的旧版本。它只支持简单的身份验证(没有加密功能),但配有一个 MicroSD 读卡器。我最喜欢 shield 的一点是,它与以太网库 100%兼容,这使得 Arduino 以太网和 WiFi shields 可以轻松地在草图中使用相同的核心代码。启动代码略有不同,但是对以太网库及其类的所有调用保持不变。图 2-19 显示了 Arduino 以太网屏蔽。
图 2-19。
Arduino
星火娱乐无线屏蔽:ESP8266
Sparkfun WiFi 盾 ESP8266 是来自 Sparkfun ( http://sparkfun.com/products/13287
)的一块有趣的板子。它具有 ESP8266 芯片上 WiFi 系统(SoC)处理器,具有分裂的个性。回想一下前面关于 Arduino 板的部分,ESP8266 WiFi SoC 是一个可编程模块,但通过将该芯片放置在 Arduino shield 布局上,它允许您使用 Arduino 板的 AT 命令集将 shield 用作简单的 WiFi 连接。图 2-20 展示了 Sparkfun WiFi 盾 ESP8266。
图 2-20。
Sparkfun WiFi shield, ESP8266
虽然您可以将这个盾牌用作 Arduino 的 WiFi 网关,但它的编程方式不同。它有自己的库,您必须下载并使用,而不是使用以太网库。这个库( https://github.com/sparkfun/SparkFun_ESP8266_AT_Arduino_Library
)允许你使用方法访问 ESP8266 的 AT 命令集来连接网络。幸运的是,这些方法类似于以太网库,但是不兼容。因此,您可能需要重写现有草图的网络部分来使用盾牌。
ESP8266 WiFi SoC 被编程为与 Arduino 一起作为 WiFi 屏蔽使用。然而,它可以被重新编程。注意电路板顶部的 ESP8266 连接。您可以使用这些对 ESP8266 进行编程。你只需要在板上焊接一个引脚接头,并通过 FTDI 电缆连接。这允许您通过修改 ESP8266 芯片以添加额外的命令或功能来试验它,使这个屏蔽成为 Arduino 和 ESP8266 分线板之间的中间地带。
要了解更多关于这种特殊板的信息,请参见 https://learn.sparkfun.com/tutorials/esp8266-wifi-shield-hookup-guide
。
Adafruit WiFi 盾
Adafruit WiFi shield 是我发现的为数不多的 Arduino 以太网克隆板之一,是一个很好的替代品。Adafruit WiFi shield 使用 CC3000 芯片组,需要新的库。幸运的是,Adafruit 有一个使用该库的优秀教程( https://learn.adafruit.com/adafruit-shield-compatibility/cc3000-wifi-shield
)。
shield 还有一个 MicroSD 读卡器,对我来说是一个很好的选择,因为我的许多 Arduino 节点都使用 SD 卡来存储日志数据和作为数据库存储的备份。图 2-21 为 Adafruit WiFi 盾。
图 2-21。
Arduino
不幸的是,这个屏蔽与以太网库不兼容,这意味着要重写现有草图的网络部分。这使得我在开发 IOT 节点时不太感兴趣,因为我喜欢在开发草图时使用以太网连接,以消除较慢的 WiFi 连接固有的延迟。
Sparkfun 密码盾
这个盾是个有趣的盾。这是我发现的第一款包含高级加密功能的产品,例如用于保持准确时间的实时时钟(RTC)模块、用于 RSA 加密/解密的可信平台模块(TPM)、用于存储少量加密数据(如服务器的用户 id 和密码)的 AES-128 加密 EEPROM、对 SHA-256 和 HMAC-256 的支持,以及执行椭圆曲线数字签名算法(ECDSA)的 ATECC108。哇哦!那是很多很酷的东西。图 2-22 显示了 Sparkfun 密码盾。
图 2-22。
Sparkfun CryptoShield for Arduino
你可以在发送数据前用这个盾加密数据,在收到数据后再解密。这听起来可能有点过了,但是请考虑一下您的解决方案中的节点必须通过无线或不安全的网络连接发送数据的情况。在这种情况下,添加硬件级加密意味着即使网络不安全,您也可以保护您的数据。
Note
Sparkfun 还为 BeagleBone Black 制作了这种板的版本。
我已经非常成功地使用了这个盾来保护 Arduino 节点之间的数据安全。我计划在我的 IOT 解决方案中使用这个保护罩来帮助他们免受监控或盗窃。
Sparkfun MicroSD 盾
我列举的最后一个 Arduino 盾牌是 Sparkfun MicroSD 盾牌。它只是一个带有 MicroSD 读卡器的屏蔽。这种屏蔽还有其他版本,但我喜欢 Sparkfun 版本,因为它还带有原型制作区,可以在屏蔽上构建自己的电路,并为您的解决方案提供一个方便的平台和一个 MicroSD 读卡器。图 2-23 显示了 Sparkfun MicroSD 盾。
图 2-23。
Arduino microSD shield from Sparkfun
XBee 模块
我将讨论的下一个硬件选项不是专门的 Arduino 屏蔽,甚至不是专门用于 Arduino 的。正如您将看到的,XBee 是一个用于低成本、低功耗(如参考资料中所示)通信的通用模块。
XBee 是一个独立的模块,使用射频(RF)在 XBee 模块之间交换数据。XBee 模块在 2.4GHz 或远程 900MHz 上传输,并有自己的网络协议。
XBee 模块本身很小,大约只有一个大邮票的大小,因此很容易集成到传感器节点等小型项目中。这些模块也是低功耗的,并且可以使用特殊的睡眠模式来进一步降低功耗。
虽然 XBee 不是一个微控制器,但它的处理能力有限,可以用来控制模块。其中一个功能,睡眠模式,可以帮助延长电池供电(或太阳能供电)传感器节点的电池寿命。您还可以指示 XBee 模块监控其数据引脚,并将读取的数据传输到另一个 XBee 模块。啊哈!因此,您可以使用 XBee 模块将传感器节点链接到数据聚合器节点。
虽然 XBee 可以用来读取传感器数据,但其有限的处理能力可能意味着它并不适合所有的传感器节点。例如,需要算法来解释或推断有意义的数据的传感器可能不适合单独使用 XBee。您可能需要使用微控制器或计算机来执行额外的计算。
Tip
我在我的书《用 Arduino 和 Raspberry Pi 开始传感器网络》(Apress,2013)中对 XBee 模块进行了更完整的解释。如果你想知道更多关于 XBee 硬件和规格的信息,请看那本书的第二章。
有几个 XBee 模块可用。有普通型号和 Pro 型号,功率更大,功能更强。还有各种各样的天线选项,从板载芯片天线到有线鞭状天线,再到远程天线连接。图 2-24 显示了我经常使用的几个 XBee 模块。
图 2-24。
XBee modules and various host boards
请注意,每个 XBee 模块(总共五个)都安装在不同的小板上。这些是可以用来编程和运行 XBee 模块的主机类型的示例。中间是 Sparkfun ( https://www.sparkfun.com/products/12847
)的 XBee 盾,可以让你直接把 XBee 连接到你的 Arduino 上。其余的板是你可以用来编程 XBee 的。从左上角开始,您可以看到以下板:
- Adafruit XBee 适配器套件:提供 FTDI 接口对 XBee 进行编程(
www.adafruit.com/products/126
)。 - Sparkfun XBee Explorer USB 加密狗:允许您将 XBee 直接插入 USB 端口(
https://www.sparkfun.com/products/11697
)。 - Sparkfun XBee Explorer Regulated:提供一个电源调节分线板(XBee 仅在 3.3V 而非 5V 下运行),使该板可以与其他分立元件一起使用,如传感器(
https://www.sparkfun.com/products/11373
)。 - Sparkfun XBee Explorer USB:允许您使用 USB 电缆与 USB 电缆。它还具有 XBee 的分线引脚,使该板可以与传感器(
https://www.sparkfun.com/products/11812
)等其他分立元件配合使用。
你可以在大多数在线电子商店,如 Sparkfun 和 Adafruit,找到 XBee 收音机出售。除了我的传感器网络书,Adafruit ( https://learn.adafruit.com/xbee-radios
)和 Sparkfun ( https://learn.sparkfun.com/tutorials/xbee-shield-hookup-guide
)都有关于使用 XBee 的优秀教程。
现在,您已经了解了流行的 Arduino 微控制器、其开发环境和额外的硬件(屏蔽),现在让我们了解更多关于低功耗(也称为低成本)计算平台的信息。
低功耗计算平台
低功率计算平台,有时被称为低成本计算机板或迷你计算机,由廉价组件构建而成,旨在运行低资源密集型操作系统。大多数主板都具备低成本计算机的所有正常功能,包括视频、USB 和网络功能。然而,并不是所有的主板都具备这些特性。
它们有时被称为低功耗的原因不是因为它们的 CPU 或内存容量较小;相反,这是因为它们的电源要求,通常在 5V 和 24V 之间。由于它们不需要大规模的类似 PC 的电源,这些板可以用于需要具有真实操作系统的计算机的能力但没有空间容纳全尺寸计算机、不能投入计算机成本或必须在较低电压下运行的项目。
Tip
由于含糊不清,似乎缺乏一个标准的术语,当在这一类别中讨论这些主板时,我将把它们称为低成本计算主板或简称为主板。
有许多种类的低成本计算板。一些支持典型计算机的全部功能(并且可以作为一个相当不错的笔记本电脑替代品),而另一些只具备作为嵌入式计算机的基本功能。例如,一些主板允许您连接网络电缆、键盘、鼠标和显示器,用作普通的笔记本电脑或台式机,而其他主板只有网络和 USB 接口,需要您远程访问它们。
这些主板最强大的一个方面是,由于它们运行 Linux 操作系统的变体,许多可以用 C、C++、Perl、Python 和类似的编程语言进行编程。这使得您可以使用在任何桌面上都可以找到的工具来开发您的软件,并将其部署在小型嵌入式计算设备上的解决方案中。不仅如此,考虑到所使用的处理器速度更快,有些甚至具有多重处理能力,你的软件将比在微控制器上运行得更快。多酷啊。
我有几块这样的板 8 ,并且已经以各种方式使用过。我发现我所使用的主板最有趣的地方是有些支持 Arduino 屏蔽(类似于 Arduino Yún),允许您安装和访问 Arduino 屏蔽以及直接在主板上运行的连接电路。我称这些板为 Arduino 混合板。我将剩余的主板归入计算机主板类别,因为它们基本上都是全功能计算机。在接下来的部分中,我将讨论每个类别的几个例子。
Arduino 混合动力车
Arduino 混合板是一种包含 Arduino 接头的微控制器或低成本计算平台,可用作传感器或 IOT 网络中的网关,您可以远程登录到该板并访问 Arduino 屏蔽,就像该板是 Arduino 一样。这些板可以有更多的用途,但它们在这个角色上表现出色。您可以在网络上设置该板,使您能够远程访问(通过另一台计算机或终端)计算机端,同时连接并使用 Arduino shields 的资源。
一些 Arduino 混合板提供板载 Arduino 兼容处理器,以便您可以使用 Arduino 草图与电脑上的程序进行交互。这些板有点难以使用,因为它们通常不支持所有的 Arduino 屏蔽,但当使用 Python 等语言编程时,它们可能非常强大。
Note
一些电路板,如 Raspberry Pi,可以通过特殊的附加组件进行扩展(如 Raspberry Pi AlaMode9),提供与 Arduino hybrids 类似的功能。
我展示了两个 Arduino 混合板:流行的 pcDuino3B 和 Intel Galileo。
多氯联苯
pcDuino3B 是我用过的功能更强大的主板之一。它实际上是一台功能齐全的小型台式计算机。事实上,我已经将我的 pcDuino3B 作为笔记本电脑的替代品,只需插入鼠标、键盘和显示器。你不仅可以通过 WiFi 连接到互联网,而且主板运行的是一个更老的专门版本的 Ubuntu 12.04,它提供了一个功能齐全的桌面和许多与你在笔记本电脑或台式机上使用的相同的应用。除了桌子上有一块裸板,处理器的速度让体验更像笔记本电脑。
该主板拥有强大的 A20 处理器(比其他一些主板快得多),1Gb 内存,以及 HDMI 接口,通过板载视频处理器支持惊人的 1080p 分辨率。它还具有 WiFi、以太网、音频、USB、MicroSD 驱动器,甚至还有 SATA 驱动器控制器,允许添加主轴或固态硬盘进行存储。事实上,该板的功能列表令人印象深刻。
根据给定的类别,该板与流行的 Arduino 生态系统(如 Arduino shields)兼容。它还有自己的 I/O 引脚接口,包括 14 个通用 I/O 引脚(简称 GPIO)、2 个 PWM、6 个 ADC 以及 UART、SPI 和 I2C 引脚各 1 个。图 2-25 显示了最新的 pcDuino3B 板卡。
图 2-25。
pcDuino3B Note
pcDuino3B 仅支持 Arduino Uno R3 3.3v 屏蔽。
我经常使用 pcDuino3B 作为巡回 Arduino 实验室。鉴于其强大的计算功能,操作系统是从板载内存存储运行的,我可以从桌面运行 Arduino IDE,这使得我可以轻松地与 Arduino 屏蔽和硬件进行交互,而不必携带单独的计算机、电缆、Arduino 等。最好的是,它可以通过 USB 供电。
我还将 pcDuino3B 用作数据库服务器(见第 5 章)和网络服务器。由于它运行 Ubuntu,这个小主板几乎没有什么不能做的。也许唯一的缺点是它的价格是其他主板的两倍左右(但远不及英特尔主板)。因此,如果您必须在此板和更便宜的板之间做出选择,可能会归结为您是否需要 pcDuino3B 的强大功能,而不是更低的成本(和更少的功能)。
欲了解更多信息和 pcDuino3B 的完整规格,请参见 http://linksprite.com/wiki/index.php5?title=PcDuino3B
。
英特尔伽利略第二代
英特尔 Galileo Gen 2 基于英特尔 Quark SoC X1000 应用处理器,这是一款 32 位 CPU,基于封装为 SoC 的久负盛名的英特尔奔腾 CPU。它还具有 Arduino 接头,用于 Arduino Uno R3 屏蔽(3.3V 和一些 5V 屏蔽)。
也许它最有趣的特点是,由于 CPU 是英特尔芯片,主板可以运行几个操作系统(但不是同时),如新的 Windows 10 IOT 核心 10 和大多数 Linux 变种。它配有 Yocto Linux ( http://yoctoproject.org/
),可从板载内存启动,但可以轻松升级。
Note
Yocto Linux 目前不支持像 pcDuino 上的 Ubuntu 那样广泛的软件工具。然而,越来越多的包被添加到 Yocto,所以如果你在 Yocto 上找不到你要找的包,它可能很快就会被添加。
该板具有许多功能,如 USB、以太网、RTC、MicroSD(用于运行操作系统,但与 pcDuino3B 不同的是,它具有有限的板载可启动操作系统)、8MB 闪存和 mini-PCI Express 插槽,这与任何其他板不同(但尚未成为主流)。图 2-26 显示了英特尔 Galileo Gen 2 主板。
图 2-26。
Intel Galileo Gen 2
该板需要外部电源,因此不能通过 USB 供电,但支持以太网供电。虽然它有许多有趣的功能,但它是市场上相对较新的产品,似乎不像其他一些主板那样受欢迎。也就是说,有几个 IOT 扩展或实验套件可用,如 SeeedStudio ( http://seeedstudio.com/depot/Grove-starter-kit-plus-Intel-IoT-Edition-for-Intel-Galileo-Gen-2-and-Edison-p-1978.html
)的套件。
鉴于操作系统不如完整的 Linux 实现强大,您很可能想要创建一个引导映像并从 SD 驱动器运行操作系统的新版本。您可以在英特尔的 IOT 网站( https://software.intel.com/en-us/programming-blank-sd-card-with-yocto-linux-image-linux
)上找到这方面的完整文档。
迄今为止,我一直将我的英特尔 Galileo Gen 2 作为一些基于 Arduino shield 的电路的网关。这是因为主板允许我对它进行编程,就像我使用英特尔的特殊版本 Arduino IDE(http://intel.com/support/galileo/sb/CS-035101.htm
)对普通 Arduino 进行编程一样。此外,当我需要更多计算能力或希望从远程计算机(我可以远程登录的计算机)轻松访问 Arduino 硬件时,我使用 Galileo 代替 Arduino。
有关英特尔 Galileo Gen 2 的更多信息,请参见 https://software.intel.com/en-us/iot/hardware/galileo
。
计算机主板
第二类低成本计算板旨在成为嵌入式计算系统,不包括 Arduino 硬件兼容性(板上无屏蔽接头或 Arduino 兼容微控制器)。然而,我在这一类别中使用的所有电路板都支持各种硬件引脚,您可以使用这些引脚来连接传感器和其他组件和电路。因此,它们仍然是良好的 IOT 发展平台。他们不是 Arduino 混血儿。
这并不意味着它们的功能不比 Arduino 混合板差(pcDuino3B 可能是个例外);相反,它们通常比 Arduino 混合板更强大、更通用。凭借他们使用电脑时的感觉,你可能会对他们的能力感到惊讶。
这些主板的物理尺寸是另一个需要适应的特征。虽然大多数非常小,但它们的尺寸要求使用 PCB 的两面来安装元件。因此,大多数电路板在顶部和底部都有连接器和元件。这没什么大不了的,但是如果你打算将这些板安装在机壳中,可能需要一些仔细的安排,或者如果你裸着使用它们,可能需要一些小心的处理(只是裸板 12 )。幸运的是,你可以找到大多数这些电路板的定制 Shell,包括几个来自 http://thingiverse.com
的 3D 打印 Shell。
但是它们不仅仅是电脑。大多数都提供 GPIO 引脚,用于连接传感器、LCD、电路等。在这方面,它们类似于 Arduino,可以在许多相同的情况下使用。使它们不同的是计算机方面提供的更大的处理能力和连接性。也就是说,您可以使用 Raspberry Pi 代替 Arduino,并获得远程访问该节点并与之交互的能力,这在 Arduino 上是很难做到的。
此类主板通常是具有专用扩展硬件支持、更强大的操作系统支持(pcDuino 除外)和内置网络功能的计算机。这一类别中最受欢迎的板是 Raspberry Pi,这将在本书的后面部分重点介绍。然而,正如您将看到的,还有其他同样强大的替代方案。让我们从树莓酱的绝佳替代品——猎兔犬黑开始。
比格犬骨黑
BeagleBone Black 是一款小型主板,专为开发者和业余爱好者设计,使用基于 Linux 的体验来试验嵌入式解决方案中的硬件。事实上,BeagleBone Black 的设计可以在短短十秒内启动其 Linux 操作系统。越来越多的支持者每天都在增加知识库和论坛。或许 BeagleBone Black 最棒的一点是位于 http://beagleboard.org/getting-started
的启动指南。它旨在让你在短短五分钟内使用你的新“骨骼”开始运行。因此,对于熟悉 Linux 并希望快速入门的人来说,这种板很有吸引力。图 2-27 所示为黑色的猎兔犬骨。
图 2-27。
BeagleBone Black
该板也是一台功能强大的低成本计算机,配有 A8 ARM 处理器、512MB RAM、4Gb 闪存、USB 主机和客户端(用于电源和终端访问)、带 HDMI 输出的图形芯片和以太网。还有一个持续运行的电源连接器。
比格犬黑色的足迹是相当独特的。它可以放在一个更大的金属罐里,就像一些薄荷糖的包装一样。你需要用一对锡剪来切断 USB、电源和以太网的通路,但它会合适的。换句话说,它比大多数主板小一点。
它还有两排 46 针 GPIO 接头,用于连接传感器、LCD 面板等硬件。事实上,您可以像在 Arduino 或 Raspberry Pi 上一样使用这些头。您还可以连接称为 capes 的子板,以增加功能。Sparkfun 等供应商提供了几种披风,它们提供了以下披风:
- 4.3 英寸液晶面板:
http://sparkfun.com/products/12085
- 7 寸液晶面板:
http://sparkfun.com/products/12086
- 原型电路协议:
http://sparkfun.com/products/12774
- 用于硬件加密的 crypto cape:
http://sparkfun.com/products/12773
我发现 BeagleBone Black 是一款功能强大的主板,几乎可以在任何需要更强大的处理器或需要进行超出基于微控制器的解决方案能力的额外处理的地方使用。我在一些硬件实验中使用了 BeagleBone Black,发现它是更受欢迎的 Raspberry Pi 的可行替代品。然而,在某些方面,Linux 的感觉和 BeagleBone Black 的适应性更吸引我,但这是个人的选择。也就是说,我的树莓板比骨头还多。
您可以在 http://elinux.org/Beagleboard:BeagleBoneBlack
了解有关 BeagleBone Black 硬件的更多信息,包括兼容的硬件附件、创建可启动的 Linux 映像等。
树莓 Pi 2 型号 B
树莓 Pi 2 Model B 是树莓 Pi 的最新迭代。它拥有原始 Raspberry Pi 的所有功能,但拥有更快的处理器和更多 USB 端口。Raspberry Pi 是一个受开发者欢迎的板,主要是因为它的低成本和易用性。鉴于 Raspberry Pi 的流行,我将在第 6 章中更详细地介绍它,包括如何开始使用它的简短教程。因此,我将在这里简要地介绍一下重点,并在第六章中对使用该板进行更详细的讨论。
Raspberry Pi 2B 硬件包括 900MHz A7 ARM CPU、1GB RAM、带 HDMI 输出的视频图形、4 个 USB 端口(旧款主板上只有 2 个)、以太网、摄像头接口(CSI)、显示器接口(DSI)、MicroSD 卡和 40 个 GPIO 引脚。图 2-28 显示了树莓派 2B 板。
图 2-28。
Raspberry Pi Model 2B
相机界面真的很有意思。您可以购买类似 Adafruit ( http://adafruit.com/categories/177
)的摄像头模块,并将其连接到板上,用作远程视频监控组件。我广泛使用了这一功能,将我的几块 Raspberry Pi 板变成了 3D 打印中心,我可以通过网络发送打印任务,远程打印和检查打印进度。使这成为可能的软件叫做 OctoPrint ( http://octoprint.org/
),我在我的书《3D 打印机的维护和故障排除》(Apress,2014)中详细介绍了它。详见 http://apress.com/9781430268093?gtmf=s
。
LCD 界面也很有趣,因为现在有一个 7 英寸的 LCD 触摸板连接到 DSI 端口( http://element14.com/community/docs/DOC-78156/l/raspberry-pi-7-touchscreen-display
)。我还没有得到其中的一个(它们供应短缺),但我有一些非常好的想法,一个壁挂式控制台,用于监控我的 IOT 解决方案。我还看到了许多有趣的 Raspberry Pi 平板电脑,它们使用了新的 LCD 触摸板。你可以在 http://thingiverse.com/thing:1082431
了解一个很有前途的例子(Adafruit 做的,所以我期待它很优秀)。 13
除此之外,Raspberry Pi 一直是我满足各种需求的首选,从更强大的传感器节点到数据聚合节点,再到托管数据库和 web 服务器。社区中也有很多关于如何在项目中使用 Raspberry Pi 的例子。有关树莓派的更多信息,请参见第 6 章。
树莓派 B
Raspberry Pi B 模型是前面讨论的 Pi 2B 的旧版本,具有较少的功能。我把它包括在这个列表中,因为这种板是丰富的,有时可以找到与较新的树莓 Pi 板相比的折扣。即便如此,它也有 512MB 的内存、两个 USB 端口和一个以太网端口。另外,像箱子这样的配件也很丰富,而且比新款便宜。
我发现只有少数情况下,我需要更强大的 Pi 2B。因此,如果您能找到一些旧的主板,您可以节省一些钱(也就是说,如果您不需要额外的 USB 端口或 P2i 2B 的其他功能)。图 2-29 显示了早期版本的 Raspberry Pi B 的示例。
图 2-29。
Raspberry Pi Model B
每当我需要 Raspberry Pi 作为嵌入式计算节点的能力,但不需要额外的 USB 设备的额外功能时,我经常使用我的旧 Raspberry Pi B 板(我似乎有太多的板),特别是在我可以使用以太网而不是 WiFi 的情况下。
我也用这种旧主板来做项目原型,因为损坏旧主板的风险(成本)没有新主板大。如果我炸了旧的板,我只是拉另一个出来或订购另一对夫妇使用的。如果我损坏了我最新的 2B 树莓酱,我会损失更多的钱,并且可能不得不等待一个新的(即使在今天,它们有时也很难找到)。
关于树莓派 B 的更多信息,请参见 https://www.raspberrypi.org/products/model-b/
。
英特尔爱迪生(带火花块)
英特尔 Edison 是另一种低成本计算板,但它不是一台微型计算机,而是一种比其他板更嵌入式的解决方案。我把它放在这里,是为了那些需要在尽可能小和多功能的封装中获得低成本计算机的强大功能的人。这块板子只有 35×25×4 毫米大小。Edison 拥有一个英特尔凌动 500MHz 双核双线程 CPU 和一个英特尔 Quark 100MHz 微控制器。一个大的 RFID 屏蔽隐藏了它的所有组件。Edison 还运行一个名为 Yocto 的 Linux 操作系统版本,该版本存储在固件中,启动速度非常快。
与类似的主板英特尔 Galileo 不同,英特尔 Edison 使用一个带有微型板对板连接器的模块,旨在允许您在 Edison 下方堆叠额外的主板,类似于 TinyDuino。与 Galileo 不同,您可以使用最新版本的 Arduino IDE 直接对 Edison 进行编程。您也可以用 C、C++或 Python 编写程序,在本地运行并访问硬件 GPIO 引脚。
由于英特尔 Edison 是一个嵌入式平台,它没有 USB、视频和网络连接,但它有 WiFi (802.11a/b/g/n)和蓝牙(4.0 和 2.1 EDR)。您可以通过使用附加板获得额外的端口。毕竟,它是一个嵌入式 IOT 解决方案,而不是一个计算平台。它也小得多,因此更容易装入远程节点或更小的设备中。
图 2-30 显示了英特尔 Edison 及其下方堆叠的许多附加板。如你所见,这是一个整洁的包裹。请注意带有英特尔爱迪生品牌的凸起主板。那是爱迪生!照片中的其他东西都是附加组件。
图 2-30。
Intel Edison (courtesy of http://sparkfun.com)
由于该板是作为 SoC 模块提供的,您需要购买一个主板来使用它,或者将其连接到您的计算机上进行编程或控制台访问。英特尔出售一种这样的主板,但 Sparkfun 还有其他几种选择,如下所述:
- 英特尔 Edison Mini Breakout:比 Edison 略大,迷你 Breakout 提供 USB 端口,用于通过 UART 控制台(想想终端)和电源进行通信。英特尔通常出售这种带有爱迪生模块的迷你分线板。
http://sparkfun.com/products/13025
见。 - 英特尔 Arduino 扩展板:这是一个更大的主板,带有 Arduino 接头,用于安装 Arduino 屏蔽。它提供了与以前的主板相同的 USB 端口,并且像以前的主板一样,作为套件提供。如果你想用 Arduino IDE 给 Edison 编程,这个主板是个不错的选择。
http://sparkfun.com/products/13097
见。 - Sparkfun Base Block:这是一个较小的主板,具有相同的 USB 端口,但也带有一个直通微型板对板连接器,以便您可以使用额外的板。您也可以使用此板像 Arduino 一样对 Edison 进行编程。该板没有 Sparkfun 的爱迪生。
http://sparkfun.com/products/13045
见。 - Sparkfun 控制台模块:这类似于基础模块,但没有电源端口,因此只提供控制台访问。
http://sparkfun.com/products/13039
见。
Edison 的模块化特性使您可以基于强大的主内核,仅使用所需的硬件来构建您的解决方案。Sparkfun 的爱迪生积木的加入更是如此。Sparkfun 已经创建了可堆叠模块(称为块),您可以使用它们来构建硬件堆栈,以满足您的嵌入式计算需求。有相当多的块可用于你想做的任何事情。
事实上,在 Raspberry Pi 或试验板布局中,有一些模块可以断开 GPIO 引脚,提供电池电源,并提供一个基于有机发光二极管的微型显示器;甚至还有一个 Arduino 标题块。使用积木真正酷的一面是它们的堆叠方式,这不仅可以让你根据需要定制硬件,还可以让硬件尽可能小,以匹配爱迪生的小尺寸。Sparkfun 的爱迪生积木样本列表如下:
- 英特尔爱迪生模块 ADC:
http://sparkfun.com/products/13046
- 英特尔爱迪生积木底座:
http://sparkfun.com/products/13045
- 英特尔 Edison Block 双 H 桥:
http://sparkfun.com/products/13043
- 英特尔爱迪生块 PWM:
http://sparkfun.com/products/13042
- 英特尔爱迪生块控制台基本:
http://sparkfun.com/products/13040
- 英特尔爱迪生积木控制台:
http://sparkfun.com/products/13039
- 英特尔爱迪生块 GPIO:
http://sparkfun.com/products/13038
- 英特尔爱迪生块电池:
http://sparkfun.com/products/13037
- 英特尔爱迪生 Block MicroSD:
http://sparkfun.com/products/13041
- 英特尔爱迪生区块 Arduino:
http://sparkfun.com/products/13036
- 英特尔爱迪生区块有机发光二极管:
http://sparkfun.com/products/13035
- 英特尔爱迪生区块 I2C:
http://sparkfun.com/products/13034
- 英特尔爱迪生块 9 自由度:
http://sparkfun.com/products/13033
有关英特尔 Edison 和 Sparkfun 的 Edison 模块的更多信息,请参见 Sparkfun 在 https://learn.sparkfun.com/tutorials/edison-getting-started-guide
的优秀指南。
Just How Low-Cost Are These Boards?
你可能想知道这些板的价格。以下是每种主板的平均价格,按提及的顺序排列。我不包括 Sparkfun Edison 积木,因为正如你将看到的,价格取决于你购买的积木,但一般来说,积木的价格在 15 美元到 35 美元之间,有些套件有折扣。我也省略了旧的树莓 Pi 模型 B,但使用的价格略低于这些板的 30 美元。
- pcDuino3B : $60.00
- 英特尔伽利略第二代:75.00 美元
- 2B 覆盆子酱:42.00 美元
- 英特尔爱迪生迷你突破:75.00 美元
- 英特尔 Edison 和 Arduino 主机:100.00 美元
请注意,更贵的主板是英特尔选项。鉴于它主要是专有硬件,这并不令人惊讶。真正的便宜货是树莓派,这也是它受欢迎的部分原因。然而,就价格和功能而言,pcDuino3B 是我最喜欢的另一款主板。
现在,您已经了解了可以用来安装传感器的各种电路板,包括微控制器和低成本计算机电路板,接下来让我们看看另一个关键的硬件组件——传感器。
传感器
谈到传感器、什么是传感器网络以及它们如何传递数据,您可能想知道传感器到底是什么,它们有什么意义。本节及其小节回答了这些问题以及更多问题。让我们从传感器的定义开始。
传感器是一种测量物理世界现象的装置。这些现象可以是你看到的东西,比如光、烟、水蒸气等等。它们也可以是你感觉到的东西,像温度、电、水、风等等。人类的感觉就像传感器一样,让我们能够体验周围的世界。然而,有些东西你的传感器看不到或感觉不到,比如辐射、无线电波、电压和安培数。在测量这些现象时,传感器的工作是以电压表示或数字的形式传递测量结果。
传感器有多种形式。它们通常是为单一用途设计的低成本设备,处理能力有限。大多数简单的传感器都是分立元件;甚至那些具有更复杂部件的设备也可以被视为单独的组件。传感器可以是模拟的,也可以是数字的,通常只用于测量一种东西。但是越来越多的传感器模块被设计来测量一组相关的现象。
模拟传感器
模拟传感器是产生电压范围的装置,通常在 0V 和 5V 之间。需要一个模数转换电路将电压转换成数字。大多数微控制器都内置了这一功能,Arduino 就是一个很好的例子。Arduino 有一组有限的引脚,用于处理模拟数据,并集成了模数(A/D)转换电路。
但事情并没有那么简单(是吗?).模拟传感器的工作原理类似于电阻,当连接到微控制器时,通常需要另一个电阻来“上拉”或“下拉”电压,以避免称为浮动的虚假电压变化。这是因为流过电阻的电压在时间和幅度上都是连续的。因此,即使传感器不产生值或测量值,仍有电压流过传感器,可能导致虚假读数。您的项目需要明确区分关(零电压)和开(正电压)。上拉和下拉电阻确保您拥有这两种状态之一。模数转换器负责从传感器读取电压,并将其转换为可被解读为数据的值。
采样时(从传感器读取值时),电压读数必须解释为给定传感器指定范围内的值。请记住,比方说,一个模拟传感器输出的 2 伏电压可能与另一个模拟传感器输出的 2 伏电压不是一回事。每个传感器的数据手册都向您展示了如何解释这些值。
当您使用 Arduino 之类的微控制器时,模数转换器可以方便地将电压转换为 10 位值,从而得到 0 到 1,023 之间的整数值。例如,一个传感器可以测量由 200 个点组成的范围内的现象。最低值通常表示 0,最高值表示 1,023。在这种情况下,可以对 Arduino 进行编程,将从 A/D 转换器读取的值转换为传感器刻度上的值。
如您所见,使用模拟传感器比使用上一节中的 DHT-22 数字传感器要复杂得多。稍加练习,您会发现,一旦了解如何将模拟传感器连接到微控制器,以及如何在传感器校准工作的范围内解释其电压,大多数模拟传感器都不难使用。
数字传感器
像 DHT-22 这样的数字传感器被设计成使用串行传输产生一串比特(一次一个比特)。然而,一些数字传感器通过并行传输产生数据(一次一个或多个字节 15 )。如前所述,这些位表示为电压,其中高电压(比如 5 伏)或开是 1,低电压(0 甚至-5 伏)或关是 0。这些开和关值序列称为离散值,因为传感器以脉冲形式产生一个或另一个值,即开或关。
与模拟信号相比,数字传感器的采样频率更高,因为它们生成数据的速度更快,而且不需要额外的电路来读取数值(例如 A/D 转换器以及将数值转换为刻度的逻辑或软件)。因此,数字传感器通常比模拟传感器更加精确和可靠。但是,数字传感器的精度与其用于采样数据的位数成正比。
数字传感器最常见的形式是按钮或开关。什么,按钮是传感器?为什么,是的,这是一个传感器。考虑一下安装在家庭安全系统窗户上的传感器。这是一个简单的开关,当窗户关闭时关闭,当窗户打开时打开。当开关连接到电路中时,当车窗关闭且开关闭合时,电流是恒定且不间断的(使用上拉电阻测量正电压),但当车窗和开关打开时,电流中断(测量零电压)。这是最基本的开关传感器。
大多数数字传感器实际上是由几个元件组成的小电路,用于产生数字数据。与模拟传感器不同,读取它们的数据很容易,因为这些值无需转换就可以直接使用(除了转换到其他刻度或测量单位)。有些人可能认为这比使用模拟传感器更困难,但这取决于你的观点。电子爱好者会认为使用模拟传感器更容易,而程序员会认为数字传感器更容易使用。
那么,一旦数据被测量出来,你会怎么处理呢?以下部分简要描述了传感器数据的一些方面以及存储这些数据的注意事项。
存储传感器数据
存储传感器数据取决于如何解释数据以及最终如何使用数据。如果你计划使用计算机,或者更好的是数据库来存储数据,你应该以一种有意义的方式来存储它。
例如,存储模拟信号的电压序列可能被认为是以最纯粹的形式保存数据,但如果没有上下文或模数转换器,数据可能毫无意义。存储电压的数字转换可能也不明智,因为您必须记住刻度和范围,以便获得想要表示的值。因此,存储结果转换成比例更有意义。幸运的是,当您使用数字传感器时,您唯一需要记住的是所使用的测量单位(摄氏度、华氏度、英尺、米等等)。因此,最好保存测量的最终形式。
但是你把这些信息存储在哪里呢?商业传感器网络将数据存储在嵌入式数据库或文件存储设备中,将其传输到另一个系统进行存储,或者将其存储在可移动数字介质上。较老的传感器网络(如测谎仪或 EKG 机器)使用图表将数据存储为硬拷贝(使它们非常过时)。
有许多简单的存储设备和技术可以用来构建自己的传感器网络,从 Arduino 的本地设备到 Raspberry Pi 上的现代硬盘。这里列出了这些存储机制,并在第 3 章中进行了更详细的讨论。
让我们看看一些可用的传感器及其测量的现象类型。
传感器的例子
所有传感器网络都始于一个传感器和一种读取和解释数据的方法。本章介绍了许多关于传感器的信息。你可能在想各种各样有用的东西,你可以在家里或办公室,甚至在你的院子里或周围测量。你可能想测量你的新阳光房的温度变化,检测邮递员什么时候把最新的通知扔进你的邮箱,或者记录你的狗使用狗门的次数。我希望现在你能看到这些只是开始想象你能测量什么。你应该在思考你想要建立一个什么样的传感器网络;你可以用这本书来学习如何建造它。
有哪些类型的传感器可用?下表描述了一些比较流行的传感器及其测量内容。这只是可用资源的一个样本。细读 Mouser Electronics ( http://mouser.com
)、spark fun Electronics(sparkfun.com
)、Adafruit Industries ( http://adafruit.com/
)等在线电子厂商的目录,会发现更多的例子。
- 加速度计:这些传感器测量传感器或它所连接的任何东西的运动或移动。它们被设计用来感应几个轴上的运动(速度、倾斜度、振动等等)。一些包括回转仪特征。大多数是数字传感器。Wii 双截棍(或 WiiChuck)包含一个复杂的加速度计,用于跟踪运动。啊哈:现在你知道 Wii 附带的那些有趣的小东西的秘密了。
- 音频传感器:也许这是显而易见的,但麦克风是用来测量声音的。大多数是模拟的,但一些更好的安全和监控传感器具有数字版本,用于传输数据的更高压缩。
- 条形码阅读器:这些传感器设计用于读取条形码。最常见的是,条形码阅读器生成代表条形码的数字等价物的数字数据。这种传感器通常用在库存跟踪系统中,以在工厂或运输过程中跟踪设备。它们数量众多,而且许多价格经济实惠,使您能够将它们整合到自己的项目中。
- RFID 传感器:射频识别使用无源设备(有时称为 RFID 标签)通过电磁感应使用射频传输数据。例如,RFID 标签可以是信用卡大小的塑料卡、标签或类似的包含特殊天线的东西,通常以线圈、细线或箔层的形式调谐到特定频率。当标签靠近阅读器放置时,阅读器发射无线电信号;标签可以使用电磁能量以无线电信号的形式传输嵌入在天线中的非易失性消息,该无线电信号然后被转换成字母数字串。 16
- 生物传感器:读取指纹、虹膜或掌纹的传感器包含一个用于识别模式的特殊传感器。鉴于指纹和掌纹等图案的独特性,它们是安全访问系统的优秀组件。大多数生物传感器产生一组代表指纹或掌纹的数字数据。
- 电容传感器:电容传感器的一种特殊应用,脉搏传感器被设计用来测量你的脉搏率,通常使用指尖作为传感部位。称为脉搏血氧仪(一些医疗专业人员称为 pulse-ox)的特殊设备通过电容传感器测量脉搏率,并通过光传感器确定血液中的含氧量。如果你拥有现代电子设备,你可能会遇到触敏按钮,它们使用特殊的电容传感器来检测触摸和压力。
- 硬币传感器:这是一种最不寻常的传感器。这些设备就像典型的自动售货机上的投币口。像它们的商业等价物一样,它们可以被校准以感应何时插入一定大小的硬币。虽然不像商业单位那样复杂,可以区分真假硬币,硬币传感器可以用来为您的项目添加一个新的维度。想象一个投币 WiFi 站。现在,这应该可以防止孩子们在互联网上花太多时间!
- 电流传感器:这些是用来测量电压和电流的。有些是为测量变化而设计的,而有些是为了测量负载。
- 挠曲/力传感器:电阻传感器测量一块材料的挠曲或压力对传感器的影响。弯曲传感器可能有助于测量扭转效应或作为测量手指运动的一种手段(就像任天堂的电动手套)。当传感器弯曲时,传感器电阻增加。
- 气体传感器:有很多种气体传感器。有些测量潜在有害气体,如液化石油气和甲烷以及其他气体,如氢气、氧气等。其他气体传感器与光传感器相结合来感测空气中的烟雾或污染物。下次当你从烟雾探测器中听到那种警告性的、通常令人讨厌的低电量警告声 18 时,想想那个设备包含了什么。为什么,这是一个传感器节点!
- 光传感器:测量光线强度或缺乏的传感器是特殊类型的电阻器:光敏电阻器(ldr),有时被称为光敏电阻器或光电池。因此,它们本质上是相似的。如果你有一台 Mac 笔记本电脑,当你的发光键盘在弱光下自动打开时,你很可能已经看到了光敏电阻的作用。特殊形式的光传感器可以检测其他光谱,如红外线(如旧的电视遥控器)。
- 液体流量传感器:这些传感器类似于阀门,安装在管道系统中。他们测量液体通过时的流量。基本的流量传感器使用旋转轮和磁铁来产生霍尔效应(快速开/关序列,其频率等于通过的水量)。
- 液位传感器:一种特殊的电阻固态装置可以用来测量水体的相对高度。一个例子是当水位高时产生低电阻,当水位低时产生高电阻。
- 位置传感器:现代智能手机有 GPS 传感器来感应位置,当然 GPS 设备使用 GPS 技术来帮助你导航。幸运的是,GPS 传感器以低成本的形式提供,使您能够将位置检测添加到您的传感器网络中。GPS 传感器以经度和纬度的形式生成数字数据,但有些传感器也可以感知海拔高度。
- 磁条读取器:这些传感器从磁条(像信用卡上的磁条)读取数据,并返回数字形式的字母数字数据(实际的字符串)。
- 磁力计:这些传感器通过磁场强度测量方向。指南针是一种用来寻找磁北的传感器。一些磁力计提供多个轴,以便更好地检测磁场。
- 接近传感器:通常被认为是距离传感器,接近传感器使用红外线或声波来检测距离或范围到/从一个对象。受低成本机器人套件的欢迎,视差超声波传感器通过感应发送脉冲和接收脉冲之间的时间量(回声),使用声波来测量距离。对于近似的距离测量, 19 把时间转换成距离是一个简单的数学问题。这有多酷?
- 辐射传感器:更严重的传感器是那些检测辐射的传感器。这也可能是电磁辐射(也有传感器),但盖革计数器使用辐射传感器来检测有害的电离。事实上,可以使用一个传感器和一个 Arduino(以及一些电子元件)来构建自己的盖革计数器。
- 速度传感器:类似于流量传感器,许多自行车上的简单速度传感器使用磁铁和簧片开关来产生霍尔效应。频率结合车轮的周长可以用来计算速度,以及随着时间的推移,行驶的距离。是的,自行车计算机是简单传感器网络的另一个例子:车轮和前叉上的速度传感器为车把上的监控器提供数据。
- 开关和按钮:这些是最基本的数字传感器,用于检测某个东西是设置(开)还是复位(关)。
- 倾斜开关:这些传感器可以检测设备何时向某个方向倾斜。虽然简单,但它们对于低成本运动检测传感器非常有用。它们是数字的,本质上是开关。
- 触摸传感器:形成小键盘、键盘、定点设备等的触摸敏感膜是一种有趣的传感器形式。你可以将像这样的触摸感应设备用于需要从人类身上收集数据的传感器网络。
- 视频传感器:如前所述,有可能获得小型视频传感器,这些传感器使用摄像机和电路来捕捉图像并将其作为数字数据传输。
- 天气传感器:温度、气压、降雨量、湿度、风速等传感器都属于天气传感器。大多数生成数字数据,可以组合起来创建全面的环境传感器网络。是的,通过十几个廉价的传感器、一个 Arduino(或一个 Raspberry Pi)和一些解释和组合数据的程序,你可以建立自己的气象站。
计算机系统
如果不提及计算机系统,对 IOT 硬件(至少是网络中节点的硬件)的完整讨论将是不完整的。台式机或服务器计算机可以以多种方式用于您的 IOT 解决方案,从为数据库服务器、web 服务器、防火墙到互联网或云网关(或所有这些)提供可靠的平台。
我通常尽量避免在我的 IOT 解决方案中使用计算机系统,主要是为了降低成本,但也因为低成本的计算机板和微控制器板对于我已经构建(或梦想构建)的解决方案来说绰绰有余。
但是,如果您确实想在您的 IOT 解决方案中使用计算机系统,您应该这样做。只要考虑一下额外的成本(即使是小鞋盒电脑也是树莓派的好几倍)、物理尺寸和安装或位置,以及额外的电力需求(它们不容易用电池或太阳能供电)。
最后,确保您采取必要的预防措施来保护您的计算机系统,使它们不容易受到入侵或邀请攻击。黑客对计算机系统的破坏通常比 Arduino 更大。但是,不要认为低价电脑主板是安全的;他们不是。鉴于它们通常运行强大的 Linux 操作系统,大多数也是黑客的好目标。
摘要
IOT 解决方案提供的硬件包括用于为传感器、电源和许多其他需求创建电路的任何分立电子元件。在这个庞大的电子产品类别中,有用于支持 IOT 解决方案功能的组件。更具体地说,我们可以选择建立一个节点网络来观察、记录和显示我们周围世界的信息。
在本章中,您研究了一长串微控制器,重点是 Arduino 系列微控制器板、Raspberry Pi 等低成本(低功耗)计算板,以及可用于连接节点的各种通信硬件,从使用连接到互联网的以太网或 WiFi 网络到用于连接传感器节点的低成本、低功耗无线通信模块(XBee 无线电)。
您还看到了关于如何使用 Arduino 编程环境的简短教程,甚至看到了一个简单的基于传感器的 Arduino 项目的示例(回想一下,开关就是一个简单的传感器)。
最后,您简要了解了传感器,包括您可以在 IOT 解决方案中使用的传感器类型和种类的概述。
在下一章中,您将研究 IOT 解决方案中的数据如何存储(在本地设备上,如基于内存附加文件的解决方案),如何发送到网络中的其他节点,或者如何保存到数据库服务器。
Footnotes 1
https://en.wikipedia.org/wiki/Microcontroller
有关 Arduino.cc 许可政策的完整描述以及有关构建和销售您自己的 Arduino 兼容主板的更多信息,请参见 http://arduino.cc/en/Main/FAQ
。
或者像我祖母常说的,“一个 25 美分的硬币。”
TinyCircuits 还制造了一种兼容 LilyPad 的模块线,大小相当于美国一角硬币(10 分硬币),称为 TinyLily ( http://tiny-circuits.com/products/tiny-lily.html
)。
好吧,永久的,直到你卖掉它!
Mini-computers 不是一个很好的名字,因为其中一些主板不包括视频控制器或支持普通的笔记本电脑或台式机外围设备。
如你所见,我有一颗狂热的心。总会有地方多放一块板的!
http://makershed.com/products/alamode-for-raspberry-pi
目前,Windows 10 IOT 套件尚未正式发布,但测试版已被证明是有趣和有前途的。
与 Arduino 分线主板一起使用时,Intel Edison 是一个小例外。
把那东西盖上,附近可能有小孩!
这个案例是 3D 打印的,所以如果你没有 3D 打印机,你需要找人帮你打印。一个完整的教程就如何建立它包括在内。
令人震惊,不是吗?
这取决于并行缓冲区的宽度。8 位缓冲区一次可以传输 1 个字节,16 位缓冲区一次可以传输 2 个字节,依此类推。
http://en.wikipedia.org/wiki/Radio-frequency_identification
www.sparkfun.com/products/11719
我从来不知道哪个探测器在响,所以我更换了所有探测器的电池。
精度可能取决于环境变量,如海拔、温度等。
三、IOT 数据是如何存储的
Electronic supplementary material The online version of this chapter (doi:10.1007/978-1-4842-1293-6_3) contains supplementary material, which is available to authorized users.
询问任何有成就的专业软件工程师、开发者、架构师或项目负责人,他们都会告诉您,一个性能良好的解决方案的关键是从一个设计和测试良好的计划开始,该计划用于设计和实现项目的数据存储元素。虽然有许多其他方面对质量和成功同样重要,但数据存储元素无疑是成功的主要竞争者之一。
IOT 解决方案也是如此。这超出了最初的数据存储位置问题。为了取得成功,开发解决方案的计划还必须考虑存储什么,更重要的是,如何存储。
我见过许多业余爱好者用各种方式存储数据的解决方案。一些(如果不是大多数)解决方案运行良好,并且几乎没有与数据相关的问题,也就是说,直到出现问题,例如需要修改数据、恢复数据或添加功能来存储其他数据。在这些情况下,很快就会发现数据存储组件无法胜任任务。
有时结果是需要改变数据的存储方式,使其与软件的早期版本不兼容。其他时候,它需要重新设计,比应该需要的甚至预期的要多得多,导致项目延期完成。这些弊病的根本原因通常是数据存储组件设计不良或设计不足。
例如,如果一个解决方案将数据作为文本存储在一个文件中(比如日志),会有什么影响。当然,数据就在那里,您可以很容易地编写一个程序来读取它,但是该解决方案不能扩展到数据变得非常大(数千甚至数百万行)的情况。此外,将数据存储在文件中意味着每一段数据都必须转换为字符串,这需要在执行任何数学运算之前转换回其原始类型。也许更糟的是,没有简单的方法来对数据执行任何类型的特别查询。也就是说,要执行查询,您必须增加用于读取数据的程序代码,编写专门的代码来检查数据。
在这种情况下,需要更多地考虑如何使用数据以及如何存储数据。在本章中,您将更详细地研究这些主题。
Note
这些例子非常简单,目的是为了让 2 更容易理解。Arduino IDE 和程序的简要概述在前一章中已经介绍过。
让我们首先回顾一下 IOT 解决方案,特别是分布式 IOT 解决方案,是如何由网络架构中的几种类型的节点形成的。
分布式 IOT
IOT 解决方案有多种设计和组装方式。一些解决方案使用单个组件设计,将所有硬件装在一个盒子里。虽然这种设计理念似乎在早期的 IOT 解决方案中很常见,但还有另一种设计理念可以提供比单一硬件解决方案更多的通用性、可扩展性和功能。
这种理念(在某种程度上)是从传感器网络借鉴来的,在传感器网络中,解决方案由多个分布式组件组成。在分布式解决方案中,组件使用一个或多个网络协议相互通信。在前一章中,我们讨论了如何收集数据并在网络中的节点间传递,您已经看到了这一点。
在本节中,我们将讨论分布式 IOT 解决方案。这些解决方案由一个或多个数据收集器和一个或多个传感器组成,使用通信方法或协议来传输数据。如上所述,通信方法可以使用微控制器(例如 Arduino)、嵌入式系统等设备,甚至是 Raspberry Pi 等小尺寸计算机。
通常,数据收集器(在传感器网络中称为传感器节点)是为无人值守操作而设计的;它们有时安装在移动物体上或有线通信不切实际的地方。在这些情况下,数据采集器可以被设计成在不受电源(使用电池或太阳能)或通信源(使用无线机制)限制的情况下工作。数据收集器的接收器可以是处理数据和存储数据的节点(数据聚合器节点)或单个数据库服务器。
虽然您已经在第 1 章中看到了每种类型节点的概述,但本节将详细介绍如何使用每个节点组成网络来收集、传输、增加和存储数据。正如您将看到的,我划分了一些类别来进一步定义节点的类型。
图 3-1 显示了每种类型的节点将如何在一个虚构的 IOT 解决方案中使用。我们将在下面的小节中更详细地讨论每一个。
图 3-1。
IOT distributed network nodes
在本例中,顶部的几个数据收集器节点将数据无线发送到中间的数据聚合器节点(有时称为数据节点)。数据节点收集数据并将其保存到安全数字卡中,然后通过有线计算机网络与数据库服务器通信以存储数据。将数据存储在中间数据聚合器节点上可以确保在数据库服务器出现故障或网络中断时不会丢失任何数据。
数据收集器
网络的最低层(或叶层)是数据收集器。它具有至少一个传感器和通信机制,通常是无线协议。这些节点不以任何方式存储或处理捕获的数据,它们只是将数据传递给网络中的另一个节点。
带存储器的数据收集器
下一类节点是存储数据的数据收集器节点。虽然这些节点可以将数据发送到另一个节点,但通常它们是将数据保存到数据卡等存储机制的设备,通过与台式机或服务器计算机的链接保存到数据库,或者直接保存到 LCD 屏幕、面板仪表或 LED 指示灯等视觉输出设备。
数据节点需要的设备不仅仅是将数据传递给另一个节点。他们需要能够记录或展示数据。这是微控制器的一个很好的用途,你会在后面的章节中看到。数据节点可用于形成自主或无人值守的传感器网络,记录数据供以后存档。
例如,考虑一个鱼或花园池塘。有许多商业池塘监控系统采用具有多个传感器的独立传感器设备,这些传感器向数据节点发送数据;用户可以访问数据节点并在计算机上读取用于分析的数据。
可操作装置
可动作设备是类似于数据收集器的另一个节点,并且实际上可以具有数据收集特征。然而,与仅观察和发送数据的数据收集器不同,可操作设备可以直接控制或被给予命令来执行。例如,具有平移和倾斜功能的摄像机可以产生大范围的视频流或静态照片,并接收平移和倾斜功能的命令。
通常,可动作设备需要网络中的另一个节点来接收和发送命令。这可能是一个面向前方(如在互联网中)的计算机或微控制器或远程安装的控制面板,如平板电脑。
数据聚合器
另一种类型的节点是聚合节点。这些节点通常使用通信设备和记录设备(或网关)而没有传感器。它们用于从一个或多个数据收集器或其他数据聚合器节点收集数据。在到目前为止讨论的例子中,监控系统将具有一个或多个聚集器节点来从传感器读取数据。
可以使用数据聚合器来扩充数据,方法是添加对数据进行分类的逻辑、添加日期和时间信息,甚至在保存数据之前对数据执行转换。
数据聚合器还可以用于在数据发送到数据库服务器之前存储数据的临时副本。如果网络在一个或多个节点甚至所采用的通信协议中遇到故障,这允许一些小的可恢复性或连续的数据收集。
数据库服务器
数据库服务器节点顾名思义就是一台托管数据库服务器的计算机,该服务器可用于保存和检索网络中其余节点的数据。虽然有些解决方案使用专用的数据库服务器(我设计的网络使用这种服务器),但有些支持可访问互联网的功能(如网站或控制面板)的解决方案会将数据库服务器与应用放在同一台机器上(例如 web 服务器)。
但是,这通常被认为是一个潜在的漏洞。也就是说,如果 web 服务器受损,数据库服务器受损的可能性相当大。如果可能,最好将数据库服务器放在单独的节点上。如果解决方案与其他网络或互联网隔离,这种脆弱性就会减少。
现在您已经知道了分布式 IOT 解决方案由哪些节点组成,让我们看看如何在整个网络中存储数据。我最后重点介绍数据库服务器选项,但首先介绍几个备选方案,因为根据解决方案的需要,可能需要一些本地存储。例如,在本地存储对数据采取的操作的副本可能有助于诊断问题。
Note
由于收集的大多数数据是传感器数据,以下存储选项使用传感器数据来说明概念。
本地设备上存储
根据数据代表的内容,在本地设备(如 SD 卡、硬盘、电子存储器等)上存储数据可能会很复杂。例如,传感器数据可以有几种形式。传感器可以产生由浮点数或整数组成的数字数据。一些传感器产生更复杂的信息,这些信息被组合在一起,可能包含多种形式的数据。知道如何解释读取的值通常是使用传感器最困难的部分。事实上,您可以在许多传感器节点示例中看到这一点。例如,温度传感器产生的值必须转换成刻度才有意义。
虽然可以将所有数据存储为文本,但如果您希望在另一个应用中使用数据,或者在电子表格或统计应用中使用数据,您可能需要考虑以二进制形式或易于转换的文本形式存储数据。例如,大多数电子表格应用可以很容易地将文本字符串如123.45
转换成浮点数,但是它们可能无法将12E236
转换成浮点数。另一方面,如果您计划为 Arduino 草图或 Raspberry Pi Python 脚本编写额外的代码来处理数据,您可能希望以二进制形式存储数据,以避免必须编写成本高昂(并且可能很慢)的转换例程。
但这只是问题的一部分。你在哪里存储数据是一个更大的问题。您希望以您需要的形式存储数据,但也希望将数据存储在一个位置(在设备上),您可以从该位置检索数据,并且在主机重新启动时不会被擦除。例如,将数据存储在 Arduino 的主内存中并不是一个好主意。它不仅消耗宝贵的程序空间,而且是易失性的,当 Arduino 断电时会被擦除。
以下部分研究了本地存储数据的几种选择。我从 Raspberry Pi 和 Arduino 的例子开始。然而,相似的平台提供相同的(如果不是相似的话)选项。
树莓码头上的本地存储
Raspberry Pi 为本地存储提供了许多选项。您可以轻松地创建一个文件,并将数据存储在根分区或 SD 卡上的主目录中。这是非易失性的,不会影响 Raspberry Pi 操作系统的运行。唯一的缺点是,如果数据显著增长,它可能会导致磁盘空间过少。但是数据必须增长到接近 2GB(对于 2GB 的 SD 卡)才会威胁到操作系统的稳定性(尽管这种情况可能发生)。
也有可能你有一个可移动的驱动器,如 USB 拇指驱动器,甚至 USB 硬盘驱动器连接。一旦安装了设备和驱动器分区,您就可以从 Raspberry Pi 读取和写入文件。当您发现如何使用 Raspberry Pi 构建数据库服务器时,您将在第 5 章中看到这一点。
因为 Raspberry Pi 实际上是一台个人电脑,它具有创建、读取和写入文件的能力。虽然可以使用通过 GPIO 头连接的 EEPROM,但考虑到编程简单和使用文件方便,几乎不需要其他形式的存储。
Raspberry Pi 可以用于许多编程语言。Python 是最流行的语言之一。在 Python 中处理文件很容易,并且是默认库所固有的。这意味着您不需要添加任何东西来使用文件。
以下示例展示了使用 Python 处理文件的简易性。你会注意到,文件放在哪里并不重要——是放在 SD 卡上还是 USB 驱动器上。您只需要知道您想要存储数据的位置(文件夹)的路径,并将其传递给open()
方法。
Tip
在线 Python 文档详细解释了读写文件( http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
)。
将数据写入文件
这个例子展示了用 Python 在 Raspberry Pi 上使用文件是多么容易。我将演示如何从登录用户的主目录中读取和写入文件。这不需要任何额外的硬件或软件库。因此,您可以在任何 Raspberry Pi(或任何兼容 Linux 的系统)上执行这个示例。在本例中,您将访问的文件就像一个日志。也就是说,您总是将新数据写到文件的末尾。
首先创建一个包含 Python 命令的文件。如果您不了解 Python,不要担心,因为这些命令很容易理解,并且在大多数情况下使用起来很直观。如果你曾经写过一个程序来读取文件(或者一个脚本或者一个命令/批处理文件),这段代码看起来会很熟悉。
如果您没有使用过 Raspberry Pi,但是有一台运行 Mac、Linux 或 Windows 的计算机,您也可以在那里执行这个示例。只需记住将您想要读取和写入的文件的路径改为适合您的系统的路径。
首先打开电源并登录到您的树莓 Pi。然后用下面的命令(或类似的命令)在您的主目录或您有读写权限的地方打开一个新文件。你可以使用任何你想要的编辑器。清单 3-1 显示了这个例子的代码。
nano log_file_example.py
Tip
用扩展名.py
命名该文件,以表明它是一个 Python 脚本。在文件中输入清单 3-1 中的代码。
Listing 3-1.Log File Example (Raspberry Pi)
from __future__ import print_function
import datetime # date and time library
# We begin by creating the file and writing some data.
log_file = open("log.txt", "a+")
for i in range(0,10):
log_file.write("%d,%s\n" % (i, datetime.datetime.now()))
log_file.close()
# Now, we open the file and read the contents printing out
# those rows that have values in the first column > 5
log_file = open("log.txt", "r")
rows = log_file.readlines();
for row in rows:
columns = row.split(",")
if (int(columns[0]) > 5):
print(">", row, end="")
log_file.close()
在本例中,您首先导入datetime
。您使用datetime
来获取当前的日期和时间。接下来,打开文件(注意,因为没有指定路径,所以使用的是当前目录),向文件中写入十行,然后关闭文件。
注意open()
方法。它需要两个参数——文件路径和名称以及打开文件的模式。您使用"a+"
添加到文件中(a
),如果文件不存在(+
)则创建该文件。其他值包括用于读取的r
和用于写入的w
。其中一些可以合并。例如,"rw+"
创建一个不存在的文件,并允许读写数据。
Note
使用写入模式会截断文件。对于大多数需要存储传感器样本的情况,可以使用追加模式。
接下来,您关闭文件,然后重新打开它进行阅读。这演示了如何读取一个文件并在其中搜索数据。在这种情况下,您读取所有的行,然后对每一行划分(使用split()
函数)成列。请注意,在写入数据的行中,各列用逗号分隔。
在这种情况下,您将查找第一列大于 5 的任何行。由于该文件是一个文本文件,因此读取的每一行都是一个字符串,所以使用int()
函数将第一列转换为一个整数。一旦你找到这一行,你就把它打印出来。
在这一点上,我应该提到,阅读文件需要对它的布局(组成)有深入的了解,包括列数、数据类型等等。没有这些知识,你就不能编写一个可靠地读取数据的程序。
如果您正在跟进,请继续运行该脚本。要执行该文件,请使用以下命令:
python ./log_file_example.py
如果出现错误,请检查代码并更正任何语法错误。如果打开文件时遇到问题(运行脚本时出现 I/O 错误),请尝试检查您正在使用的文件夹的权限。尝试多次运行该脚本,然后显示文件的内容。清单 3-2 显示了连续运行三次的完整命令序列。
Listing 3-2.Log File Example Output (Raspberry Pi)
$ python ./log_file_example.py
> 6,2015-10-14 20:42:33.063794
> 7,2015-10-14 20:42:33.063799
> 8,2015-10-14 20:42:33.063804
> 9,2015-10-14 20:42:33.063808
$ python ./log_file_example.py
> 6,2015-10-14 20:42:33.063794
> 7,2015-10-14 20:42:33.063799
> 8,2015-10-14 20:42:33.063804
> 9,2015-10-14 20:42:33.063808
> 6,2015-10-14 20:42:38.128724
> 7,2015-10-14 20:42:38.128729
> 8,2015-10-14 20:42:38.128734
> 9,2015-10-14 20:42:38.128739
$ python ./log_file_example.py
> 6,2015-10-14 20:42:33.063794
> 7,2015-10-14 20:42:33.063799
> 8,2015-10-14 20:42:33.063804
> 9,2015-10-14 20:42:33.063808
> 6,2015-10-14 20:42:38.128724
> 7,2015-10-14 20:42:38.128729
> 8,2015-10-14 20:42:38.128734
> 9,2015-10-14 20:42:38.128739
> 6,2015-10-14 20:42:39.262215
> 7,2015-10-14 20:42:39.262220
> 8,2015-10-14 20:42:39.262225
> 9,2015-10-14 20:42:39.262230
有没有得到类似的结果?如果没有,请更正任何错误,然后重试,直到成功为止。请注意,我第一次运行该脚本时得到了三行,接下来是六行,然后是九行。这是因为脚本的第一部分将数据附加到文件的末尾。如果您想重新开始,只需删除创建的文件。
从这个简单的例子中可以看出,使用 Python 读写日志文件很容易。
Arduino 上的本地存储
虽然 Arduino 确实没有板载存储设备,但有两种方法可以在 Arduino 上本地存储数据。您可以将数据存储在一种特殊形式的非易失性存储器中,或者通过特殊的 SD 卡盾或以太网盾(大多数以太网盾都有内置的 SD 卡驱动器)托管在 SD 卡上。
Note
如果你真的很有创造力(或者无法抗拒挑战),你可以使用一些通信协议向其他设备发送数据。例如,您可以使用串行接口将数据写入串行设备。
以下部分将更详细地讨论每个选项。后面的小节介绍了一些小项目,您可以用它们来学习如何使用这些设备来存储数据。
非易失存储器
Arduino 最常见的非易失性存储器是电可擦除可编程只读存储器(EEPROM,读作“e-e-prom”或“double-e prom”)。EEPROMs 被封装成芯片(集成电路)。顾名思义,数据可以写入芯片,即使上电后也是可读的,但可以被擦除或覆盖。
大多数 Arduino 板都有一个小的 EEPROM,用来存储草图,并在上电时读取。如果你曾经想知道 Arduino 是如何做到这一点的,现在你知道了。如果愿意,您可以写入该内存中未使用的部分,但是可用的内存量很小(512KB)。您也可以使用 EEPROM,并通过 I2C 协议将其直接连接到 Arduino,以克服这一限制。
Arduino IDE 中包含一个特殊的库,支持对 EEPROM 的读写。由于可用的存储器数量有限,将数据存储在 EEPROM 存储器中对于大多数数据节点来说并不理想。如果存储的数据很大或者每个样本有许多数据项,则可能会超出可用的内存。
您还会遇到从 EEPROM 获取数据以用于其它应用的问题。在这种情况下,您不仅要构建写入数据的方法,还要构建读取数据并将其导出到其他介质(本地或远程)的方法。
这并不是说你不应该使用 EEPROM 来存储数据。几个可能的原因证明了在 EEPROM 中存储数据的合理性。例如,当节点脱机时,可以使用 EEPROM 临时存储数据。事实上,您可以构建草图来检测节点何时离线,并在那时切换到 EEPROM。这样,基于 Arduino 的数据节点可以继续记录传感器数据。一旦节点重新联机,您可以编写草图将 EEPROM 的内容转储到另一个节点(远程存储)。
如何在 Arduino 上使用 EEPROM 的详细示例超出了本书的范围。但是我想讨论这个选项,因为它是 Arduino 的一个可行的替代方案,并且少量的数据是很方便的。然而,我在我的书《使用 Arduino 和 Raspberry Pi 开始传感器网络》的第 5 章中详细描述了这个过程(Apress,2014)。
sd 卡
您还可以在 SD 卡上存储(和检索)数据。Arduino IDE 有一个用于与 SD 驱动器交互的库。在这种情况下,您可以使用库通过 SD shield 或以太网 shield 访问 SD 驱动器。
在 SD 卡上存储数据是通过文件完成的,在概念上类似于前面的例子。您打开一个文件,以最适合下一阶段数据分析的格式将数据写入其中。Arduino IDE 和其他地方的示例演示了如何为 Arduino 创建 web 服务器界面,以显示 SD 卡上可用文件的列表。
在数据节点被设计为不与其他节点连接的远程单元的情况下,您可以选择将数据存储到 SD 卡,或者在数据节点断开连接或数据聚合器节点关闭时,您可以将它用作备份日志记录设备。由于该卡可在其他设备上移动和读取,当您想要使用数据时,可以在另一个设备上读取它。
使用 SD 卡意味着您可以将数据从传感器节点移动到计算机,只需从 Arduino 上拔下 SD 卡,然后将其插入计算机中的 SD 读卡器即可。让我们看看如何在 Arduino 上读写 SD 卡的数据。清单 3-3 展示了日志文件概念的完整示例。你需要一个格式化为 FAT 分区的 SD 卡。
Storing Date And Time With Samples
Arduino 没有机载实时时钟(RTC)。如果您想在本地存储数据,您必须存储带有大致日期和时间戳的数据,或者使用 RTC 模块读取准确的日期/时间值。幸运的是,有 RTC 模块可以和 Arduino 一起使用。
Listing 3-3.Log File Example (Arduino)
/**
Example Arduino SD card log file.
This project demonstrates how to save data to a
microSD card as a log file and read it.
*/
#include <SPI.h>
#include <SD.h>
#include <String.h>
// Pin assignment for Arduino Ethernet shield
#define SD_PIN 4
// Pin assignment for Sparkfun microSD shield
//#define SD_PIN 8
// Pin assignment for Adafruit Data Logging shield
//#define SD_PIN 10
File log_file;
void setup() {
char c = ' '
char number[4];
int i = 0;
int value = 0;
String text_string;
Serial.begin(115200);
while (!Serial); // wait for serial to load
Serial.print("Initializing SD card...");
if (!SD.begin(SD_PIN)) {
Serial.println("ERROR!");
return;
}
Serial.println("done.");
// Begin writing rows to the file
log_file = SD.open("log.txt", FILE_WRITE);
if (log_file) {
for (int i=0; i < 10; i++) {
text_string = String(i);
text_string += ", Example row: ";
text_string += String(i+1);
log_file.println(text_string);
}
log_file.close();
} else {
Serial.println("Cannot open file for writing.");
}
// Begin reading rows from the file
log_file = SD.open("log.txt");
if (log_file) {
// Read one row at a time.
while (log_file.available()) {
text_string = String("");
// Read first column
i = 0;
while ((c != ',') && (i < 4)) {
c = log_file.read();
text_string += c;
if (c != ',') {
number[i] = c;
}
i++;
}
number[i] = '\0'
value = atoi(number);
// Read second column
c = ' '
while (c != '\n') {
c = log_file.read();
text_string += c;
}
// If value > 5, print the row
if (value > 5) {
Serial.print("> ");
Serial.print(text_string);
}
}
// close the file:
log_file.close();
} else {
// if the file didn't open, print an error:
Serial.println("Cannot open file for reading");
}
}
void loop() {
// do nothing
}
Note
我省略了日期和时间的书写。有一种方法可以做到这一点,但它需要更多的代码,我想把精力集中在文件操作上。要了解如何在 Arduino 上使用DateTime
库,请参见 http://playground.arduino.cc/Code/DateTime
。
请注意,这里的代码比 Raspberry Pi 示例多得多。这是因为 Arduino 代码库没有 Python 那样的高级原语。于是,我们不得不自己做很多底层的操作。
为了简单起见,我将代码放在setup()
方法中,这样它只运行一次。loop()
方法中的回调代码重复运行,直到 Arduino 断电(或者您启动低级代码来暂停执行或重启)。如果您在 IOT 解决方案中使用这个例子,启动 SD 卡的代码将保留在setup()
方法中,甚至可能是打开文件的代码,但是写文件的代码将被移到loop()
方法中,以记录从传感器或其他数据收集器读取的数据。
代码示例从一些变量开始,这些变量用于选择与 SD 卡通信的 pin。我包括了几个受欢迎的选项。查看硬件文档,确保指定了正确的 pin。
接下来,您将看到打开文件并写入几行的代码。在本例中,我简单地使用计数器的值编写了一个简单的文本字符串,后跟一些简短的文本。正如我提到的,我在这个例子中没有记录日期和时间信息,因为 Arduino 不包括 RTC(尽管较新的电路板可能包括 RTC)。请注意,我打开了文件,写入了行,然后关闭了文件。
接下来是从文件中读取行的代码块。与 Raspberry Pi 示例一样,我们必须自己读取行并拆分列。但是,在这种情况下,我们必须一次读一个字符。因此,我使用一个循环来完成这项工作,并在定位到逗号时终止。循环的第二部分从该行中读取剩余的文本,直到找到换行符。
然后,我检查第一列的值(在将其转换为整数之后),如果大于 5,我将该行输出到串行监控器。让我们看看这段代码的运行情况。清单 3-4 显示了在串行监控器中看到的代码输出。
Listing 3-4.Log File Example Output (Arduino)
Initializing SD card...done.
> 6, Example row: 7
> 7, Example row: 8
> 8, Example row: 9
> 9, Example row: 10
Initializing SD card...done.
> 6, Example row: 7
> 7, Example row: 8
> 8, Example row: 9
> 9, Example row: 10
> 6, Example row: 7
> 7, Example row: 8
> 8, Example row: 9
> 9, Example row: 10
Initializing SD card...done.
> 6, Example row: 7
> 7, Example row: 8
> 8, Example row: 9
> 9, Example row: 10
> 6, Example row: 7
> 7, Example row: 8
> 8, Example row: 9
> 9, Example row: 10
> 6, Example row: 7
> 7, Example row: 8
> 8, Example row: 9
> 9, Example row: 10
如您所见,输出类似于 Raspberry Pi 示例。显然,两者都可以用来在本地文件中存储数据,但是 Arduino 需要做更多的工作。幸运的是,Arduino IDE 包括一个设计良好的 SD 卡库。
事实上,SD 卡库中还有许多其他功能可以用来处理文件。例如,您可以列出卡上的文件,创建文件夹,甚至截断或删除文件的内容。您可能会发现这段代码在处理前面的代码时很有用。下面显示了截断一个文件是多么容易。如果您想使用它,请在文件第一次打开之前将其放在代码中。
if (SD.remove("log.txt")) {
Serial.println("file removed");
}
Tip
有关在 Arduino 上使用 SD 卡的更多信息,请参阅 Arduino 在线参考指南( http://arduino.cc/en/Reference/SDCardNotes
)
)。
现在,您已经看到了在数据收集器节点上本地存储数据的一些选项,下一节将讨论如何将数据发送到数据聚合器进行本地或远程存储。在这种情况下,远程存储通常是数据库服务器。
将责任推卸给聚合者
回想一下,数据聚合器是一个特殊的节点,用于从多个来源(数据收集器或传感器)接收信息,并在本地或远程存储结果。源数据可以来源于节点本身上的多个传感器,但更常见的是,数据聚集器从多个数据收集器节点接收信息,这些数据收集器节点不直接连接到聚集节点(它们可以通过诸如 XBee 模块提供的低功率、低开销的通信协议连接)。
What’S An Xbee?
XBee 是 Digi International 的品牌名称,代表小型、独立、模块化、高性价比的组件,使用射频(RF)在 XBee 模块之间交换数据。XBee 模块在 2.4GHz 或远程 900MHz 上传输,并有自己的网络协议(ZigBee)。
虽然 XBee 不是一个微控制器,但它的处理能力有限,可以用来控制模块。其中一个功能,睡眠模式,可以帮助延长电池供电(或太阳能供电)传感器节点的电池寿命。您还可以指示 XBee 模块监控其数据引脚,并将读取的数据传输到另一个 XBee 模块。因此,您可以使用 XBee 模块将数据从一个或多个传感器发送到数据聚合器节点。
在一些 IOT 解决方案中,传感器由其他节点托管并放置在远程位置。数据聚集器节点通过有线或无线连接连接到数据收集器节点。例如,您可能在一个位置将一个传感器托管在低功耗 Arduino 上,而在另一个位置将另一个传感器托管在 Raspberry Pi 上,这两个传感器都使用 XBee 模块连接到您的数据聚合器。除了所选网络介质的限制之外,您可以让几十个节点向一个或多个数据聚合器节点提供传感器数据。
使用数据聚合器节点有几个优点。如果您使用无线技术,如带有 XBee 模块的 ZigBee,数据聚合器节点可以允许您通过将数据聚合器节点放置在离传感器最近的位置来扩展网络的范围。然后,数据聚合器节点可以通过更可靠的介质将数据传输到另一个节点,例如数据库服务器。
例如,您可能希望将数据聚集器节点放置在有电源和以太网连接的外屋中,以从位于各种其他建筑物中的远程数据收集器节点收集数据。
Note
在这种情况下,我指的是距离传感器节点最近的点,该点仍在无线传输介质(如 XBee 模块上使用的 ZigBee)的范围内。
数据聚合器节点还允许您将处理一组传感器的逻辑移动到一个更强大的节点。例如,如果您使用需要代码来处理值的传感器,则可以使用数据聚合器节点来接收来自这些传感器的原始数据,存储这些数据,并在以后计算这些值。
这不仅确保了您只在一个位置拥有代码,而且还允许您为远程传感器使用不太复杂(功能不太强大)的主机。也就是说,您可以为传感器使用较便宜或较旧的 Arduino 板,为数据聚合器节点使用功能更强大的 Arduino 板。这样做还有一个额外的好处,就是如果一个远程传感器损坏了,更换起来并不昂贵。
还记得,您必须决定要将传感器数据存储在哪里。数据聚合器节点可以将数据本地存储在可移动介质或机载存储设备上(本地存储),也可以将数据传输到另一个节点进行存储(远程存储)。选择使用哪一个通常基于数据将如何被消费或查看。
例如,如果您只想存储从传感器读取的最后一个值,您可能需要考虑某种形式的可视化显示或远程访问机制。在这种情况下,使用本地存储,只存储最新的值,可能更经济,也更简单。
另一方面,如果您需要记录一段时间内的数据值以供以后处理,您应该考虑将数据存储在另一个节点上,以便可以在不影响传感器网络的情况下访问数据。也就是说,您可以将数据存储在更强大的系统上(比如个人计算机、服务器或基于云的服务),并进一步降低聚合节点发生故障时丢失数据的风险。
本地存储的性质是使用本地存储数据聚合器节点的一个限制因素。也就是说,如果您想在以后处理数据,您可以选择一种介质,允许您检索数据并将其移动到另一台计算机上。
这并不意味着本地存储数据聚合器是一个无用的概念。让我们考虑这样一种情况,您想要监控几个附属建筑的温度。您没有将数据用于任何分析,而只是希望能够在方便时(或需要时)读取这些值。
一个可能的解决方案是设计带有可视化显示的本地存储数据聚合器节点。例如,您可以使用 LCD 来显示传感器数据。当然,这意味着数据聚合器节点必须在一个您可以轻松到达的位置。
但是,让我们考虑这样一种情况,您的数据聚合器节点也位于远程位置。也许它也在另一个外屋,但是你大部分时间都在不同的地方度过。在这种情况下,远程访问解决方案是最好的。
这种数据聚合器节点的设计将需要在本地存储最新的值,比如在存储器或 EEPROM 中,并且当客户端连接时,显示数据。对于本地存储数据聚合器节点来说,这是一个简单而优雅的解决方案。
但是,将数据从数据收集器传递到数据库服务器更可靠。正如您将在第 5 章中看到的,您可以使用 Raspberry Pi 或类似的低成本板来构建数据库服务器,并将其部署在您的 IOT 解决方案中。
然后,数据聚合器节点需要一个名为连接器的库,以允许您编写程序(脚本、草图)来连接到数据库服务器并发送数据。在本书中,我重点介绍了 MySQL 数据库服务器。在 Raspberry Pi 的例子中,我将演示的数据库连接器称为 Connector/Python,可以从 Oracle ( http://dev.mysql.com/downloads/connector/python/
)获得。我还将讨论 Arduino 的一个数据库连接器,名为 Connector/Arduino,它是我创建的 4 ,可以在 GitHub ( https://github.com/ChuckBell/MySQL_Connector_Arduino
)上获得,也可以通过 Arduino IDE 中的库管理器获得。因此,连接器形成了到 MySQL 服务器的通信路径。
即使使用了连接器,您也可以在解决方案中使用数据库服务器做很多事情。数据库服务器不仅提供了健壮的存储机制,还可以用来从数据聚合器中卸载一些数据处理步骤。我讨论了在您的 IOT 解决方案中使用数据库服务器节点时需要考虑的一些问题。
数据库存储
数据库选项代表一种更稳定、更易于扩展、更易于查询的存储选项。事实上,这就是本书的全部内容——发现如何在您的 IOT 解决方案中最好地使用数据库服务器!
在本节中,我们将探讨在您的 IOT 解决方案中使用数据库服务器的一些好处、技术和注意事项。正如您将看到的,当您使用数据库服务器时,有许多功能可供您使用。我将在第 5 章中给出这些主题的高层次概述和更深入的实际操作解释。让我们从讨论为什么在您的 IOT 解决方案中使用数据库服务器开始。
Tip
虽然对数据库设计的深入、全面的讨论超出了本书的范围,但是下面的文本从一个稍微不同的角度来看待这个主题:如何最好地设计数据库以便于存储和检索。因此,我假设没有数据库设计的先验知识。如果您有数据库设计经验,您可能希望浏览这一部分。
数据库服务器提供了存储和检索数据的结构化方式。与数据库服务器的交互需要使用一组特殊的命令,或者更准确地说,需要使用一种表示存储和检索的特殊语言。这种语言被称为结构化查询语言(SQL)。大多数数据库服务器的大多数命令都使用 SQL 的形式。虽然不同的数据库服务器之间存在一些差异,但是语法和核心 SQL 命令是相似的。
在本书中,我们使用 MySQL 数据库系统作为数据库服务器。MySQL 6 是开发者最受欢迎的选择,因为它以轻量级的形式提供了大型数据库系统的特性,可以在几乎任何消费类计算机硬件上运行。MySQL 也很容易使用,它的流行已经产生了许多学习和使用该系统的在线和印刷资源。
利益
如上所述,在您的 IOT 解决方案中使用数据库服务器有很多优点。数据库服务器不仅允许结构化的、健壮的数据存储,而且还提供了强大的数据检索机制。
考虑一个将数据存储在文件中的解决方案。正如您在前面几节中看到的,读取文件和查找信息需要解析(分离数据元素)数据,然后比较数据以符合所需的标准。问题是每次你想进行搜索时,你都需要修改你的程序或脚本。
这听起来不算太糟糕,但是考虑到你可能需要随时执行搜索(查询)的可能性。此外,请考虑您可能希望无需重写代码就能做到这一点,或者您可能希望允许您的用户执行查询。显然,使用文件或类似的存储机制不容易允许这种行为。
这是使用数据库服务器最有益的方面之一。您可以在任何时候(特别地)执行查询,并且您不需要特殊的程序或者需要重写任何东西来使用它。我应该注意到,有些解决方案将查询硬编码到代码中,有些人认为这与访问文件是一回事。但事实并非如此。
在基于文件的解决方案中,即使您使用编程原语,您仍然必须编写代码来执行查询,而在数据库解决方案中,您只需要替换查询语句本身。例如,考虑清单 3-1 中的 Raspberry Pi 文件示例。执行查询所需的代码(只选择第一列的值大于 5 的行)有几行长 7 ,不仅需要选择匹配的行,还需要一次读取一个字符的列。
现在考虑下面的 SQL 语句。不要担心命令的细节。仅考虑我们可以将查询表示为如下的单个语句:
SELECT * FROM db1.table1 WHERE col1 > 5;
请注意,标准已被移动到数据库服务器。也就是说,代码不需要读取、解释和测试列的值。相反,该逻辑是在数据库服务器上执行的。事实上,数据库服务器已经过优化,能够以最有效的方式执行这样的查询——这在基于文件的解决方案中需要做大量的工作(但也不是闻所未闻)。出于好奇,执行和检索行的代码如下:
cur.execute("SELECT * FROM db1.table1 WHERE col1 > 5")
rows = cur.fetchall()
for row in rows:
print ">", row
虽然这是一个微不足道的例子,但这一点仍然有效。具体来说,数据库服务器是一个强大的搜索工具。这不仅允许您简化代码,还允许在构造查询时有更大的表达能力。
例如,您可以构造执行复杂数学比较、文本比较(甚至通配符匹配)和日期比较的查询。例如,您可以使用日期操作来选择从执行时间起超过 N 天的行或在特定年、月、日或小时记录的行。显然,这比您自己编写的代码强大得多!
使用数据库服务器的另一个好处是,您可以按逻辑方式对数据进行分组。数据库服务器允许您创建任意数量的数据库来存储数据。通常,您希望为每个 IOT 解决方案创建一个单独的数据库。这使得在逻辑层次上处理数据更加容易,这样一个解决方案的数据就不会与另一个解决方案的数据混杂在一起。因此,一台数据库服务器可以支持许多 IOT 解决方案。
技术
在您的解决方案中使用数据库服务器需要使用一些与其他存储解决方案不同的技术。您已经看到,基于文件的系统容易受到文件布局变化的影响(如果文件布局发生变化,那么代码也必须发生变化);对于数据库来说,情况并非如此。
例如,如果您需要向表中添加一列,您不必重写代码来读取数据。事实上,可以在不影响代码的情况下对数据库进行许多更改。虽然某些更改可能会影响 SQL 语句,但与基于文件的解决方案相比,您在如何存储数据方面有很大的自由度。
因此,开发中最大的变化是如何使用数据库服务器,而不是代码本身。也就是说,代码开发可以独立于数据库开发进行。您可以独立于代码开发数据库、其组件和 SQL 语句。事实上,在开发任何其他节点之前,您可以创建一个工作的、经过测试的数据库组件!
这看起来比基于文件的解决方案的代码要多,但实际上并不是这样,原因有二。首先,您可以用测试数据单独测试您的 SQL 语句。这意味着您不需要启动并运行整个 IOT 解决方案,这使得开发更加容易。其次,相关的是,您可以重复执行 SQL 语句以确保获得正确的数据,这使得从代码中分离数据更加容易,从而使解决方案更易于维护。也就是说,如果有什么变化,您可以简单地更改 SQL 语句,而不是重写代码。
但这并不意味着您不需要花时间来设计和测试数据库设计。相反,为了获得这些好处,您的数据库应该设计得很好。如果数据本身或您对数据的使用很复杂,数据库设计可能会很复杂。幸运的是,对于大多数 IOT 解决方案来说,这不是问题。
最后,使用数据库服务器允许您快速设置测试数据,操作它,并刷新它。同样,这在其他存储解决方案中也是可能的,但在数据库服务器中要容易得多。因此,设置测试数据的技术允许您确保您的查询准确地返回您期望的结果。这是因为您知道输入(样本数据),并且可以轻松地手动确定结果应该是什么。
毕竟,在基于文件或基于内存的存储解决方案上使用数据库服务器改变了您开发解决方案的方式,通过在应用之外测试 SQL 语句或部署和执行网络节点,使处理数据变得更加容易。
考虑
由于您正在阅读这本书,您很可能确信或者几乎确信您想要在您的 IOT 解决方案中使用数据库服务器。但是,您可能想知道在您的解决方案中使用数据库服务器会有什么后果或限制。
也许最重要的考虑是您需要一个平台来托管数据库服务器。如果您的解决方案使用计算机,您就拥有了所需的一切。MySQL 运行在商用硬件上,对于像 IOT 这样的小型解决方案,即使是最基本的计算机也绰绰有余。
然而,如果你没有电脑呢?在这种情况下,您需要添加硬件来托管数据库服务器。幸运的是,MySQL 可以在大多数低成本的计算机主板上运行,如 Raspberry Pi、Beaglebone Black、pcDuino,甚至最新的英特尔 IOT 主板。虽然这意味着网络中的另一个节点,但是您已经看到这个节点非常适合这个计划(一个数据库节点)。我在第五章中给出了一个关于构建 MySQL 数据库节点的完整教程。
除了添加一个新节点之外,还需要考虑在代码中使用 SQL。为此,我们使用一个连接器通过以太网连接到 MySQL 服务器,向服务器发送查询以供执行,然后检索并处理结果。如果你不知道 SQL,你将不得不学习如何形成查询。然而,正如你将在第 5 章和第 6 章中看到的,SQL 语句并不难学习和使用。
另一个需要考虑的问题是,在数据库服务器中存储数据需要一个好的设计,仅限于数据库服务器的术语和特性。更具体地说,您必须形成表的布局,包括从一长串可用类型中选择正确的数据类型。
这个过程的一部分(称为数据库设计)涉及到查询本身的设计,或者更具体地说,涉及到设计查询以使它们准确地返回您想要的结果。因此,应该在数据库服务器上测试查询(或者通过客户端连接,正如您将在第 5 章中看到的那样)以确保您的 SQL 语句是正确的,并且在出现异常数据时不会出现意外。正如您在上一节中看到的,这样做的好处是更容易开发处理数据的解决方案层。
当你设计你的桌子时,你应该记住一些事情。首先,考虑存储样本需要什么数据类型。您不仅要考虑每个样本包含多少个值,还要考虑它们的格式(数据类型)。可用的基本数据类型包括整数、浮点、双精度、字符和布尔。还有许多其他的,包括用于日期和时间的几个,以及用于存储大数据块(如图像)的二进制大对象(blob),大文本(与 blob 相同,但不解释为二进制)等等。
您还可以考虑添加一些列,比如时间戳字段、数据收集器节点的地址、参考电压等等。写下所有这些,并考虑每个的数据类型。
Tip
有关所有数据类型( http://dev.mysql.com/doc/refman/5.7/en/
)的完整列表和讨论,请参见在线 MySQL 参考手册。
数据库设计可能要考虑的是数据库所需的物理存储。如果您的 IOT 解决方案使用没有任何物理存储的节点,您应该添加一个。物理存储不仅意味着数据不易受到节点故障的影响(比如内存被擦除),而且它还允许您使用具有大存储容量的介质。虽然您可以使用安全的数字存储卡,但最好使用固态或更旧的磁盘。
数据的维护是另一个考虑因素,但可能没有提到的其他因素那么重要。更具体地说,即使是基于文件的解决方案也需要维护,或者至少需要执行维护(如备份和恢复)的工具。对于基于文件的解决方案,这可能只是复制文件的问题。对于数据库解决方案,备份和恢复稍微复杂一些。
幸运的是,您可以使用 mysqlpump 8 (或更老的 mysqldump 9 )或 MySQL 实用程序 10 来对数据进行逻辑备份。也就是说,这些实用程序生成一个 SQL 命令文件,您可以重放这些命令来创建和存储数据。对于物理备份(在字节级别),您必须使用商业应用(如 MySQL Enterprise Backup)来备份和恢复数据。
最后,如果从网络外部可以看到数据库服务器节点,安全性也是一个需要考虑的问题。在这种情况下,您必须小心确保不仅平台访问(例如,Raspberry Pi)是安全的,而且所有的数据库安全性都经过适当的设计,以便访问数据库服务器的用户仅具有足够的权限来执行对解决方案的查询,仅此而已。换句话说,您需要在设计解决方案时考虑安全性。
既然您已经研究了数据库节点,那么让我们看看设计和实现分布式 IOT 网络的一些最佳实践。
分布式 IOT 网络最佳实践
如果您的 IOT 解决方案需要部署在数据收集器物理上分离的分散区域,或者您希望使用低成本的商用硬件来开发您的解决方案,您可能需要使用分布式节点网络来设计您的 IOT 解决方案。
本节分析了规划网络时的一些重要注意事项。我讨论了网络中节点的放置以及数据存储的设计考虑。这些最佳实践中的大多数都是以数据为中心的,这是有充分理由的——如果没有可访问的数据,解决方案就毫无用处。
节点布局
规划解决方案时,您应该考虑要收集哪些数据。此外,您应该考虑在哪里以及如何收集数据。这包括传感器需要放置的位置以及产生的数据。
放置带有传感器(数据收集器)的节点可能是一个简单的选择——它们需要靠近它们正在观察的东西。如果数据采集器在室外,它们可能需要防风雨的 Shell。即使在内部,你也可能需要保护硬件,以避免意外篡改(如小手指或爱管闲事、好奇的朋友 11 )。事实上,我建议为每个节点使用合适的机箱。
然而,将数据聚合器放在哪里可能更成问题。这通常由所选择的通信机制决定。回想一下,如果您使用 ZigBee 或蓝牙等低开销机制,您可能会被限制在一定的范围内。因此,数据聚合器需要足够近才能与数据收集器通信。
此外,数据聚合器节点最好放置在可以通过 WiFi 或以太网与数据库服务器或可视化应用(可能是托管 web 服务器或云网关的另一个节点)通信的位置。因此,根据您拥有的数据收集器的数量以及它们与可以放置数据聚集器的位置的物理距离,您可能需要使用多个数据聚集器。如果所有的数据收集器都位于您的低成本通信机制的范围内,您也许能够使用单个数据聚合器。
也许规模较小的是数据聚集器硬件的能力。如果您选择一个可以支持有限数量连接的平台,那么您就会受到数据聚合器可以支持的数据采集器数量的限制。同样,您可能需要不止一个数据聚合器来支持所有的数据收集器。
另一种要考虑节点放置的节点类型是可操作设备。如果设备产生数据,您可能需要将其连接到数据聚合器。但是,如果该设备具有被编程或运行脚本的能力,您可以对其进行编程,以将数据直接写入数据库服务器。
最后,放置数据库节点不太重要,因为它将使用 WiFi 或以太网。因此,它只需要在同一个网络上(或者可以从数据聚合器使用的网络上访问)。
数据存储
在考虑您的数据存储时,您应该考虑数据看起来像什么,也就是说,传感器产生什么数据来包括数据类型以及如何使用数据。
例如,如果传感器数据是一个数值范围内的数字,比如-5.0 到+5.0,该数值可能没有太大意义。例如,当值更接近-5.0 与+5.0 时,这意味着什么?您应该总是存储原始值,但是您可能希望存储一个代表值。在这种情况下,可能有几个确定定性值的阈值。考虑以下虚拟传感器范围的阈值。在这种情况下,该值是电压读数。
-5.0
:错误,无信号-4.9
到-2.0
:低-2.0
到0.0
:好,递减0.0
到+2.0
:好,增加+2.0
到+4.9
:高+5.0
:错误,无信号
注意有两种错误情况。我以前在其他传感器中见过这种情况,这取决于传感器如何供电或发送信号。虽然看到这样的值并不罕见,但您不太可能遇到有多个错误读数的传感器(但我见过一些)。
还要注意,有四个不同的阈值告诉我们这些值的含义。例如,如果读取的值是+3.3,我们知道该数据可以解释为“高”因此,我们可以在一列中存储原始值,在另一列中存储类别。例如,我们可以有一个浮点字段(列)和另一个值为(低、减少、增加、高和错误)的文本列。我们将使用数据聚合器或数据库服务器来分配这些值。我在第五章中给你展示了一个这样的例子。
这些信息对于规划您的数据聚合器代码至关重要。你需要理解数据的含义,以及如何最好地解读它。事实上,我建议将它记录在你的代码和笔记本中。如果您更换传感器或发现需要调整阈值,这些信息将非常重要。
例如,如果需要将增加或减少的阈值调整到更高或更低的值,则可能需要修改接近原始阈值的读取值。如果您没有存储原始值,您将无法调整您已经存储的数据。
除了如何解释数据,您还应该考虑数据如何在您的网络中流动。我喜欢画一张图,显示每种类型的数据来自哪里,以及它们是如何在网络中传输的。图 3-2 显示了一个数据流程图的例子。您可以使用任何想要的形式——从写在日志中的简单列表到用结构化设计语言(如统一建模语言(UML ))编写的图形图片。 12
图 3-2。
Data flow chart
这个例子是一个池塘监控系统。我展示了以原始形式收集的数据,以及应该如何解释这些数据。这有助于我设计一个数据库来存储数据,并决定在哪里放置任何可能有助于解释数据的代码或功能。
例如,水位检测使用传感器所在的 Arduino 上产生的声音。这允许我在水位下降时听到警告(传感器被触发)。因为我每天在上下班的路上都会经过池塘,所以这是在用户界面中使用多种提示的一个很好的例子。在这种情况下,用户界面是一个网页,信号发生器在 Arduino 上。
我还包括沟通机制。正如您所看到的,两个数据收集器被硬连线到数据聚合器,因此通过有线连接(在这种情况下是 I2C)传递收集的数据。另一个数据收集器使用 XBee (ZigBee 协议),因为水温传感器距离数据聚合器太远(数据聚合器必须靠近房屋才能通过 WiFi 将数据传输到数据库服务器)。最后,请注意,我使用数据库服务器节点来托管 web 服务器,以便通过 web 页面呈现数据。
我建议使用这样的图来帮助您规划您的 IOT 网络,甚至是您的解决方案的功能。你真的不能有太多的设计文档。
陈述
当您规划包含允许用户查看数据或控制可操作设备的功能的 IOT 解决方案时,您还有另一个层面的放置要考虑。
如果设备是平板电脑或电脑,这可能相当简单。在这种情况下,您只需将其连接到与数据库服务器和可操作设备相同的网络。但是,如果演示特性支持云,您可能需要一个中间节点来将您的内部节点与云隔离开来。这可能是放置在内部防火墙之外的设备,它与数据库服务器通信并将数据传输到云服务。
简而言之,一定要考虑如何将数据库中的数据呈现给用户,这样您就不会以一个设计良好的数据收集机制而告终,因为它缺少可视化功能。虽然这听起来显而易见,但有时专注于节点放置、数据收集和数据库设计可能会影响数据的显示方式。
摘要
为您的 IOT 解决方案选择数据存储方式有多种选择。您可以选择将数据存储在云中,不在任何节点上本地存储任何数据。您可以选择将数据存储在本地文件或内存中,构建自己的存储和检索机制。或者,您可以选择使用专用于高效存储和检索 IOT 数据的数据库服务器。
当然,对于本书来说,假设您已经选择或将选择使用数据库服务器来存储您的数据。虽然您仍然可以选择在某些节点上缓存甚至本地保存一份副本,但最终数据库服务器会成为数据的焦点。
在本章中,您研究了一些可用于存储数据的方法。您已经看到了如何在 Arduino 和 Raspberry Pi 上读写文件数据的示例。我还讨论了在您的 IOT 解决方案中部署数据库服务器的好处、注意事项和建议。最后,我讨论了为您的 IOT 解决方案设计节点网络的一些最佳实践。
在下一章中,您将探索转换数据的细节,从处理数据类型到规范化数据,甚至讨论如何处理寻址和聚合。这个讨论将帮助您了解使用 MySQL 数据库系统的更详细的细节。
Footnotes 1
听起来熟悉吗?我在太多的应用中遇到过这种情况。虽然这并不总是可能的,但是一个好的数据存储设计应该是可扩展的。
有时为了更容易阅读的代码而牺牲效率或首选技术。
除了新的 Arduino Yún,它有一个 SD 驱动器和用于连接外部设备的 USB 端口。Yún 和更新的主板肯定会改变 Arduino 世界的游戏规则。
正式归甲骨文所有,但由我独家支持。
https://en.wikipedia.org/wiki/SQL
Arduino 示例的代码行数是它的三倍!
mysqlpump 在服务器版本 5.7.8 及更新版本中可用( http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html
)。
mysqldump 在服务器 5.6 及更早版本中可用( http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
)。
使用 mysqldbexport 和 mysqldbimport ( http://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqldbexport.html
)。
我有更多的实验被一句不经意的“嘿,这是什么?”询问通常涉及设备的误操作或重新定位。