<audio id="audio" title="05 | 系统实例：怎样设计一个简易物联网系统？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/5c/ab/5c990a74a1575444f7d297e1ef5122ab.mp3"></audio>

你好，我是郭朝斌。

通过前几讲的学习，你应该已经熟悉了物联网系统的基本框架，并且知道设备层、网络层和应用层大概是怎么回事儿。不过你现在的理解，可能还停留在盲人摸象的阶段，虽然已经可以说出某些局部的特点，但是还没法儿准确地画出整头大象的样子。

假如现在老板给你布置一个任务，让你设计一个物联网系统，你是胸有成竹，还是手足无措呢？为了让你能够拍着胸脯说“保证完成任务”，今天这一讲，我会教你怎么设计一个简易的物联网系统。

那么，我们拿什么项目来练手呢？我想，还是智能家居比较合适。一方面是因为它跟你的生活关系比较密切，你对它的感知比较强；另一方面，你正好可以在这个基础上完成实战训练。

这也是受到扎克伯格的启发。他在2016年时计划自己动手打造一个 Jarvis 系统（《钢铁侠》中的智能助手贾维斯），能够通过语音/文字控制家里的电器。经过近一年的努力，到年底时他基本完成了这个系统，并且写[文章](https://www.facebook.com/notes/mark-zuckerberg/building-jarvis/10154361492931634)描述了具体的工作（如果你打不开，可以看[这篇](https://www.pingwest.com/a/96883)）。

课程学完之后，你再邀请朋友来家里玩，就可以展示自己亲自动手完成的一套智能家居设备，而且新的奇思妙想也能够随时动手实现出来。

想象一下，到时候你的房间也可以是一座“未来科技城”，你也可以在朋友圈“晒出”像扎克伯格一样的科技作品，这是不是很酷呢？

<img src="https://static001.geekbang.org/resource/image/59/02/59ac9a929823a69eeb7ccf80231a4a02.jpg" alt="">

## 智能家居的发展阶段

要实现一个酷炫的智能家居项目，你就得知道智能家居现在发展到了什么阶段。如果场景设计太超前了，好高骛远，那么最后根本实现不了；而如果场景设计太落后了，都是人家早就玩剩下的，那么也就不酷了。

从自动化程度的角度分析，智能家居的发展可以分为遥控、场景联动和智能化三个阶段。这是一个智能设备和家居控制系统越来越自主，而人的参与越来越少的过程。

1. **遥控**

你可能马上就想到了电视和空调的遥控器。不过，通过 Wi-Fi、BLE 和 ZigBee 等技术手段联网的设备，还可以有多种多样的遥控方式。智能手机上的 App 和手机系统的语音助手，甚至智能音箱，说到底都是遥控的方式。

相信你也注意到了，在遥控阶段，**每次跟设备的交互都需要人的参与**。比如扎克伯格的智能电灯，就需要他通过[语音](https://www.pingwest.com/a/96883)来控制开关。

<img src="https://static001.geekbang.org/resource/image/c7/de/c7364b92e92e6569728cc1ee6ab6d7de.gif" alt="" title="扎克伯格语音控制电灯开关（引自光谱的报道）">

1. **场景联动**

在场景联动阶段，**人只需要参与一次跟设备的交互就行了**。你只要设置好联动的逻辑，包括触发条件和执行动作，后续的多个联网设备就会根据这个逻辑依次运行，实现一定程度的自动化。

扎克伯格在[介绍](https://www.thesun.co.uk/news/2449965/watch-mark-zuckerbergs-incredible-ai-slave-voiced-by-morgan-freeman-can-shoot-his-outfit-from-a-cannon-and-make-his-family-toast-for-breakfast/)中提到，他家的系统可以识别门口摄像头捕捉的人脸图片，然后根据日程和访客列表判断要不要开门，并且通知他本人。这就是控制系统、摄像头、门锁和线上日程系统的联动所实现的功能。

<img src="https://static001.geekbang.org/resource/image/82/b8/820d51b8cf79c328b5d46c442yy512b8.png" alt="" title="扎克伯格的智能家居系统识别访客（引自Margi Murphy的报道）">

1. **智能化**

随着智能家居接入的设备越来越多，它们产生的各类数据越来越多，智能家居自然会发展到智能化的阶段。这时候，**人已经<strong><strong>不需要**</strong>再跟设备**<strong>频繁**</strong>交互了</strong>。家居系统会从你之前的交互中和其他设备收集的数据中学习你的行为模式和喜好，然后控制设备自动处理很多事情，包括提供决策建议。

我还是以扎克伯格的智能家居系统为例。如果他去国会参加听证会那天，他的 [T 恤加农炮](https://www.thesun.co.uk/news/2449965/watch-mark-zuckerbergs-incredible-ai-slave-voiced-by-morgan-freeman-can-shoot-his-outfit-from-a-cannon-and-make-his-family-toast-for-breakfast/)不是射出一件灰色 T 恤衫，而是提醒他“今天适合穿西装打领带出席会议”，那就达到智能化水平了。不过，现在的智能水平还做不到这一点。

<img src="https://static001.geekbang.org/resource/image/90/3d/90a8999992fb26787ec5c79037e4e03d.png" alt="" title="扎克伯格的“T恤加农炮”（引自Margi Murphy的报道）">

所以现在智能家居正处在场景联动阶段，我们已经可以把一些智能产品组合起来，实现一些生活场景的自动化。如果你有兴趣，可以看看[这个视频](https://m.bilibili.com/video/av48582377/)，它比较好地体现了智能家居的发展现状。

## 智能家居产品的设计原则

那么，在目前这个场景联动的阶段，我们要怎么围绕生活场景来设计智能家居产品呢？你只要遵守3个原则就行了：

<li>
**专注单一领域，解决一个问题。**这样问题容易定义，解决方案涉及的技术也就比较少。比如智能照明，解决电灯的联网和开闭功能就可以了。
</li>
<li>
**闭环**，也就是**同时包含传感器、执行器和控制器**。这样设备自身就可以实现一定程度的自动化。比如根据光照自动调节灯光就是一个完整的闭环。
</li>
<li>
**可以实现**。产品不要包含很难实现的需求或者还没有经过验证的技术，不然要么计划很容易搁浅，要么做到最后发现白白浪费了巨大的资源。
</li>

所以，我建议你做这 4 个产品场景：可以手机控制的智能电灯、可以基于光线自动调节的智能电灯、可以语音控制的智能音箱和可以基于环境温湿度和土壤湿度自动浇水的浇花器。它们在市场上都有成熟的产品代表，证明需求是真实存在且可以实现的。

## 智能家居场景的简易物联网系统

确定了要做的产品场景，你离物联网系统的设计又进了一步。现在你需要对这些场景进行拆解，看看它们包含的具体组件是什么，以及这些组件分别属于物联网系统的什么部分。

我以智能电灯为例，给你做一个拆解。

1. **传感器**

为了实现基于光线强度自动调节电灯打开、关闭和亮度的智能电灯，我们需要使用**光照传感器**。

传感器是物联网中的设备感知环境和自身状态的重要组件。在智能家居中，传感器还用于感知温度、湿度、声音、图像、气体等很多信息。比如，智能音箱中的麦克风是一种声音传感器。

1. **执行器**

我们要实现电灯的打开和关闭，也就是控制电路的通断，这时我们需要**继电器**。

继电器这类执行具体控制动作的组件，被称为执行器。除了电气的开闭，执行器也可以完成机械的动作和加热、制冷等功能。比如扎克伯格的系统中，空调系统、面包机和 T 恤加农炮都是执行器的范畴。

1. **控制器**

那给执行器控制命令的组件呢，就是控制器。在智能电灯中，我们使用**NodeMCU 开发板**来作为控制器。

控制器是执行具体应用逻辑的单元。简单理解的话，可以认为控制器基于传感器的数据，执行应用逻辑，然后驱动执行器做出反应。控制器是一个抽象概念，它可能在网关或者边缘计算设备实现，也可能在云端的应用服务器实现。有些复杂的控制逻辑可能会涉及到大数据处理技术或者机器学习算法。

1. **家庭网关**

光照传感器为了省电，我们采用**BLE**（低功耗蓝牙）技术。不过 BLE 设备需要借助桥接设备才能接入互联网，这个桥接设备被称为**家庭网关**。顺便提一句，一般ZigBee设备也需要网关来接入物联网。（需要说明的是，在实践中家庭网关的功能有可能是其他设备来承担，比如电视、台灯等。在我们的设计中，可以使用智能音箱来兼做家庭网关。）

1. **用户界面**

为了控制智能电灯的亮度和开关，我们需要使用**智能手机**或者**智能音箱**来输入执行的命令，同时通过它们来查看电灯的状态信息、设置联动场景。

这些人与设备，或者人与智能家居系统的交互手段就是用户界面。类似的还有电视屏幕、控制面板等。在未来，可能不会有特定的设备作为用户界面，用户界面将无处不在，就像《钢铁侠》里面的场景，你随时可以说话，显示信息悬浮在空中。目前主要的方式还是使用手机，基于语音或者文字来交互。

当我们按照同样的方法，拆解完这4个场景的基本构成组件，智能家居系统的架构图也就清晰了。

<img src="https://static001.geekbang.org/resource/image/e0/0f/e02597f22048a440f208c64cfb49bd0f.jpg" alt="">

你可以看到我们最终将会打造 6 个硬件设备，它们分别是：智能电灯、光照传感器、环境温湿度传感器、土壤湿度传感器、自动浇花器和智能音箱。其中，智能音箱也承担家庭网关的功能。

我把这6个硬件需要的元器件整理到下面的表格中，供你参考。（如有需要，你可以根据[这份文档](https://shimo.im/sheets/D3VVPdwcYRhhQRXh/MODOC)自行采购。）

<img src="https://static001.geekbang.org/resource/image/25/77/252bbccb32byyd03a040501275ee5477.jpg" alt="">

## 简易物联网系统的技术架构图

现在，我们把上面设计的智能家居系统的架构，代入到物联网的三层体系结构中，就得到了它的技术架构图。

<img src="https://static001.geekbang.org/resource/image/77/1b/771fc288a1be173c034cdb4e9cfd8a1b.jpg" alt="">

1. **设备层**

传感器、执行器和控制器三个组件相互配合，构成完整的设备功能。而在智能家居中，通信技术的主流选择是Wi-Fi、BLE（低功耗蓝牙）等。Wi-Fi适合带电设备，BLE适合电池供电的低功耗设备。

1. **网络层**

家庭网关可以让使用BLE技术的设备接入物联网。然后，网关通过 MQTT 协议连接云平台，让这些设备可以和云平台通信。

在智能家居应用中，为了自动发现设备和服务，UPnP 协议和 mDNS协议也经常被使用。在进阶篇第7讲，我会详细讲解组网相关协议。

1. **应用层**

之前的课程中，我提到过云平台是数据存储和数据分析处理的支撑平台。同时，云平台也可以为你的App提供 API 接口，让你可以借助手机远程操控联网设备。

在实战篇，我们将在云平台中，通过 MQTT Broker 来接收温度、湿度等数据，并且开发 Web 服务，通过页面来展示相关数据。

## 小结

接下来，我总结一下这一讲的主要内容。

1. 从自动化程度看，智能家居系统分为遥控、联动控制和智能化三个阶段。目前的智能家居系统已经可以达到场景联动的阶段，而未来需要关注的发展趋势是智能化。
1. 围绕着遥控和联动控制的功能实现，我们设计了4 个产品场景，它们分别是：可以手机控制的智能电灯、可以基于光线自动调节的智能电灯、可以语音控制的智能音箱和可以基于环境温湿度和土壤湿度自动浇水的浇花器。
1. 在4个产品场景的实现过程中，你需要打造6个硬件设备，它们分别是：智能电灯、光照传感器、环境温湿度传感器、土壤湿度传感器、自动浇花器和智能音箱（兼做家庭网关）。
1. 通过梳理整个简易智能家居系统，我们可以发现智能家居包括传感器、执行器、控制器、家庭网关和用户界面这几个构成部分，你可以结合我们设计的简易系统来了解各部分的功能。

从简易智能家居系统的设计过程，你应该也可以总结出物联网系统设计的一般过程。<br>
首先，我们需要调查、分析具体领域的知识和发展趋势；<br>
接着，确定我们要试图提供解决方案的应用场景；<br>
然后，设计应用场景中的具体产品，包括产品的功能、使用的通信技术和网络协议等；<br>
最后，我们可以总结解决方案的各个部分，并且与物联网三层体系结构做对应，检视解决方案是否完整、是否合理。

除了以上这些，我还想跟你说，这一讲提到的树莓派（Raspberry Pi）开发板、NodeMCU 开发板都是主流的开源硬件。开源硬件的流行对智能硬件的发展有着巨大的推进作用。如果你是一个电子发烧友（DIY），那么现在你很容易就可以基于开源硬件组合出一套简易的联网设备，也许你已经做了类似的尝试。

所以我觉得，如果只是单纯指导你一步步地实现这套系统，那么意义还不够大，也不是我的出发点。我会在后面的章节中结合物联网的具体场景（智能家居）来把物联网的相关技术和体系结构讲解清楚。

我很欣赏一句话，叫**“知行合一”**。当你学习一个新东西的时候，如果只是看别人做、听别人说，那都是输入，并不会很好地内化为自己的东西。所以第一步输入之后，第二步要认真思考，最后你要做输出，把你学习到的东西讲给别人就是一种输出。

而且编程和物联网开发最好的输出方式还是要动手实践。在动手的过程中你可以真正把底层原理和核心知识理解透彻，内化成你自己的知识，从而在工作中更加得心应手。这就是我们要在实战篇达到的目的。

## 思考题

最后，我给你留一个思考题吧。

在简易物联网系统中，我们设计了智能电灯和自动浇花器等应用场景。扎克伯格的实践中也有一些很酷的应用。你还可以为自己的家居环境想到什么场景和应用呢？另外，在本讲中，我拆解了智能电灯的构成组件，你可以使用同样的方法，拆解一下自动浇花器的组件吗？

欢迎在留言区写一写你的奇思妙想，和我一起交流一下。也欢迎你将这个课程分享给你的朋友一起交流学习。
