JavaScript物联网:架构与数据处理(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-26 00:32:52

点击下载

作者:李知周

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

JavaScript物联网:架构与数据处理

JavaScript物联网:架构与数据处理试读:

前言

为什么要写这本书

Atwood定律:任何能够用JavaScript实现的应用系统,最终都必将用JavaScript实现。——Jeff Atwood

探索与开拓知识的新疆域是我一直以来秉持的生活与学习理念,而撰写这本书正是这样的理念的一次实践。我一直深信着Atwood定律并身体力行贯彻实践。JavaScript是一门古老的语言,它诞生于互联网的第一入口浏览器之上,几乎伴随着整个互联网的发展,见证了互联网的崛起过程。在这个物联网的新时代,这门互联网时代的语言却老树开新花,在新时代发挥新的活力。正是秉持着这样的信念,我希望为JavaScript的新征程贡献自己的一份微薄力量,这也是我撰写本书的第一动力。

作为互联网技术的进化,物联网开发技术体系并非孤立的技术栈,而是向上承接了互联网技术、大数据技术乃至人工智能技术,向下统领了嵌入式硬件开发,是承上启下的全栈开发技术。作为正在快速进化中的新互联网技术,我们并不能预测物联网技术栈最终的样子:统一的开发语言是JavaScript还是Python,抑或其他编程语言;HTTP、WebSocket、MQTT、CoAP等协议谁会是最后的赢家。随着物联网的不断进化,我们甚至可能无法预测其最终形态,也许物联网根本就没有一个最终的形态。但是,我们仍然可以看清物联网发展的轨迹与必然趋势,那就是:开发技术栈必然向全栈化方向发展,数据流动必然向无边界化方向发展。互联网的核心是数据的流动,数据的流动为我们带来了难以想象的价值,而物联网又将这一核心推到了更高的高度,打破了互联网原有的边界,让千千万万节点设备中的数据流动了起来。

全栈化的开发正是顺应了这种趋势,打破了在开发层面中那些阻碍数据流动的技术壁垒,将芯片、嵌入式、网络、大数据、人工智能、信息安全等诸多领域纳入物联网的全栈开发中,实现端到端的完整解决方案,真正实现数据的流动并让数据为人类服务,让我们以更高效、更智慧的方式来发掘数据的价值,实现数据的价值。“未来已来,只是尚未流行”,凯文·凯利在《必然》中如是说。技术发展的必然不是说我们重复多少次,最终都会发展出同样的结果,而是科技在本质上的一种偏好,这种偏好使得它有朝某种特定方向发展的趋势,这种技术向某一个方向发展的趋势是一个必然。对于物联网来说,最终使用哪种编程语言或者哪种协议不是必然,而真正的必然是物联网开发的全栈化以及数据流动的无边界化。而本书目的之一就是让读者,也包括笔者自己在物联网进化的潮流中遨游,学习技术并洞察一二趋势,在它们还未流行前占得先机。在物联网进化的洪流中,为其发展贡献自己的一份力量,不至于惶恐。

选择JavaScript作为物联网系统的开发语言也是一种减法策略,力求释放少的潜能,取得多的成就。对于物联网节点来说,开发不仅有性能的限制,也有成本的限制。由于性能的限制,大家无法将体验做得和iPhone一样好;因成本的限制,我们总是希望以最少的开发成本及最简单的系统设计完成尽可能多的任务。这导致在设计过程中需不断做减法:通过使用手机进行控制,免去了输入/输出设备;通过使用基于JavaScript的HTML5,免去了开发与安装手机App;通过使用Node.js作为Web服务器,免去了兼容性问题。这样可以专注于节点的控制、图形化与用户体验等,因此使用JavaScript做全栈开发,无论在开发成本还是在性能上都是目前最优的物联网解决方案。而利用NPM等大量现有开源JavaScript资源,可以非常容易而快速地搭建起一整套物联网系统。本书另一个目的是希望使用JavaScript来降低读者学习物联网开发的难度,读者无须掌握多种不同的开发语言,就能够利用JavaScript快速开发出完整的物联网应用,实现从0到1、从理论到实践的跨越。本书特色

正如Linus的名言:“Talk is cheep.Show me the code.”一样,本书最重要的,也是首要的一个特点就是注重实践,特别是代码实践。

从实践层面上讲,笔者不仅在前面的理论章节中给出了大量使用JavaScript进行物联网开发与系统设计实践的例子,而且在实战篇中以真实项目的完整设计作为内容的主体,将项目的重要细节呈现,以飨读者。笔者力求最大化地使用JavaScript,在书中一切适合使用JavaScript来进行分析与描述的部分,一律使用JavaScript来实现。

从技术层面上讲,本书首次介绍了许多仍然处于实验阶段的新技术,其中包括基于Node.js的一些大数据处理技术(如Skale),以及基于JavaScript的深度学习技术(如Keras.js)。

在写作本书时,笔者对国内外使用JavaScript开发的现状做了充分的调研,力求让读者以一个最前沿的视角来学习JavaScript物联网开发,与此同时介绍了许多在Node.js中已经非常成熟的设计技术,包括像微服务这种已经融入当前JavaScript主流设计中的关键技术。笔者所介绍的这些技术也许有一天会落伍或者被淘汰甚至被抛弃,但是通过介绍这些技术能够让读者在技术层面上开阔眼界或博采众长,以不变应万变应对物联网这个仍然方兴未艾、飞速发展的科学技术。

从开源精神层面上讲,笔者为本书专门建立了一个“GitHub组织”:

https://github.com/JavaScriptIOT。其中包括大量笔者收集到的可以应用到物联网的JavaScript项目,以供读者参考借鉴与使用。GitHub项目https://github.com/JavaScriptIOT/book包括本书所有程序的源代码,欢迎读者朋友访问下载。同时笔者还开发与维护着物联网开源项目https://github.com/OpenFPGAduino/OpenFPGAduino,其中毫无保留地开源了从硬件到软件的所有设计,里面包含了笔者在物联网领域的开源实践与设想,这也是写作本书的技术实现与案例研究平台,为读者提供了继续研究的载体,是本书的另一大特色。欢迎读者一起参与开发开源物联网项目,为开源物联网添砖加瓦。

从适合读者阅读和掌握知识的结构安排上讲,本书分为基础篇、数据篇和实战篇。在基础篇,我们会对物联网进行基础性介绍,并补充Node.js的基础知识。数据篇会详细解析物联网在不同层次的设计与数据相关的处理。而在实战篇中,我们会结合前面所学的知识从物联网实际需求出发,动手设计我们自己的物联网系统,从而做到理论联系实际,通过实践加强理论理解。读者对象

·物联网嵌入式软件工程师

·物联网全栈软件工程师

·物联网大数据工程师

·物联网数据分析科学家

·物联网安全工程师

·物联网运维工程师

·物联网系统架构师

·其他对物联网技术感兴趣的人员如何阅读本书

本书分为3篇,共11章。

第一篇(第1章和第2章)是基础篇,主要讲解JavaScript物联网设计最基础的内容,包括以下内容。

第1章:讨论了物联网进化的方向及物联网的核心数据的流动,顺应这一必然趋势,物联网必须要采用端到端的解决方案,而JavaScript是实现这一方案的很好选择。

第2章:详细介绍了Node.js基础及其中的一些关键技术,包括V8引擎、非阻塞式I/O、事件循环及包管理,同时介绍了目前流行的Node.js微服务架构设计。

第二篇是数据篇(第3~7章),主要讲解使用JavaScript完成围绕着物联网的数据收集、存储、处理、分析、展示交互与安全在内的与物联网数据相关的方方面面,包括以下内容。

第3章:详细介绍了如何使用Node.js来完成嵌入式系统的设计,如何使用JavaScript完成实时物联网数据收集,以及如何使用物联网协议实现与互联网的互连互通。

第4章:详细介绍了如何使用JavaScript结合大数据技术来实现对呈指数增长的物联网数据进行存储与处理,并为物联网实时数据处理构建了基于Lambda与Kappa的大数据处理架构。

第5章:详细介绍了如何使用JavaScript来构建基于人工智能与机器学习的物联网数据分析平台,其中着重介绍了目前比较热门的深度学习算法。

第6章:详细介绍了如何使用JavaScript来构物联网人机交互界面。其中将重点放在了基于HTML5的Hybrid App框架上,实现了一次开发、部署不同设备的功能。

第7章:详细介绍了物联网的安全问题、挑战与解决思路,以及在使用JavaScript过程中如何加强安全。

第三篇是实战篇(第8~11章),以笔者真实的物联网项目为核心,抽丝剥茧为读者讲述如何在实际的项目应用JavaScript实现物联网的开发,包括以下内容。

第8章:以笔者的开源物联网硬件OpenFPGAduino为中心,详细介绍了使用JavaScript进行物联网网关节点设计的细节,特别是如何使用Node.js完成物联网的开发。

第9章:主要介绍了如何在物联网开发中使用云服务。其中以云软件开发环境及云开发编译部署环境为例,为读者展示了如何利用云技术来提高物联网开发效率、降低开发难度。

第10章:以物联网生物芯片实验测试系统为实例,介绍了在完整的项目中如何根据需求设计物联网的每一个子系统,并将这些子系统组合成一个完整的物联网项目。

第11章:以物联网大数据系统的设计为中心,重点介绍了如何构建物联网数据的汇总与分析系统,包括构建基于物联网日志的异常检测及网络安全防护系统。

为方便读者阅读理解本书,这里绘制了本书的各篇章的技术关系与结构,本书的结构就像一张神经网络,每一篇分别代表不同的神经网络层,每一章代表一个神经元,每一个神经元之间的箭头代表了技术的层次关系。

通过阅读本书,读者不仅能从零基础开始学习物联网相关知识与技术,而且可以通过实例学习掌握如何搭建和开发完整的物联网系统;本书使用JavaScript作为统一的编程语言,降低了读者在学习物联网过程中的难度,避免了不断学习各种编程语言而无法集中精力探索物联网本质的困扰,也为未来实际应用与开发提供参考。

读者可以依照章节顺序阅读所有章节,也可以根据结构关系图选择阅读连接数量最多的重点章节。比如,第1章与第11章这样贯穿全书的章节,以及第2、3、6章这样被很多章节用到的技术,之后阅读剩余的章节。

读者也可以首先阅读基础篇的所有章节,然后直接阅读实战篇,以对物联网的开发有一个具体形象的认识;再回过头来阅读数据篇的理论部分以加强对知识的理解。

如果你是一名初学者而且没有任何JavaScript经验,请在阅读本书之前,先学习一些JavaScript基础理论与知识,《JavaScript权威指南》会是一个不错的选择。勘误和支持

由于笔者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果你发现书中或程序中的错误或者有更多宝贵意见,欢迎在GitHub项目的问题区https://github.com/JavaScriptIOT/book/issues交流,我会尽量在线上为读者提供最满意的解答。同时,你也可以通过邮箱lizhizhou1983@gmail.com联系到我,期待得到你们的真挚反馈,在技术之路上互勉共进,让我们一起来探索物联网技术的新疆域。致谢

感谢上海浦北信息科技有限公司,作为公司的创始人之一,本书中的很多实践内容都来自于公司草创之初的探索与尝试。感谢我的共同创始人李旭为开源物联网平台OpenFPGAduino的硬件设计与研发做出的贡献,以及朱壮晖为硬件生产所做出的努力。感谢大家一起完成了物联网生物芯片实验测试系统项目。

感谢中国科学院微系统与信息技术研究所对大学生创业的支持,并提供了生物芯片实验测试系统项目。感谢微小卫星工程中心的朱振才导师与张锐导师在我博士学习期间提供的宽松的科研学习环境,使我能够在专心于统计机器学习研究的同时还能有时间关注物联网研究。

感谢曹友盛博士、丁俊勇、刘锋、李俊周、颜苑等多位老领导、学界大师、业界领袖的关怀与指导。感谢ITPUB、CSDN、开源中国与GitHub社区的各位技术专家们的博客文章以及开源项目,每次阅读必有所获,本书也多处引用了这些博客开源项目中的观点、思想与方法。特别致谢

最后,我要特别感谢我的太太慧慧和女儿婷婷,我为写作这本书,牺牲了很多陪伴她们的时间,但也正因为有了她们的付出与支持,我才能坚持写下去。

同时,感谢我的父母及岳父、岳母,特别是我的岳母,不遗余力地帮助我们照顾女儿,有了你们的帮助和支持,我才有时间和精力去完成写作工作。

谨以此书献给我最亲爱的家人,以及众多热爱物联网技术的朋友们,愿我们大家的努力能使婷婷这样的下一代拥有一个精彩纷呈的物联网世界!李知周第一篇 基础篇

·第1章 物联网系统基础

·第2章 Node.js基础第1章物联网系统基础

物联网(Internet of Things,IoT)是一个基于互联网、传统电信网等信息承载体,让所有能行使独立功能的普通物体实现互联互通的网络。物联网可以是无线网络,也可以是有线网络,由于网络连接的多样性设备可以使用Wi-Fi、蓝牙、Zigbee、RFID、有线等连接方式,使得每个人周围的可连接设备可以达到1000~5000个,所以一个完整的物联网可能要包含500M~1000M个物体。在物联网上,每个人都可以应用电子标签将真实的物体上网联结,并查出它们的具体位置。通过物联网,可以用中心计算机对机器、设备、人员进行集中管理、控制,也可以对家庭设备、汽车进行遥控,以及搜索位置、防止物品被盗等,类似自动化操控系统。同时通过收集这些小事的数据,最后可以聚集成大数据,实现包括重新设计道路以减少车祸、都市更新、灾害预测与犯罪防治、流行病控制等社会的重大变革。

物联网将现实世界数位化,应用范围十分广泛。物联网拉近分散的信息,整合物与物的数字信息,其应用领域主要包括以下方面:运输和物流领域、健康医疗领域范围、智能环境(家庭、办公、工厂)领域、个人和社会领域等,具有十分广阔的市场和应用前景。图1-1给出了物联网应用的不同方向,包括家庭安防、健康可穿戴、地理位置定位、无人机等。图1-1 物联网

在本章中,我们将从不同的几个方面研究物联网发展的趋势,包括:通过研究万物互联与互联网进化论讨论物联对互联网的影响;通过对物联网的核心数据流动的讨论明确数据才是整个网络的核心价值;通过对端到端物联网解决方案的研究提出JavaScript是一个不错的实现物联网全栈开发的选择;通过讨论物联网大数据与机器学习的趋势,完成物联网数据流动的整个生命周期,实现从数据到价值的转换。

物联网不仅在空间的广度上深刻影响现在的互联网技术及计算机技术的发展,而且在其发展过程中将会在时间的深度上深刻影响整个网络的未来发展与进化方向。在广度上,我们将其称为万物互联;在深度上,我们将其称为互联网进化。1.1 万物互联与互联网进化论

思科公司首先提出了万物互联的概念,并将其定义为将人、程序、数据和事物结合一起使得网络连接变得更加相关、更有价值。万物互联将信息转化为行动,给企业、个人和国家创造新的功能,并带来更加丰富的体验和前所未有的经济发展机遇。万物互联的提出极大地推动物联网的发展,其提出了物与数据、人与数据、人与人等多种网络连接形态与方式,将物联网扩展到更广阔的空间上。在《互联网进化论》中,刘峰老师提出,未来互联网的进化方向是向人类大脑的方向前进,如图1-2所示,而这一进化的结果正是实现万物互联的物联网。物联网通过数据将各种传感器设备、生产设备和人联系起来,就如同人类大脑将感官和思维联系起来一样。在物联网的整个概念里,数据流是整个网络的核心,整个物联网就是数据流动的网络,物联网所要完成的工作是将数据的收集、传输、存储、处理、分析与展示连接在一起。图1-2 互联网进化论1.2 物联网的核心数据的流动

正如1.1节所说物联网的整个概念里,数据流是整个网络核心中的核心,物联网的架构设计必然要围绕着数据来进行,为了使数据能在互联网上毫无阻碍地流动,实现万物互联,作为互联网进化形态的物联网在网络架构上的发展方向必然是实现网络的对称化以及网络的IP化。1.2.1 现代物联网的对称性

物联网起源于无线传感网,无线传感网的最初目的是使用无线技术将传感器连接起来,实现数据的采集与传输。现代物联网不仅包括前端的数据采集,中间的传输还包括了后端的处理与可视化,如果站在网络的传输线上向两边看会发现一个有趣的事实:不论是前端的网络数据收集,还是后端的数据处理与展示,它们都拥有相似的结构,或者说它们是对称的,如图1-3所示。图1-3 物联网的对称性

在物联网的前端,我们需要海量的节点来采集有用的数据,然后通过网关汇总进入骨干网络。在网络后端中,利用云计算与大数据技术,我们会使用大量的计算节点来进行数据存储与计算,提供对所采集数据的分析与可视化能力。有了这样的对称性,物联网技术可以参照和借鉴许多现有的云计算与大数据技术。利用这样的对称性,我们可以将物联网做进一步的简化,将数据处理、展示和数据采集看成同等的节点,所有网络上的节点统一起来既能做数据处理,又能做数据收集,还能做数据处理与展示,那么整个现代互联网就是一个大物联网。举例来说,我们每天都在用手机收集着海量数据,并用移动网络传输着数据,最后又用手机处理这些数据。1.2.2 现代物联网的IP化

利用网络的对称性,我们很容易将目前在云计算与大数据里应用成熟的技术直接迁移到物联网应用中,这是非常自然的可行选择。通过选择这样的技术演进路线,不仅能够有效利用现有的,已经通过验证的解决方案,而且相应的研发成本也是最低的。而只有实现物联网的IP化改造才能实现以上目的,因为现有的大数据技术和云计算技术全部是架构在TCP/IP之上的。一系列耳熟能详的技术包括JSON数据格式、RESTful API、消息总线、P2P、MapReduce、Master选举、虚拟化等都可以从云计算、大数据那里搬到物联网上。举例来说,我们可以利用虚拟化技术,将任何一个传感器虚拟化为一个独立的物联网节点,这样一些原本不能传输IP协议的网络或总线也能被IP化,实现通过IP地址进行全球访问,真正消除数据孤岛,实现数据的流动。即使那些无法使用IP技术的物联网,为了数据互联互通也会通过网关将网络内的数据转发到IP网络上。1.3 端到端物联网解决方案

现代物联网的IP化使得物联网的各个组成部分之间的关系越来越紧密,而这种紧密的关系不仅会促使技术的流动,将应用于云的技术迁移到物联网中,而且会促使物联网中数据的流动。对于物联网来说,只有数据流动起来克服数据的孤岛才能实现真正的数据向价值的转换。为实现物联网数据无障碍的流动,需要为物联网提供端到端的解决方案,而不是将物联网划分成不同的部分,每个部分使用不同的技术栈与技术解决方案。从目前来看,实现物联网端到端的解决方案的最佳选择是JavaScript。1.3.1 JavaScript老树新花

JavaScript是一门古老的语言,它是网景公司于1995年发布的一个集成于浏览器的脚本语言。最初JavaScript语言是紧紧依附于浏览器的一门编程语言,其用途是控制浏览器行为,响应用户行为,控制网页动画。在其发布后的十多年间,JavaScript未有任何改变,即使JavaScript被设计出来时是一门图灵完备语言。JavaScript命运的改变出现在2009年,Node.js的出现改变了JavaScript依赖浏览器的束缚,它将libevent与Google的高性能JavaScript执行引擎V8相结合,第一次实现了JavaScript脱离浏览器直接运行,从此JavaScript真正成为一门编程语言。正是由于Node.js的横空出世,JavaScript从为前端浏览器编程变为后端服务器编程,也就催生了全栈开发的概念。全栈开发就是能够同时进行网页前端与服务器后端的开发,而Node.js使得前后端能够统一使用JavaScript进行开发,这大大提高了开发的效率。由于JavaScript是天生为网络而设计的,包括回调等特性特别适合网络编程环境,所以使用JavaScript所编写的网络应用具有非常好的性能。而到了现在,同样的事情将再一次发生在互联网的扩展——物联网上,JavaScript作为一门语言,很好地适配了物联网的需求场景,为实现物联网环境的全栈开发提供了有力的支持。对于物联网节点来说,开发不仅有性能的限制,也有成本的限制。由于性能的限制,大家无法将体验做得和iPhone一样好;由于成本的限制,我们总是希望以最少的开发成本及最简单的系统设计完成尽可能多的任务。这导致在设计过程中需不断做“减法”。通过使用手机进行控制,免去了输入/输出设备;通过使用基于JavaScript的技术栈,无论在开发成本还是在性能上都是目前最优的物联网解决方案。而利用NPM的大量现有开源JavaScript,可以非常容易而快速地搭建起一整套利用JavaScript来实现的端到端的物联网解决方案与系统。1.3.2 物联网节点JavaScript开发

在网络中,HTTP协议与JSON数据格式,特别是RESTful API无疑具有支配地位,各种云服务、数据传输都基于这些协议来进行。而JavaScript为HTTP和JSON提供了最好的支持,当物联网系统采用JavaScript开发时,天然地对接了互联网上海量的云服务与云资源,包括云存储、云计算、云服务等一系列资源都可以被JavaScript程序方便地调用,就像你在手机端访问各种云服务一样。特别是微服务架构在服务器端的兴起,用JavaScript编写的每一个物联网节点都可以作为一个大系统中的微服务,通过RESTful API接口提供自己的服务。

在设计模式上,JavaScript的回调与事件循环等基于事件驱动的编程模型非常适合物联网。在物联网环境下,环境在不断变化,物联网节点要不断对环境的变动做出响应,换句话说,物联网系统通常是I/O密集型的系统,回调与事件循环高效地完成了密集I/O操作这项工作,而事件响应式编程相比于多进程与多线程编程在内存的使用上又非常高效,而这也是物联网系统所需要的,通常物联网系统都是资源受限系统,内存与CPU的频率都非常有限。在物联网节点底层开发中通常采用中断响应模式,在CPU中由中断控制器来检查中断信号的出现,并在中断出现后控制CPU执行特定程序片段,这一执行模式和JavaScript的回调是一致的,很容易使用JavaScript回调机制来实现硬件的中断响应。

通常物联网节点的部署特点决定了对其进行回收维护通常是成本非常高昂甚至是不可接受的。而物联网节点要不断应对新的环境与应用的需求,所以在物联网节点的开发中,远程部署与更新是非常重要和必要的一个功能。JavaScript本来就是设计来实现从服务器端向客户端部署的一门语言,天然具有在网络上实现远程部署的属性,实现远程部署就像你用浏览器下载JavaScript脚本并运行一样简单。JavaScript的热部署也是一个比较热门的研究领域,通过热部署,物联网节点可以实现在运行过程中远程添加新功能,远程修正bug。

前面讲了使用JavaScript来做物联网开发的好处,那么也有必要讲一下JavaScript在物联网应用中的相对于Web应用中的不同以及需要注意的误区。

首先,面临实时性问题考验。嵌入式系统的物联网网关首要面对的问题就是实时性问题,例如,各种电机的控制、一些电压信号的采集都是有实时性要求的。实时性要求是指在规定的固定时间间隔内完成所需工作。由于JavaScript的内存管理使用垃圾回收机制,所以必然存在由于垃圾回收而导致应用中断执行的情况,那么有可能在一些情况下垃圾回收会造成实时性要求遭到破坏。所以在设计JavaScript物联网实时程序时需要考虑内存垃圾数据时间对实时性的影响。当然,也可以采用另一个设计模式,即使用C语言编写的单独线程来实现实时任务,利用JavaScript的单线程特点,这种设计模式也不会在嵌入式系统中占用过多的资源,毕竟JavaScript本来就是一种嵌入在浏览器里的语言。

其次,由于物联网网关是需要长期运行的设备,相对于Web端需要有更高的可靠性与稳定性,所以单元测试与集成测试是必需的,而且需要使用代码分析工具保证代码没有任何内存及文件句柄的泄漏,即使在垃圾回收环境下,内存泄漏也是存在的,而在嵌入式系统中,由于内存特别有限,内存泄漏问题特别容易暴露出来。好在服务器端JavaScript的开发应用已经有很长一段时间了,可以从服务器开发里借鉴不少工具。

用JavaScript来做物联网节点开发是比较新的领域,我们不能光说不做或者一切从零开始。为了实现物联网节点的设计,我们需要有各种参考设计以及各种开发框架,这不仅可以节约我们大量的开发时间,也为我们应用JavaScript做物联网指明了方向,接下来就来列出一些笔者收集与设计的物联网JavaScript开源项目。

1)OpenFPGAduino(https://github.com/OpenFPGAduino/OpenFPGAduino)是笔者设计的基于Node.js与FPGA的开源物联网软硬件开发平台,与Arduino等快速原型开发平台相类似。该平台不仅基于Node.js提供了网络交互能力,特别设计用于开发的网络IDE以及类似于树莓派的Linux软件开发系统,方便安装各种Linux通用软件,而且通过FPGA提供了可编程的兼容Arduino外围接口,用于与丰富的物联网传感器进行连接。

2)Iot.js(https://github.com/Samsung/iotjs)是三星公司开发的嵌入式JavaScript执行环境,能够在几百KB内存的嵌入式系统上,不依靠操作系统实现完整的网络与JavaScript支持。JavaScript解释引擎采用JerryScript(https://github.com/jerryscript-project/jerryscript),事件循环采用libtuv。可以说Iot.js是Node.js的嵌入式版本,其API为Node.js提供了最大限度的兼容。

3)Esprunio(https://github.com/espruino/Espruino)是为微控制开发的嵌入式JavaScript解释引擎,提供了最小化的配置,可以在内存低至8KB的微控制器上执行JavaScript语言。

4)Cyclon(https://github.com/hybridgroup/cylon)是使用JavaScript来做机器人控制的项目,通过提供各种外设的驱动,并支持市面上主要的开发板,不需要写一句C语言就能开发和组装一个机器人。

以上就是笔者收集到的物联网节点JavaScript开发的一些重要的平台与解决方案,其中包括了笔者自己开发的OpenFPGAduino,我们将在第3章详细学习其中的一些技术,并在第8、9章详细分析、学习与OpenFPGAduino有关的详细内容。1.3.3 物联网客户端JavaScript开发

在浏览器端,JavaScript在数据的可视化方面早已处于支配地位,作为现在统一浏览器且几乎唯一可在所有浏览器上运行的编程语言,JavaScript不仅可以给用户提供交互式环境,而且可以做出非常漂亮的图表与动画效果。包括两维的图表曲线以及三维的虚拟空间,都可以通过使用JavaScript控制浏览器来实现,现在许多基于浏览器的VR环境也可以通过JavaScript来进行开发。使用JavaScript来做物联网的数据展示是再合适不过了。

当今互联网世界,JavaScript已经是一种全栈网络开发语言。特别是HTML5兴起以后,JavaScript已开始不仅仅局限在浏览器端,而是将触手伸到了网络的方方面面,不仅包括物联网端,而且包括手机的移动端和传统的PC端。由于HTML5是为浏览器设计的,其最大的优势是跨平台性,HTML5很好地发挥了JavaScript的跨平台特点,真正做到一次开发,实现从手机上的iOS、Android到电脑的Windows、MacOS、Linux的跨平台运行。虽然目前JavaScript在性能上仍然无法与原生开发应用相匹敌,但是仅使用JavaScript来开发各种应用程序,开发成本与响应速度上是其他开发方式所无法比拟的。特别是在物联网开发环境中,很多应用是轻量级的,对性能没有特别高的要求,但是需要依照不同的物联网环境进行不同的定制与适配。而JavaScript来做这样的数据展示工作是再合适不过了。根据网络的对称性特点,甚至完全可以用JavaScript来实现物联网节点上的数据展示工作,一如我们用手机来进行数据展示与控制。

和物联网节点开发一样,为完成物联网的客户端开发,我们也需要一些库与框架来支持,以加速我们的开发,好在客户端方面的库非常丰富,下面列出一些比较适合物联网应用的库。

1)D3(https://github.com/d3/d3)是基于SVG的矢量图操作工具。通过使用JavaScript,D3将数据以矢量图形式展示出来,提供了任意伸缩的能力。在HTML5出现之前,D3是二维可视化的底层标准。通常许多绘制图表与数据可视化工具都使用D3作为底层驱动引擎,在其之上提供用户友好的API接口。Nvd3(https://github.com/novus/nvd3)就是在D3的基础上构建的用于快速数据展示的库,有了Nvd3,用户就不需要做非常底层的D3开发而是将注意力集中在数据展示上。

2)Chart.js(https://github.com/chartjs/Chart.js)不同于Nvd3所基于的SVG技术,Chart.js采用目前最为流行的、基于HTML5的技术来绘制数据可视化图,提供了折线图、饼图、雷达图等一系列可视化类型,并且支持动态过渡效果。

3)Plotly.js(https://github.com/plotly/plotly.js)是一款基于JavaScript的数据展示与绘图工具,与其他数据可视化工具一样,其能够绘制饼图、折线图等多种2D与3D的数据图。但是它在仅仅提供JavaScript数据展示库的基础上又进了一步,提供了基于云的数据展示方式。通过Node.js调用服务器端代码,就可以在Plotly.js所提供的云端服务器上构建出可交互的展示网页,满足了那些精简型物联网节点的数据展示需要。

4)Three.js(https://github.com/mrdoob/three.js)是基于WebGL的JavaScript 3D绘图工具。通过WebGL扩展,JavaScript语言实现了直接驱动底层显卡进行3D绘图。Three.js在3D图像基础上还提供了VR支持,可以方便地使用JavaScript来实现VR数据展示。

5)ECharts(https://github.com/ecomfe/echarts)是由百度开发的数据可视化库。ECharts是一个纯JavaScript的图表库,可以流畅地运行在PC和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11、Chrome、Firefox、Safari等),底层依赖轻量级的Canvas类库ZRender以及WebGL,提供直观、生动、可交互、可高度个性化定制的数据可视化2D与3D图表。ECharts3更是加入了更多丰富的交互功能以及更多的可视化效果,并且对移动端做了深度的优化。

6)Video.js(https://github.com/videojs/video.js)是一个通用的在网页上嵌入视频播放器的JS库,Video.js自动检测浏览器对HTML5的支持情况,如果不支持HTML5则自动使用Flash播放器。视频播放在物联网特别是监控系统中已经越来越重要,使用网页来播放物联网视频是非常方便、自然的选择。

7)Ionic(https://github.com/driftyco/ionic)是基于Angular.js的移动端跨平台开发环境,能够在一个统一的框架下使用JavaScript、HTML、CSS,同时可开发iOS、Android、Window Phone程序,并根据环境的不同自动适配UI。

8)Electron(https://github.com/electron/electron)是基于Node.js与Chrome的跨平台桌面开发环境。Electron通过将浏览器内核和后台Node.js服务进行打包,实现了一个使用JavaScript的全栈开发环境,无须任何修改就能够将程序部署到Windows、MacOS、Linux平台上。

9)Nw(https://github.com/nwjs/nw.js)是轻量级的JavaScript的跨平台桌面开发环境,它实现了在HTML代码中直接调用Node.js的各种API函数,提供了一个平滑自然的桌面应用开发环境,隐藏了客户端服务器编程的细节。

10)Kibana(https://github.com/elastic/kibana)是为ElasticSearch(https://github.com/elastic/elasticsearch)设计的开源分析和可视化平台。用户可以使用Kibana来搜索,查看存储在ElasticSearch索引中的数据并与之交互。通过Kibana,可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。Kibana让海量数据变得更容易理解。简单的基于浏览器的界面让用户可以快速创建并分享动态的仪表板,用以实时修改ElasticSearch请求。ElasticSearch是一个基于大数据技术的分布式搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。ElasticSearch基于Lucene开发,现在是使用最广的开源搜索引擎之一,Wikipedia、StackOverflow、GitHub等都基于ElasticSearch来构建它们的搜索引擎。

以上是笔者所收集到的基于JavaScript数据展示与交互的库与解决方案。我们将在第6章详细讲解上面的一些技术,并深入分析其中的一些源代码与使用方法。1.4 物联网大数据的必然趋势

既然数据的流动是物联网的核心,那么存储处理这些数据的技术就是物联网的必然趋势,这也就不难理解为什么大数据是物联网的必然趋势。现在大数据技术方兴未艾,各种大数据技术层出不穷,在这些大数据技术中,最基本的思想是MapReduce思想,这一思想将不同运算拆解为Map与Reduce,然后将这些Map与Reduce的任务在集群当中最大限度地并行执行。而实现MapReduce模式编程的最重要一点就是支持函数式编程,又称为Lambda编程。所有的Map与Reduce操作都接受函数式编程作为参数。由于大数据的成功导致了函数式编程的复兴,由此也导致了多数现代编程语言(包括C++与Java)在其新版本中支持函数式编程。JavaScript在它诞生的那一天起就支持函数式编程,其回调函数就是一种函数式编程模式,自然而然,支持Map与Reduce也不是什么困难的事情,因此使用JavaScript做物联网大数据分析与处理是非常容易且高效的。在大数据的数据表示与存储阶段,JSON数据格式受到青睐,这是因为,JSON不仅其格式简单、处理方便,而且其大量应用于HTTP网络传输,现有互联网上的基础设施与云服务都采用JSON格式,要以这些设施作为数据源,处理JSON格式是必不可少的。使用JavaScript来处理大数据,使用JSON作为数据传输与存储格式是非常自然的,毕竟JSON就是JavaScript代码片段。本质上来说,一切基于RESTful API设计的接口几乎都是JavaScript友好的。另外,为了提高效率,有时会使用JSON的二进制形式BSON。

由于物联网的对称性,物联网的节点既可以是数据的收集者,也可以是数据的发起者。若使用JavaScript来处理物联网大数据,那么每个物联网数据节点也能够发起大数据的处理,并利用后台大数据环境做出决策并响应环境的变化。这样利用JavaScript将物联网前端和后端数据处理直接无缝地连接起来,例如实现了大数据的实时处理与响应的Lambda架构,同时完成了批处理与实时处理架构的统一。甚至可以用JavaScript设计基于Node.js的处理框架,把物联网的节点当作大数据节点来统一物联网中数据的处理与传输。

既然使用大数据技术是物联网的必然趋势,那么自然也应该有不少能够将大数据技术应用到物联网的开源项目。这些开源项目既是大数据必然趋势的证明,也是学习物联网与大数据相结合的基础。以下是笔者收集的一些JavaScript相关大数据开源项目,我们将在第4章接触到下面的一些项目,并有选择地详细学习其中一些重要的部分。

1)skale(https://github.com/skale-me/skale-engine)是一个完全使用JavaScript开发,采用Node.js作为执行环境的分布式数据处理系统,具有比Spark更快的性能。

2)MQTT是为物联网设计的轻量级通信协议,基于TCP/IP适用于低带宽不可靠环境,开销非常小,支持发布–订阅模式,是一种非常高效的通信协议。MQTT.js(https://github.com/mqttjs/MQTT.js)是Node.js的MQTT通信模块,实现了Node.js收发MQTT数据。

3)Kafka(https://kafka.apache.org)是大数据分布式消息总线,提供了对海量消息的持久化能力,通过将接收到的数据直接持久化到硬盘,提供了稳定的数据吞吐量以及高可用性。KafkaRest(https://github.com/confluentinc/kafka-rest)模块为Kafka消息总线提供了RESTful API的支持,无论是使用浏览器还是Node.js都可以方便地使用JavaScript来收发消息。

4)elasticsearch-js(https://github.com/elastic/elasticsearch-js)是ElasticSearch的JavaScript客户端。通过elasticsearch-js,用户可以非常便捷地操作分布式搜索和分析引擎ElasticSearch。

5)Eclair.js(https://github.com/EclairJS/eclairjs-node)是基于Node.js的Spark大数据处理平台前端。通过Eclair.js,可以使用JavaScript来操作基于内存处理的大数据分析平台Spark,并通过Spark内置的调度器实现在整个集群上调度资源,以最大并行度执行JavaScript的算法。目前,Spark是最主流和发展最快的大数据处理平台,同时Spark平台还支持大量的机器学习算法。1.5 物联网机器学习的必然趋势

有了基本的大数据处理,机器学习作为现在最热门的处理大数据的手段是不得不提的,而为了能让存储在大数据平台上的数据价值获得增值,使用机器学习来对大数据进行分析是必然的选择,这也就不难理解物联网的必然趋势是使用机器学习了。由于JavaScript在浏览器端的支配地位,使用JavaScript做机器学习的尝试也非常多,有了JavaScript的机器学习库,就可以非常简单地在浏览器上运行一些机器学习的小程序,同样,也可以将这些机器学习库运行在Node.js上,使得物联网节点也具有一定的机器学习能力及数据处理能力。更近一步,WebGL是目前在JavaScript领域比较热门的领域,WebGL支持JavaScript语言直接对显卡进行操作,利用这一特性,机器学习算法特别是深度学习算法就能够利用显卡进行加速。当然使用JavaScript直接控制深度/机器学习集群也是一个不错的选择,使用JavaScript进行深度学习编程也有其优势,这主要是JavaScript在数据可视化方面的成功,能够很方便地可视化机器学习的学习过程与结果,方便以远程方式来控制机器学习集群,而RESTful API已经成为云计算领域事实上的标准,通过JavaScript来访问数据中心的机器学习资源也非常方便。

既然使用机器学习来为物联网进行数据处理是必然趋势,那么显然我们也可以找到大量的这类开源软件,并将这些软件应用到物联网应用中。下面就是笔者收集到的适合物联网,特别是JavaScript开发物联网的库与平台,这些库与平台为我们在物联网应用机器学习提供了可行的方向。

1)machine_learning(https://github.com/junku901/machine_learning)是完全用JavaScript写成的机器学习库,既可以运行在浏览器中,也可以运行在Node.js中。machine_learning提供了许多通用的开箱可用的机器学习算法,包括逻辑回归、多层感知器、支持向量机、K阶均值聚类决策树等常用的机器学习算法。

2)Shaman(https://github.com/luccastera/shaman)是完全用JavaScript写成的机器学习库,既可以运行在浏览器中,也可以运行在Node.js中。Shaman提供了一些简单的机器学习算法。包括线性回归、K阶均值聚类。

3)Convnet.js(https://github.com/karpathy/convnetjs)是完全用JavaScript写成的神经网络机器学习库,可以运行在浏览器或Node.js中。Convnet.js提供了许多有趣的例子,在浏览器上实现了对神经网络学习过程的可视动画呈现与交互模式,对理解神经网络机器学习有非常好的帮助。

4)Synaptic(https://github.com/cazala/synaptic)也是一个完全使用JavaScript写成的神经网络学习库,同样可以运行在浏览器与

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载