物联网设计¶
时间:
著:2013-12
译:2014-12
内容简介:
物联网概览以及联网装置设计原则
因特网原理
原型设计与制作及具体案例介绍
物联网装置涉及的编程技术
物联网产品商业模式
制造阶段可能遇到的问题探讨
本书的主要目标读者是:面对伴随物联网时代而来的硬件创业大潮,想把握其中各种机会的创业者和技术人员;物联网相关领域的从业者;对物联网感兴趣的创客、艺术家和设计师;从事与物联网相关的创新活动的大学和中学师生。
作者简介:
Adrian McEwen
物联网专家,Arduino 官网的 Ethernet 库管理者,
Howduino 物联网课程讲习班的组织者之一,在英国各地教授 Arduino 相关的课程。
Hakim Cassimally
物联网爱好者,科幻小说作家,Perl 语言忠实粉丝。
他还创建了一个斯坦福大学的人工智能分布式学习课程的学习小组。
译者简介:
张崇明
本科及硕士毕业于天津大学精密仪器与光电子工程学院,
博士毕业于复旦大学计算机科学技术学院。
在中兴通讯南京研发中心做过三年通信软件的开发。
目前在上海师范大学信息与机电工程学院从事教学与科研工作。
第一部分 原型阶段¶
第 1 章 物联网概览¶
“早于“物联网”出现的技术术语“普适计算”(ubiquitous computing,它们有个难看的组合词ubicomp),表达了差不多的理念。”
“亚瑟·查理斯·克拉克(Arthur C. Clarke)在著名的“预测三法则”中指出:
任何足够先进的技术与魔法其实别无二致。
——http://en.wikipedia.org/wiki/Clarke’s_three_laws”
各种物品按其应用像技术物品一样做了分类:
1. 保护类物品: 目的是为了确保安全或征服对手
2. 健康类物品:
3. 全知全能类物品: 智能手机
4. 人际联系类物品: 邮政服务、电话和社交网络
5. 轻松移动类物品: 汽车、火车、自行车和飞机
6. 创意表达类物品: 从用木炭绘画,到利用颜料绘画,再到使用计算机绘制图形,或者从鼓到小提琴,再到电子合成器
第 2 章 联网装置的设计原则¶
“物联网源自于20世纪90年代马克·维瑟(Mark Weiser)在施乐公司帕洛阿尔托研究中心(PARC)做的工作。他提出一个假设:当处理器变得足够便宜,以至于可以把它嵌入到各种日常物品中时,会发生什么事情?他的工作围绕这个假设展开,但并没有考虑到网络连接的存在。他创造了“普适计算”这个词来描述这个假设,并且通过他的研究和文章探究普适计算对生活在这样一个环境中的人们意味着什么。”
“宁静技术 (calm technology)物联网的物品不会争相吸引你的注意,而是随时准备在你决定关注它们的时候提供便利的功能和有用的信息。”
“6LoWPAN(www.ietf.org/dyn/wg/charter/6lowpan-charter.html )之类的标准的开发。一个由学者和计算机领域的专业人员等组成的工作组起草了6LoWPAN标准,为的是把下一代因特网协议(IPv6)应用到最简单、最低功耗的有联网能力的传感器上。设计该协议的目的是为数量众多的传感器提供足够多的地址并满足其对低功耗的需求。”
“2012年夏天,开放物联网大会(http://openiotassembly.com/ )的参会者们在开会讨论此类问题时,创造了数据主体 (data subjects)这一术语。”
“在TCP协议规范的一个早期的版本中(RFC761,http://tools.ietf.org/html/rfc761#section-2.10 ),乔恩·波斯特尔(Jon Postel)就提出,“发送时要保守,接收时要开放”(Be conservative in what you do, be liberal in what you accept from others)。从此之后,这个健壮性准则就广为人知,并通常被称为Postel法则 。在设计或构建必须和其他服务交互的任何系统时,牢记Postel法则是有益处的,特别是当与其交互的其他组件并不是由你构建时。”
“因特网正是一种遵循了“小块,松散组合”(small pieces, loosely joined)准则的包含了各种服务与设备的集合。 对服务的设计者来说,这意味着服务的每个组件都应该能做好单一的一件事情,并且不能太依赖它所使用的各个独立组件。要尽可能地让组件更为通用,使其能够为那些也需要相似功能的其他系统服务。这样一种设计,能让我们通过对现有组件进行重用和稍作改动,更方便地构建出在最初设计的系统投入使用时未曾想到的新功能。” “尽量使用已有的标准和协议,而不是自己另搞一套。如果人们可以利用标准库和相关技术与你的系统交互,或者在你的系统之上构建应用,那么即便在代码或硬件的优雅程度或效率方面有一些损失,也是可以接受的。例如,Twitter的设计师们实现搜索功能时,在查询结果的表示方式上,选择包含了一种更适合机器识读的方式,即标准的Atom信息聚合格式(http://tools.ietf.org/html/rfc4287 )。我非常肯定,他们没有料到这些查询结果会被Arduino使用。Arduino能利用这些数据触发Bubblino泡泡机,每当收到一条新的推文时,泡泡机就会吹泡泡。
“松散耦合还有一个深层含义,那就是让装置尽量成为因特网上的一等公民。这里的“一等公民”指的是:你要和因特网上的其他成员保持一致,尽可能使用相同的协议和规范。” “移动Web的演进是一个让人引以为戒的好例子。手机刚可以连接因特网时,人们认为用手机直接访问Web服务器实在太困难了,因此他们开发了一套新协议,即无线应用协议(WAP)。手机可以访问专门为其定制的WAP网站,或者通过WAP/Web网关服务器来访问标准的Web网站。但这要求WAP网站开发者们先学习一套新技术,因此新协议推广得并不顺利。而没有可以访问的WAP网站,用户接纳移动Web的步伐就更缓慢了。”
第 3 章 因特网原理¶
“IP协议(Internet Protocol)的工作原理。数据以分组(packet)的形式从一个装置发送到另一个装置。数据分组包含一个目的地址和一个源地址,两者都符合一种标准化的格式(“协议”)。”
“TCP是因特网上的传输协议,建立在基础的IP协议之上,增加了序号、确认和重传机制。这意味着用TCP可以发送任意长度的消息,并且能在一定程度上保证将信息完整地送达到目的地。”
“MAC即媒体访问控制,是Media Access Control的缩写。MAC地址是一个48位的数字,通常写作6组用冒号分割的十六进制数字,例如:01:23:45:67:89:ab”
第 4 章 原型设计与制作概述¶
“2010年3月,开源硬件研讨会的与会者们开始讨论并制定开源硬件的定义。“2012年6月,开源硬件协会(http://www.oshwa.org )正式成立。
“做原型开发时,你一方面需要构建一个能让你对所做的项目有更多了解的装置,另一方面还要留意,如果你的想法以后能得到印证,到时候怎样把原型转变为产品。在这两者之间,总是要做些权衡。”
第 5 章 嵌入式装置的原型开发¶
电子电路基础¶
电子元器件,我们最好把它们分为两大类来研究:
1. 传感器 :装置借助传感器来获取信息,感知周围环境中的事物。
2. 执行器 :执行器是装置的输出部件,包括电机、灯等,使装置能在外部世界中做一些事情。
模数转换器(ADC)能够测量不断变化的电压。微控制器通常会在其内部集成若干个ADC。这些ADC能把介于0V和一个预定义的最大值(通常是5V或3.3V)之间的电压值依据ADC的精度转换为一个整数。Arduino集成了10比特的ADC,其缺省的测量范围是0V到5V。0V电压对应的转换结果是0,5V电压对应的输出是1023(10比特内存空间能存储的最大值),而介于0V到5V之间的电压值对应的读数大小则与电压值大小有关。1V对应的读数是205,而512这个读数对应的电压是2.5V,以此类推。
“数模转换器(DAC)实现的功能正好和ADC相反。DAC允许根据数值的不同生成大小可变的电压,但它一般不属于微控制器的基本功能。这是因为,一种被称为脉冲宽度调制(PWM)的技术,能通过快速改变数字信号的on/off状态,使输出电压的平均值符合你的期望,这样就能提供和DAC近似的功能。和DAC相比,用来实现PWM的电路更简单。对于某些应用,如调整LED灯亮度,PWM其实是首选。
复杂一些的传感器和模块具备诸如SPI总线和I2C总线之类的接口。这些标准化的机制使得这些模块能够和外界通信,因此传感器、以太网模块或SD卡能够借助此类接口连接到微控制器。
传感器¶
按钮和开关可能算是最简单的传感器了,用户使用它们对输入状态进行控制。
电位计(旋转式和直线滑动式)和旋转编码器则能测量位置的改变。
对环境量进行测量也是比较容易的。光敏电阻(LDR)能对环境光的强度进行测量,热敏电阻和其他类型的温度传感器则能让你知道当前温度。测量湿度和水分含量的传感器很容易构建。
麦克风显然是用来监测声音变化的,但某些类型的麦克风使用的压电元件也能用来测量振动。
距离感测模块是利用从某个物体反射回来的红外或超声波信号进行测距的,此类模块很容易买到,并且其连接方式也和连接电位计一样简单。
执行器¶
灯是一个最简单最有用的执行器,其对应的电路很容易创建,并且能产生明显的输出效果。发光二极管(LED)通常发红光和绿光,但也有白色和其他颜色可选。RGB LED的设置过程有些复杂,但允许把不同亮度的红绿蓝光混合起来,产生任何颜色的光。还有一些更复杂的可视化输出方式,例如用LCD屏幕显示文本或简单的图形。
压电元件除了能对振动做出反应外,也能用来产生振动。因此,可以用压电式蜂鸣器生成简单的声音和音乐。或者,也可以把输出连接到扬声器,合成更复杂的声音。
很多情况下,你可能还需要使用某种器件在真实环境中移动物品。电磁阀可以被用来产生一次快速的推送动作,例如把一个球推离壁架,或者轻轻敲击物体表面发出乐声。
电机是更复杂的执行器。顾名思义,步进电机以“步”为单位改变位置,通常前进一个固定的步数就能使其旋转一周。直流电机在运转的时候,只是依照指定的速度改变位置。这两种类型的电机都可以单向或双向旋转。另外,如果希望电机能转到一个指定的角度,需要使用伺服电机。虽然使用伺服电机能更容易地控制其输出,但它的转动范围比较小,通常不超过180°(而步进电机和直流电机的转动角度则没有限制)。无论是采用上述哪一种类型的电机,你通常是想把它连接到某个装置,以改变其移动范围或把旋转运动转变为直线运动等。
想了解更多有关计算机或微控制器接口方式的内容,浏览一下Arduino Playground上的“硬件接口”页面(http://playground.arduino.cc//Main/InterfacingWithHardware )是一个不错的开端。
原型电路的演进路线¶
嵌入式计算基础¶
微控制器¶
物联网装置采用了更紧密集成、微型化的解决方案——从最基础级别的微控制器,到功能强大的片上系统(SoC,System-on-Chip)模块。这些系统把处理器、RAM和存储器都组合到了一个单独的芯片上,这意味着它们更适用于特定的领域,比PC机上提供类似功能的组件更小巧,并且也更容易融入到用户的设计中。
微控制器是无数传感器和工厂自动化设备的引擎。尽管32位甚至更多位的计算已经出现很久了,但它们是8位计算在这个世界上的最后的堡垒。通常,微控制器只提供几千字节的RAM空间和几万字节的存储空间,尽管在能力方面有各种限制,还是能被用来完成很多事情。
“在微控制器市场,也有很多制造商(Atmel、Microchip、NXP、Texas Instruments等),每个厂商生产针对不同应用的一系列芯片。”
片上系统¶
定位介于低端的微控制器和功能全面的PC机之间的是SoC(例如,BeagleBone和树莓派)。与微控制器类似,这些SoC在一个单独的芯片中整合了处理器和若干外围器件,但它们通常要比微控制器具备更多功能。SoC通常会使用主频在几百兆赫兹以上的处理器,其高端解决方案甚至会使用主频在GHz级别的处理器。SoC上集成的RAM也不会只有几千字节,而是在兆字节的数量级。SoC上也往往不再集成存储单元,而是普遍采用SD卡作为存储单元。
SoC具备更多的能力,这意味着它们需要某种操作系统来管理和分配资源。可以选择的嵌入式操作系统有很多,包括闭源和开源两类。它们或者来自于专门的嵌入式系统提供商,或者来自于大型操作系统厂商,如微软、Linux厂商和社区等。随着处理器变得越来越廉价,Linux等流行度和熟悉度都比较高的操作系统正被日益广泛采用。
选择平台¶
需要考虑的因素:
1. 处理器速度
2. RAM
3. 连网
4. USB
5. 功耗
6. 与传感器和其他电路的接口
7. 物理尺寸和外形
Arduino¶
现在的Arduino项目包括了若干种微控制器板。该项目最早于2005年在意大利北部的伊夫雷亚诞生。一个来自于伊夫雷亚交互设计学院(IDII)的小组想为该学院设计专业的学生们找一块单板来构建交互式项目。
“Wiring是诞生于IDII的另一个项目。2003年夏天,Hernando Barragán创建了一个项目,目的是让用电子装置和硬件做实验的过程变得更加容易。正如该项目的网站(http://wiring.org.co/about.html )Wiring平台提供了一个在硬件之上的抽象层,使得用户不用操心如何把一个GPIO引脚置为高电平等的具体硬件实现,因而可以把精力集中于他们试图探索或解决的问题。”
“在默认情况下,Arduino本身并不支持在其上运行操作系统。只是用引导程序(bootloader)来简化之前介绍的代码推送过程。单板上电后,就开始运行你编译过的代码,直到单板断电(或代码崩溃)为止。 不过,在Arduino上运行操作系统也是可以做到的。通常可以加载一个轻量级实时操作系统(RTOS),例如FreeRTOS/DuinOS。这些操作系统的主要优势在于其内建的多任务处理支持。但对于很多应用场合而言,使用简单的任务分派库就能获得还算不错的结果。”
“通常,Arduino采用的编程语言,是源自于Wiring平台的一个略有修改的C++语言的变种。它包括了若干个库,用来从Arduino板上的I/O引脚读写数据,并能做一些基本的中断处理(以非常底层的方式来实现多任务处理)。”
树莓派¶
“与Arduino不同的是,树莓派设计的初衷更多是用于教育,而不是专门用于物理计算。树莓派基金会的受托人和联合发起人Eben Upton的想法是,构建一台体积小巧且又价格低廉的计算机,可以用来编程和做实验,而不是用来玩游戏。在博通公司(Broadcom)工作的时候,Upton参与了BCM2835 SoC芯片的研发。该芯片配备了一个异常强大的图形处理器(GPU),支持高清视频和快速的图像渲染。该芯片还包含一个主频为700MHz的ARM处理器,这个处理器几乎算是后来加进去的,虽然低功耗、廉价,但还能用。Upton把该芯片描述为“一个嫁接了ARM元素的GPU”(www.gamesindustry.biz/articles/digitalfoundry-inside-raspberry-pi )。”
操作系统:
1. Raspbian
树莓派基金会发布的基于Debian Linux的发行版,是默认的“官方”版本,
也是树莓派用作一般用途时的一种很好选择。
2. Occidentalis
由Adafruit发布的Raspbian的定制版本。
该版本假设你以无外设的方式使用树莓派(不连接键盘和显示器)
这样在默认情况下你就能远程连接到树莓派。
若使用Raspbian,则需要先做一个简单的配置
BeagleBone Black¶
BeagleBone Black是出自BeagleBoard团队的一个最新装置。该团队主要是由TI公司的雇员组成。与树莓派不同,他们的设计重点没有放在创建通用的、适用于教育领域的计算装置上。各种单板在设计的时候就有明确的预期,即它们将被用于物理计算和电子学实验。BeagleBone板的发布时间要早于树莓派
Electric Imp¶
对Imp编程和控制是通过因特网实现的,因此你要做的是利用它内建的无线连接去连接WiFi网络。当然,你还需要告诉它具体的无线接入点,很可能还要提供密码。Electric Imp团队采用一种被称为BlinkUp的巧妙方案解决了这个问题。Imp有一个内建的光敏元件(仍然包含在小巧的SD卡外形之内),每当Imp无法接入WiFi网络时,该光敏元件就会被激活。在智能手机上,可以安装一个Electric Imp应用程序。该程序能通过改变屏幕的颜色,交替显示黑白两种颜色,实现对WiFi连接参数的编码。把手机屏幕面向Imp放置,实际上就可以向这个微控制器发送信号,实现与Imp的通信了。
第 6 章 原型系统的结构设计与制作¶
1. 画草图,迭代和探索
2. 非数字化的方法
雕塑粘土
环氧腻子
Sugru
拼装玩具
硬纸板
纸面泡沫板
挤塑聚苯乙烯板(挤塑板)
3. 激光切割
4. 3D 打印
5. 数控铣削
6. 现有物品的循环再利用
第 7 章 原型系统在线组件的设计¶
“消息队列遥测传输(MQTT,http://mqtt.org )是一种轻量级的消息传输协议,专门针对网络带宽受限或代码的内存占用量受限的应用场景设计而成。它最初由IBM开发,但已作为一个开放的标准发布。它目前有若干种实现,开源和闭源方式的都有,还有很多针对不同语言的库可用。 不同于HTTP采用的客户端-服务器模型,MQTT使用了发布/订阅机制,实现了经由消息代理的消息交换。发送者把消息发布到消息代理上的某个特定主题,而不是把消息发送给一组预定义的接收者。接收者订阅那些它们感兴趣的主题。一旦有新的属于该主题的消息”“息被发布,消息代理会把这个消息发送给所有感兴趣的接收者。这使得实现一对多的消息传输更加容易,并消除存在于HTTP中的客户端和服务器之间的紧密耦合。”
“设计受限应用协议(CoAP)旨在解决适用于HTTP的同类问题。与MQTT-S类似,它也被用于没有TCP的网络。现有的提案包括:在UDP之上和手机短消息系统之上运行CoAP,CoAP与6LoWPAN集成。CoAP吸取了很多HTTP的设计特性,具备一个预定义的连接代理的机制,从而允许从一种协议映射到另一种协议。在写作本书的时候,该协议正经历成为一个建议标准的最后阶段,相关的工作由IETF(因特网工程任务组)的CoRE(Constrained RESTful Environments)工作组负责协调。”
第 8 章 嵌入式编程技术¶
内存类型¶
1. 只读存储器(ROM)
指在芯片的制造阶段,以硬编码的方式存储信息的内存,且在此后只能读取这些信息。
这种内存最不灵活,通常只用来存储可执行程序代码和固定的、从不改变的数据。
最初使用ROM的原因是,它是最廉价的制作内存的方式。
但如今,ROM与闪存芯片相比并无成本优势,
而闪存具有更大的灵活性,所以纯ROM芯片几乎要绝迹了。
2. 闪存是一种半永久性的内存类型
它具备ROM的全部优点,即无需供电也能存储信息,因而内容不会因电路失电而丢失
同时,它没有不可改写内容的缺点。
虽然闪存的内容可被改写的次数是一定的,但在实际使用中很少能达到这种限制。
闪存的读取速度和ROM或RAM比,没有太大差别。
然而,写入闪存时需要几个处理器周期的时间。
这意味着闪存最适合存储你想保持不变的信息,如:
程序的可执行文件本身或已收集到的重要数据。
3. 随机存取存储器(RAM)
通过牺牲持久性换取存取速度的提升。
需要通过供电保持它的内容,但与闪存相比,它的写入速度和读取速度是一致的。
因此,它被用作系统的工作内存,即用来存储正在处理中的数据。
库¶
lwIP :lwIP,即轻量级IP(http://savannah.nongnu.org/projects/lwip/ ),是一个能在低资源条件下运行的完整TCP/IP协议栈。它只需要几万字节的RAM和大约40KB的ROM或闪存。Arduino官方授权的WiFi盾板使用了这个库的一个版本。
uIP :uIP,或micro IP(http://en.wikipedia.org/wiki/UIP_%28micro_IP%29 ),是一个以可实现的最小系统为目标的TCP/IP协议栈。它甚至能在只有几千字节RAM的系统上运行。它是通过不使用任何的缓冲区对传入的分组或发送出去的未经确认的分组进行存储实现这一点的。这意味着TCP层的一些重传逻辑需要由应用程序实现,这使得代码的耦合度增加,变得更复杂。在没有使用标准的以太网盾板和相关库的Arduino系统上,如Nanode板,使用Ethercard在AVR上的移植版本是非常常见的(https://github.com/jcw/ethercard )。
uClibc :uClibc(http://www.uclibc.org/ )是一个面向嵌入式Linux系统的GNU C语言标准库(glibc)。它需要的资源比glibc少得多,几乎可以直接替换掉glibc。把使用的C语言库变更为uClibc时,通常只涉及源代码的重新编译。”
Atomthreads :Atomthreads(http://atomthreads.com/ )是一个用于嵌入式系统的轻量级实时调度器。当代码变得足够复杂,以至于需要在同一时间做几件事情时,可以使用它。
BusyBox :尽管不是一个真正的库,BusyBox(http://www.busybox.net/ )将大量有用的UNIX工具集成到一个单一的可执行文件。它是一个常见的、有用的软件包,能在你的系统上提供一个简单的shell环境和各种命令。