二、物联网架构
1、物联网的作用
实现物联网时,物联网服务大体上发挥着两个作用。
第一是把从设备收到的数据保存到数据库,并对采集的数据进行分析。
第二是向设备发送指令和信息。本章将会为大家介绍如何构建物联网服务,以及用于实现物联网的重要要素。
2、整体结构
物联网大体上有3 个构成要素,如图2.1 所示。一个是设备,另一个是网关,再来就是服务器。
网关指的是能连接多台设备,并具备直接连接到互联网的功能的机器和软件(图2.2)。如今,市面上有很多种网关。在多数情况下,网关凭借Linux 操作系统来运行。
选择网关时有几项重要的标准,我们来一起看一下。
接口
第一重要的是用于连接网关和设备的接口。网关的接口决定了能连接的设备,因此重点在于选择一个适配设备的接口。
有线连接方式包括串行通信和USB 连接。串行通信中经常用的是一种叫作D-SUB 9 针(pin)的连接器,而USB 连接中用到的USB 连接器则种类繁多。
无线连接中用的接口是蓝牙和Wi-Fi(IEEE 802.11)。此外,还有采用920 MHz 频段的Zigbee 标准,以及各制造商们的专属协议。
网络接口
我们用以太网或是Wi-Fi、3G/LTE/5G 来连接外部网络
硬件
相对于一般计算机而言,网关在CPU 和内存这些硬件的性能方面比较受限。我们需要确定让网关做哪些事情,也需要考虑到它的硬件性能。
软件
使用Linux 操作系统来运行网关,还有一个叫作BusyBox 的软件,它运行起来占用内存少,集成了标准的Linux 命令工具。
电源
网关基本上都是使用AC 适配器当电源的,有些网关本身会搭载电池
3、服务器的结构
在功能方面,物联网服务大体上可分为3 个部分,为前端部分、处理部分,以及数据库部分(图2.3)
首先,前端部分包括数据接收服务器和数据发送服务器。数据接收服务器接收设备和网关发来的数据,转交给后续的处理部分。数据发送服务器则刚好相反,它负责把从处理服务器接收到的内容发送给设备。
通常情况下,Web 服务的前端部分只接受HTTP 协议。而物联网服务的前端部分则需要根据连接设备的不同来匹配HTTP 以外的协议。使用者需要考虑到协议的实时性和通信的轻量化,以及能否以服务器为起点发送数据
处理部分负责处理从前端部分接收到的数据。这里的“处理”指的是分解数据、存储数据、分析数据、生成发给设备的通知内容,等等。数据处理包括批处理和流处理等,批处理即把数据存入数据库之后一并进行处理,而流处理是逐次处理从前端部分收到的数据
最后是数据库。这里的数据库不只会用到关系数据库,还会用到NoSQL 数据库。当然,使用者需要根据想存储的数据和想使用的方法来选择数据库。
4、网关的作用
网关是一台用于把不能直接连接到互联网的设备转发连接到互联网的设备。再往细了说,网关是由3 种功能构成的(图2.4)。
这3 种功能分别是连接设备功能、数据处理功能和向服务器发送数据的功能。
连接设备
设备和网关是通过各种各样的接口连接的。当通过传感器终端连接时,多数情况下是传感器单方面持续向服务器发送数据。根据设备不同,也存在设备申请从外部获取数据时,服务器向设备发送数据的情况,这时就需要通过网关申请数据。
生成要发送的数据
接下来把从设备接收到的数据转化成能发送给服务器的格式。在表示从设备发送到网关的数据时,也有把4 位二进制数(如二进制数据和BCD 码)替换成一位十进制数数据来表示的(图2.5)。这样的数据不会被直接发给服务器,而是在网关处被转化成数值数据和字符串的格式。
还存在下面这种情况:不把每台设备发来的数据直接发送给服务器,而是将大量数据整合在一起再发送给服务器。这么做有以下两个原因。
第一,通过整合数据能减少数据的附加信息,减少数据量。第二,通过一并发送数据能减轻访问物联网服务时对服务器造成的负担。
发送数据给服务器
向物联网服务发送数据。此时,需要根据服务器来决定发送数据的时间间隔和发送数据的协议。另外,为了能从物联网的服务器接收消息,还得事先准备好这种功能。
5、接收服务器的作用
数据接收服务器就跟它的字面意思一样,负责接收从设备发送来的数据。它在设备和系统之间起着桥梁作用。有很多种方法可以从设备把数据发送给服务器,其中具有代表性的包括以下两种方法。
准备一个使用了HTTP协议的Web API来访问设备(如通常的Web系统)
执行语音和视频的实时通信(如WebSocket 和WebRTC)
除此之外,还出现了一种名为MQTT 的、专门针对物联网的新型通信协议。
6、HTTP 协议
HTTP 协议提供的是最大众化且最简易的方法。使用一般的Web 框架就可以制作数据接收服务器。设备用HTTP 的GET 方法和POST 方法访问服务器,把数据存入请求参数和BODY 并发送(图2.6)。
7、WebSocket
WebSocket 是一种通信协议,用于在互联网上实现套接字通信。它实现了Web 浏览器和Web 服务器间的数据双向连续传输。
就HTTP 协议而言,每次发送数据都必须生成发送数据用的通信路径及连接。此外,一般情况下,客户端没有发出申请就不能进行通信。
相对而言,WebSocket 就不同了。只要一开始根据客户端发出的连接申请确立了连接,就能持续用同一个连接传输数据。另外,只要确立了连接,就算客户端没有发出申请,服务器也能给客户端发送数据(图2.7)。
在发送语音数据等连续的数据,以及发生与服务器的相互交换时,就能使用WebSocket 了。WebSocket 自身只提供服务器与客户端的数据交换,因此需要使用者另外决定在应用层上使用的协议。
8、MQTT
MQTT(MQ Telemetry Transport,消息队列遥测传输)是近年来出现的一种新型协议,物联网领域会将其作为标准协议。
MQTT 是一种能实现一对多通信(人们称之为发布或订阅型)的协议。它由3 种功能构成,分别是中介(broker)、发布者(publisher)和订阅者(subscriber)(图2.8)。
中介承担着转发MQTT 通信的服务器的作用。
MQTT 交换的消息都附带“主题”地址,各个客户端把这个“主题”视为收信地址,对其执行传输消息的操作。形象地比喻一下,中介就是接收邮件的邮箱。
首先,中介在等待各个客户端对其进行连接。订阅者连接中介,把自己想订阅的主题名称告诉中介。这就叫作订阅。
然后发布者连接中介,以主题为收信地址发送消息。这就是发布。
发布者一发布主题,中介就会把消息传递给订阅了该主题的订阅者。
像这样借助于中介的发布/ 订阅型通信,MQTT 就能实现物联网服务与多台设备之间的通信。另外,MQTT 还实现了轻量型协议。因此它还能在网络带宽低、可靠性低的环境下运行;又因为消息小、协议机制简单,所以在硬件资源(设备、CPU 和内存等)受限的条件下也能运行,可以说是为物联网量身定做的协议。MQTT 本身还具备特殊的机制
QoS
QoSA 是Quality of Service(服务质量)的简称。这个词在网络领域表示的是通信线路的品质保证
MQTT 里存在3 个等级的QoS。“发布者和中介之间”以及“中介和订阅者之间”都分别定义了不同的QoS 等级,以异步的方式运行。
Retain
如果发布者事先发布了带有Retain 标志的消息,那么订阅者就能在订阅后马上收到消息。
当发布者发布了带有Retain 标志的消息时,中介会把消息传递给订阅了主题的订阅者,同时保存带有Retain 标志的最新的消息。此时,若别的订阅者订阅了主题,就能马上收到带有Retain 标志的新消息(图2.14)。
Will
Will 有“遗言”的意思。由于中介的I/O 错误或网络故障等情况,发布者可能会突然从中介断开,Will 就是专门针对于这种情况的一个机构,它用于定义中介向订阅者发送的消息(图2.15)。
发布者在连接中介时会用到CONNECT(连接)消息,连接时对其指定Will 标志、要发送的消息以及QoS。这样一来,如果连接意外断开,Will 消息就会被传递给订阅者。另外,还有一个标志叫作WillRetain。通过指定这个标志,就能跟前面说的Retain 达到同样的效果,即在中介处保存消息。
当发布者使用DISCONNECT(断开连接)消息明确表明连接已断开时,Will 消息就不会被发送给订阅者。
Clean session
Clean session 用于指定中介是否保留了订阅者的已订阅状态。用CONNECT 消息连接时,订阅者把Clean session 标志设定为0 或1。0是保留session,1 是不保留session。
9、 数据格式
前面我们围绕用于接收数据的通信过程,即协议进行了讲解。事实上,数据就是通过协议来进行交换的。当然,就如我们前文所说,这条规则在物联网的世界里也是不变的。数据要经过协议进行交换,而数据2.3 接收数据41的格式也很重要。通过Web 协议来使用的数据格式中,具有代表性的包括XML 和JSON(图2.17)。
图像、语音、视频数据的处理“传感器数据、文本数据”和“图像、语音、视频”的数据格式差别很大。拿图像、语音、视频来说,一条数据之巨大远远超过传感器数据,而且这些数据是二进制数据,很难转换成字符串,所以就很难用前面介绍的XML 和JSON 格式对它们进行处理。用HTTP 发送图像数据时,可以用XML 或JSON 格式记录拍摄时间和设备的信息,用multi-part/form-data 格式来发送图像数据。然而,换成语音和视频时,就是一种时间上连续的数据。因此,我们在发送语音和视频数据时需要下一番工夫。例如,需要把语音和视频分割成一个个小文件来发送。在用HTTP 协议进行这项操作时,每次发送一个小数据都会生成一个会话。这样一来就能通过有效应用WebSocket 等协议来减轻给物联网服务造成的负担了。这种情况下,使用者或许需要使用MessagePack,或是定义一个专门用于处理二进制的格式。再或者,还能以用物联网服务进行语音和数据分析为前提,只在设备处提取用于分析的特征并发送,而不是把所有数据一并进行发送。大家在试图实现包含语音和视频数据的服务时,不妨考虑一下本专栏的思路。
10、处理服务器的作用
处理服务器就是处理接收到的数据的地方。可以归纳成以下4 种:数据分析、数据加工、数据保存以及向设备发出指令(图2.20)。
11、 批处理
批处理的方法是隔一段时间就分批处理一次积攒的数据。一般情况下是先把数据存入数据库里,隔一段时间就从数据库获取数据,执行处理。
12、Apache Hadoop
Apache Hadoop 是一个对大规模数据进行分布式处理的开源框架。Hadoop 有一种叫作MapReduce 的机制,用来高效处理数据。MapReduce是一种专门用于在分布式环境下高效处理数据的机制,它基本由Map、Shuffle、Reduce 这3 种处理构成(图2.21)。
Apache Spark
Apache Spark 也和Hadoop 一样,是一个分布式处理大规模数据的开源框架。Spark 用一种叫作RDD(Resilient Distributed Dataset,弹性分布数据集)的数据结构来处理数据(图2.22)。
13、流处理
批处理是把数据攒起来,一次性进行处理的方法。相对而言,流处理是不保存数据,按照到达处理服务器的顺序对数据依次进行处理。
举个例子,假设有个系统,这个系统会对道路上行驶的车辆的当前位置和车辆雨刷的运转情况进行搜集。
仅凭搜集那些雨刷正在运转的车辆的当前位置,就能够实时确定哪片地区正在下雨。此时,使用者可能想保存下过雨的地区的数据,这时候只要保存处理结果就好,所以原来的传感器数据可以丢掉不要,流处理正适用于这种情况。用流处理平台就能实现流处理。
流处理和批处理一样,也准备了框架。在这里就给大家介绍一下Apache Spark 和Apache Storm 这两个框架。
Spark Streaming
Spark Streaming 是作为Apache Spark(在“批处理”部分介绍过)的库被公开的。通过Spark Streaming,就能够把Apache Spark 拿到流处理中来使用(图2.23)。
Apache Storm
Apache Storm 是用于实现流处理的框架,结构如图2.24 所示。
14、数据库的作用
数据库的作用是保存并灵活运用数据(图2.25)。除此之外,其作用还包括从保存的数据中找出与所指定条件相符的数据。另外,数据库还能把多条数据连在一起,把它们作为一个数据取出。
15、数据库的种类和特征
关系数据库
关系数据库是人们用得最普遍的数据库。如图2.25 所示,关系数据库具备一种叫作表格的表格型数据结构,其用途在于存储数据库,使用者用SQL 语言来对其执行数据的提取、插入以及删除
键值存储
键值存储属于NoSQL 数据库的一种。NoSQL 是一种不使用SQL的数据库的统称。键值存储,就是把一种叫作“值”(value)的数据值,和能够一对一特定“值”的“键”(key)的集合保存在一起。
文档型数据库
文档型数据库和键值存储一样,都属于NoSQL 数据库的一种。文档型数据库能以XML 和JSON 这种结构化文档的格式保存数据。特别是近年来,有一种叫作MongoDB 的文档型数据库很受欢迎,它以JSON 的格式保存数据(图2.29)。
16、 发送服务器的作用
发送服务器的目的在于向设备发送数据并控制设备。发送服务器可以使用2.3 节介绍过的HTTP、WebSocket、MQTT 协议和数据格式。
一种是通过设备申请来发送数据的同步传输;另一种是由发送服务器在任意时间发送数据的异步传输。那么,就用HTTP、WebSocket、MQTT 协议来看看如何实现同步和异步传输。
17、使用HTTP 发送数据
要实现数据发送,HTTP 是最简单的方法。在这个方法里,发送服务器是等待接收HTTP 请求的Web 服务器。设备向这台服务器申请发送数据,作为响应,服务器把数据发给设备(图2.30)。
使用者需要定期从设备执行轮询连接。采用此方法的原因主要有以下两个。
原因一:无法确定唯一地址,例如无法给设备设定全局IP 地址等。这种情况下,发送服务器就不知道应该把数据发送给哪台设备了。
原因二:考虑到设备频繁断电和移动线路的传输费用。此时,设备没有持续连接网络。即使设备已经连接过网络,但只要没有持续连接,那么,即使发送服务器执行了发送数据的操作,也发不到设备那里去(图2.31)。
18、使用WebSocket 发送数据
使用WebSocket 时,需要用设备连接发送服务器,并确立WebSocket连接。只要建立了一次WebSocket 连接,就能实现从发送服务器和客户端发送数据。
19、使用MQTT 发送数据
前文介绍了HTTP 和WebSocket,它们采用的方法都是由设备访问发送服务器。就这些方法而言,只要客户端没有发出申请,数据就不会被发送。当然使用者也可以在设备上建立HTTP 和WebSocket 协议,由服务器来连接设备。不过,一旦增加了设备,服务器想管理所有设备就相当困难了。
针对这点,我们来试着看一下这种服务器:它灵活运用MQTT,并且发挥了发布/ 订阅模型的优点。使用MQTT 时的发送服务器如图2.32所示。
首先设备作为订阅者,向MQTT 中介进行订阅。然后,发送服务器则是发布者,同样向中介进行发布。这样一来,发送服务器只需要把确定的数据加在主题上发送就行了,发送服务器和设备都不需要知道彼此的地址。只要知道中介的地址,就能够实现通信。一旦订阅者断开,中介就会负责在断开时发送通知,并在重新连接时再次发送数据。