描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787121290534
★运用目前的主流技术,将不同的领域联通
★循序渐进,一步一步搭建一个完整的物联网系统
★作者是物流网领域“全栈”工程师
★清晰展现了实际物联网系统设计和实现思路
序
很久之前读过一本关于芯片技术的书籍,在书的前言中作者讲述了一个故事。大意是这位教授在某次讲座中说到:“以后芯片的数量肯定是现在的几十倍,到时候我们都会享受到各种芯片强大的计算能力。”
这时一位听众当场起来反驳他道:“难道这栋大厦也会安装几个芯片吗?”随后引来哄堂大笑。
十年后当这位教授再次来到这栋大厦开讲座时,这里已经安装了不止几十个芯片。每个门侧都有一个门禁芯片,走廊里面各种传感芯片负责感应温度变化来检测火情等。
反观现在,如果我们说“以后电视、冰箱、空调甚至菜刀、锅碗、窗户都可以上网”,也一定会迎来不少人的嘲笑。但是我们依然有理由坚信——这些正在慢慢成为现实。
上过大学的人都有感触,自行车、饭卡、女朋友,三者其一如果没有弄丢过,那么你的大学是不完整的。当手机不知道放在哪了,我们可以用朋友的手机拨通这个号码,这样就可以根据来电声音找到手机。但是当钥匙不知道放哪了,除了翻箱倒柜地找之外,貌似没有更好的办法了。如果钥匙也能够接入网络的话,那么我们就可以轻松地定位钥匙于千里之外。
互联网的发展飞速地改变着世界,也改变着我们。而细看互联网的发展你会发现,之前我们使用互联网检索信息,这时的互联网连接的是“人与信息”,可以广义地称之为“人与物”。随着QQ、微信、人人网等社交网站的兴起,互联网连接的是“人与人”。而下一个互联网的发展方向则是连接“物与物”——我们称之为物联网。
小时候我们总会幻想有一个哈利?波特那样的魔法世界,或者西游记那样的神话世界,而长大后我们则会畅想钢铁侠那样的科幻世界。
下班后当你拖着疲惫的身体坐在地铁上,拿出手机更新自己的状态为下班路上,这时电饭煲会自动开启,里面的米饭进入蒸煮状态,窗户自动关闭,而空调自动打开并根据室内温度调整到适合的温度……不过霸气的当然还是每天早上,你睁开朦胧睡眼,大喊一声“要有光”,于是整个屋子都亮了。
虽然如此便捷,但是你是一个保守派,于是你并没有把root权限给它们,凡是都要亲自做决定,这时打开E-mail将是你忙的时候。
冰箱给你发来2封邮件,“牛奶不够了,我已经查询了各大商城和附近超市,建议从家乐福订购打折促销的纯牛奶”,“提示:发现您的各项饮食指标不平衡,所摄取的食物中维生素C的含量偏低,是否购买半斤芹菜。”
床发来1封邮件,“近七天睡眠质量图表如下……”
就连菜刀都发来了1封邮件:“我该磨了。”
而这一切天方夜谭似的故事正在工程师们的智慧和努力下成为现实。本书就讲述了如何设计并构建一个完善的物联网系统。
初在网上了解Phodal是那篇在GitHub连击300天的文章,按活跃度来讲Phodal应该是国内活跃的开源贡献者了。
当作者Phodal告诉我,他的书要出版了,让我写个序。我初以为是Growth增长全栈,当他告诉我是关于物联网的时候,确实有些吃惊。当我再重读Phodal 的《编程之路》时发现,他不仅仅是一名前端加后端的全栈工程师,更是一位软件加硬件的全能工程师。
去年Phodal曾向我问Flarum接口API的情况,当时我正在国内为Flarum布道,遂给他介绍了一下Flarum的源码、接口、文档,以及中文社区的建设情况。没过几天Phodal告诉我,他用Growth为Flarum做了一个全平台的客户端——iOS、Android、WinPhone、Windows、Mac、其他。但愿有一天我家的微波炉也可以在Flarum论坛发帖。
Phodal来写这本物联网的书,那么注定这本书将是一本科普与实战相结合的进阶读物。里面不会有太多的名词概念的解释,更多的是如何设计,如何实现。
如果你是一名创客、极客,那么这本书很适合你。
Just enjoy it.
justjavac
Flarum中国社区创始人
2016年5月,天津
前 言
在开始的时候,人们使用CGI来开发动态网页。在那个时候,人们也使用CGI来开发一些联网应用。早先及现有的物联网应用使用Web技术作为基础的技术,接着人们开始将一些不错的协议使用在物联网中,如MQTT。又有一些组织在制定一些协议,如CoAP。同时越来越多的国家和组织在出台自己的标准。
幸运的是,这些技术都是依据现有的技术发展而来的。技术在过去的几十年里发生了快速的变化,但是它们的本质是解决问题。而问题并没有发生快速的变化——还是一样的问题,只是我们有了更多可用的解决方案。
本书目标
本书不是一本详细介绍物联网系统的书籍,也不会和国内的一些教程一样主要集中于射频、ZigBee、WiFi、蓝牙等。我相信这些知识你已经在其他书中学到过了,而这些书籍更多的是侧重于硬件层级的构建,没有从系统级别、架构级别对系统进行设计。设计这样一个完整的系统,则是本书的核心。本书旨在教会用户如何去设计的思想,以及如何打造物联网系统的过程。至于系统底层硬件的实现细节则需要用户去把握。
本书遵循循序渐进的思想,从设计一个极其简单的物联网系统,再到基于以互联网为基础的物联网系统,后打造了一个基于物联网协议的物联网系统。在这个过程中我们还将教会读者打造物联网的相关应用——手机APP、温度趋势、网页端控制等。
由于设计这个物联网系统本身有太多的知识点,并且涉及方方面面的知识,本书将尽可能地向读者推荐一些扩展阅读资料,并且建议读者多多实践。同时,由于章节间是一步步加深的关系,如果你在这其中遇到什么问题可以及时与作者联系。
目标读者:对物联网感兴趣的创客、极客、程序员、设计师;对物联网感兴趣的大学、中学师生;想自己动手设计完整物联网的相关从业人员。
为什么是JavaScript
在思考着用哪门语言来编写程序的时候,我考虑到了Python、Java、JavaScript。Python是我喜欢的语言,JavaScript是我擅长的语言,Java是我常用(工作)的语言。它们都是非常不错的跨平台语言,它们都有广泛的使用者。
如果考虑将其商业化,我会考虑使用Java语言。Java语言是一门“正统”的语言,即在国内的计算机科学领域,各个院校都将之列为必学语言。除去Java Web的流行带来的需求,Android也增大了对Java语言的需求。由于Java语言是一门编译语言,并且经过二十多年的发展,积累了大量的技术和智慧,使得它相当稳定。因而多数企业都采用这门语言作为其主要语言。尽管Java语法简单,但是语法却比较烦琐、开发效率低,并不利于我们表述。
如果仅仅是考虑学习服务端,我会考虑使用Python来写我们的物联网系统。Python是一门简单、易学、易懂的脚本语言,在科学计算领域非常受欢迎。并且,在书中的一些例子里我会使用Python语言。Python语言富有表现力,可以更容易地让我们将自然语言转换为机器语言。然而,对于读者来说可能存在更多的学习成本。
So,JavaScript有什么优点?无论我们使用Java还是Python语言来开发我们的物联网应用,凡是涉及到网页前端相关的内容,我们都需要JavaScript,这就足够了!
那么,为什么我们不使用JavaScript来完成所有的这些工作呢?它有:
? Node.js框架——流行的JavaScript服务端平台,可以创建Web应用。
? Cordova框架——流行的混合应用框架,可以使用Web技术来开发手机应用(iOS、Android、Windows Phone等)。
这就意味着,我们可以用这门语言完成所有的开发任务——服务端、客户端、移动应用。如果你想,也可以用这门语言完成硬件端的开发。三星推出了可以适用于嵌入式设备的小型JerryScript,谷歌的两名前员工推出了适用于物联网领域的软件平台Smart.js。并且已经有几个开发板,如Tessel 2、Espruino,可以让你使用JavaScript为你的芯片编程。
其他语言
在服务端、客户端和移动应用的例子里,我们会用JavaScript、HTML、CSS来向读者展示其中的原理。在硬件部分,我们会用C/C 语言。在Raspberry Pi上编程的时候,会使用Python。其他部分,如Dashborad和NodeMCU的介绍,会有一些Lua或者Ruby语言的例子。
我们之所以在Raspberry Pi上使用Python语言,不仅仅是因为使用Python语言更容易读懂,而且在这个领域中主要使用的也是Python语言。同理于Dashboard的示例,我们使用了Dashing这个流行的框架,只是因为它更容易上手,并且使用的人较多。这就意味着,在我们遇到问题的时候更容易解决。
我们并不希望这些语言会阻碍你前进。在适当的时候你可以先跳过这一部分——如Dashing,我们展示了如何自己去写类似的界面,使用这个框架只是为了开发更快。随后在真正使用它的时候去深入它们。
为了用而学习是有效率的学习。
本书内容
如下所示,本书分为8个章节和4个附录。
第1章 概览
本章介绍了物联网的历史背景和相关技术,以及其与互联网的关系。
第2章 一个极简的物联网:hello,world
本章以一个文本文件的数据为中心,快速搭建一个极简的物联网原型。其中将向读者展示物联网的一些基础知识。
第3章 分解物联网系统
本章将描述常用的物联网系统架构,并对每一个层级进行详细的描述和介绍。
第4章 基于Web的物联网系统
本章将介绍常用API的模式RESTful,并将带领读者打造基于HTTP协议的物联网系统。
第5章 连接设备
本章将介绍一些容易上手的设备,并将这些设备连接到物联网。不仅可以控制LED,也可以上传传感器数据。
第6章 物联网应用示例
本章将介绍用趋势图来显示传感器的数据,还将展示如何打造一个跨平台的APP来控制物联网设备。同时,还有使用一些当前的云服务来降低开发难度。
第7章 实现超越互联网的物联网
本章将介绍MQTT、CoAP等物联网协议,它们可以帮助我们更好地处理物联网系统中的消息通信
物联网是一个跨学科的新兴领域。物联网应用系统的设计和实现,涉及门类众多的硬件、软件和网络通信知识。无论是技术选型还是具体的实现,设计者可能都需要面对各种各样的挑战和困难。作者运用目前主流的技术,用清晰流畅的表述方式,向读者呈现了物联网系统设计和实现的实际过程。作者是Github上的活跃开发者,是物联网领域的“全栈”工程师,他的设计和实现思路值得本书大多数的读者去学习和借鉴。
——张崇明,《物联网设计:从原型到产品》译者
在如今物联网大热的环境下,很多 APP 工程师不懂硬件,很多硬件工程师不懂云,很多云工程师不懂 APP。物联网是不同技术高速公路的交汇点,这本书充当了立交桥的作用,将不同的领域连通,以实战为主,由浅入深,帮助物联网开发者快速学习物联网这个交叉领域,是一本不错的好书。
——黄锐,NodeMCU 开源项目创始人
近年来物联网的概念逐渐走进人们的视野,基于物联网的应用正在改变着我们的生活,越来越多的人们期待着它在未来的广阔应用前景。这本书给我们打开了物联网的大门,既从整体上呈现了物联网的框架,又深入地剖析了物联网所涉及的各种技术细节,如多种开发板的应用实现和物联网数据传输协议MQTT和CoAP的介绍等。更加难得的是,贯穿整本书的系统架构设计,展现了实际物联网系统的设计和实现思路,使得这本书非常具备实战价值。
——张龙,绿米联创高级软件工程师
5.3 连接传感器
传感器测量的是真实世界的物理量,在测量完后,我们需要将这些数值上传到服务器。这些数据提供给其他控制器或者协调层来处理、分析数据,并发出相应的控制指令。如Oculus 公司在面向开发人员的虚拟现实设备Oculus Rift 中采用了MPU6000六轴陀螺仪传感器——融合3轴陀螺仪、3轴加速器,传感器检测用户头部在空间中的运动情况,获取其用于表示空间旋转状态的四元数与欧拉角,再分析这些数值上传到计算机来控制屏幕中物体的状态。同理,在手机上人们通过倾斜屏幕来玩游戏也是这个原理。
需要注意的是,由于传感器属于电子元件,可能易受外界的一些干扰。这时候会导致测量结果不准确,并且导致一些误差,这可以通过一些算法来解决。因此在选用传感器的时候需要注意一下传感器适合的工作环境,如环境温度,以及其工作范围等一些参数。如DS18B20的测温范围是从 -55℃~ 125℃,固有测温误差1℃。在一些特殊的环境中,这些元件会相互影响,如当这个传感器需要工作在100℃的时候,我们就需要考虑到升级其周边元件。
5.3.1 让API支持上传传感器数据
在那之前,我们的服务器需要能处理数据,这就意味着要先修改一下API。
如果你使用的是SQL数据库,那么你可能需要预先设计好这些用于存储数据的字段。或者,有一个名为sensors的字段,用于存放所有的传感器值。否则,你可能需要经常做数据迁移。而使用NoSQL数据库就不存在这个问题。只要我们以同样的方式存储数据,并以同样的方式读取数据即可。
因此我们需要更新UpdateData方法。原先,我们会从request的body中拿到led的值并判断:
var payload = {user: req.params.user_id};
var data = {user: req.params.user_id, led: false};
if (req.body.led === true) {
data.led = true;
}
现在,我们假设客户端返回的数据是正确的,即不对其数据进行验证。客户端想要存储什么数据就存储什么数据,在读取的时候返回两样的数据。修改完后的代码如下:
function updateData(req, res) {
var userId = req.params.user_id;
var payload = {user: userId};
var data = req.body;
data.user = userId;
db.find(payload, function (results) {
if (results.length > 0) {
db.update(data);
res.send({db: “update”});
} else {
db.insert(data);
res.send({db: “insert”});
}
});
}
直接将req.body的值赋予data,并将userId也保存了下来——为了以后查询和修改。现在,让我们来更新数据试试:
curl -X PUT -d ‘{ “led”: true, “temperature”: 33 }’ -H “Content-Type: application/json” http://localhost:3000/api/14
curl -X PUT -d ‘{ “led”: true, “temperature”: 33, “sun”:13 }’ -H “Content-Type: application/json” http://localhost:3000/api/15
我们创建了两个新的数据,一个是user为14,另一个是user为15,打开MongoDB的客户端图形界面,会有如图5-16所示的内容。
图5-16 MongoDB返回不同Key的结果
第二个对象比个对象多了一个sun的键值。对于物联网应用来说,灵活的数据库结构更容易加速我们的开发过程,并且方便扩展。
在我们完成这部分的扩展之后,就可以接上我们的传感器并开始传输数据。
评论
还没有评论。