随着JavaScript语言的流行和物联网领域的兴起,我们看到了它们结合的可能性,也发现它特别适合物联网的开发事物。因此,在本文中,笔者将主要介绍以下三个方面:典型的物联网架构及多语言带来的问题;仅使用JavaScript语言的物联网架构;基于JavaScript的物联网不同层次结构的详细解释。那么,让我们来看看典型的物联网架构是什么样的。典型的物联网架构我们甚至可以认为物联网只是互联网的延伸。与传统的C/S架构相比,它多了一个“数据采集层”,我们称之为传感器层、硬件层等,数据的输出不再只是用户,也来自各种联网的设备。物联网不再局限于使用HTTP协议传输数据,它还使用CoAP(约束应用协议)、MQTT(消息队列遥测传输)协议。物联网的四个层次目前物联网的应用需要控制和数据处理。指令由用户逐层下发给终端,直到硬件端被设备执行。数据逐层上报,直至可视化。因此,相对于互联网的架构(如图1和图2所示),起点和终点是不同的:指令的终点和数据的起点变成了硬件层,而不是硬件层。绝对用户层。数据从客户端A发送到服务器,客户端B从服务器获取A的数据,这样就完成了一个循环。物联网架构稍微麻烦一点,多了一层,多了一步。硬件层的微控制器通过直连采集温度、湿度等各种数据。但是,由于单片机的成本和环境条件等因素,可能无法直接连接到互联网。因此,需要连接到一些额外的互联网连接设备才能工作。这些联网的设备将负责处理来自各种硬件设备的数据,并上传到服务器。同时提供无线(如蓝牙、红外、ZigBee)接口作为数据入口。因此,这一层需要具备更好的数据处理能力,并且能够快速开发。因为这些设备主要做协调工作,所以我们习惯称它为“协调层”。使用多种语言的物联网多年前,笔者做过一个简单的物联网系统:使用Python中的Django作为web服务框架,DjangoRESTFramework创建RESTfulAPI;为了使用手机作为控制器,还用Java写了一个Android应用程序;在硬件端使用RaspberryPi作为协调层连接网络,向硬件传输控制信号;硬件端使用Arduino作为控制器,编写代码非常简单;也使用ZigBee模块XBee和I2C作为Media连接不同的Arduino模块;***,还需要在网页上做一个图表来显示实时数据。为此,我们需要使用五种语言:Python、Java、javascript、C、Arduino。而如果我们要编写相应的iOS应用,就需要用到Objective-C。与大多数其他物联网项目一样,这是一场灾难。在做这样一个IoT项目之前,我们需要找六种不同类型的工程师:设计电路图的硬件工程师,懂硬件的嵌入式工程师,写服务端应用的工程师,写web前端的工程师,以及相应的Android和ios工程师。撇开系统本身的协作不谈,要找到这么多工程师也不是一件容易的事。而如果我们能够只使用一种语言,将会大大提高开发效率和开发人员的问题。JavaScript语言下的物联网架构JavaScript语言近年来特别火爆,其火爆的原因有很多,比如:使用WebView开发UI效率更高,从而让WebView无处不在;事件驱动编程模型;JavaScript易于使用(这是优点,也是缺点);因此,React、Unity等框架提供了更多的可能性,让开发者可以使用JavaScript开发游戏、VR应用等。那么,我们可以仅使用JavaScript设计什么样的物联网系统呢?基于纯JavaScript的物联网架构如上所述,几年前很难找到一种语言来完成一个包括客户端和服务器的系统。随着客户端(浏览器、移动设备)性能的提高和Node.js的出现,出现了这样一门语言,即JavaScript。它不仅可以让我们只使用一种语言来降低开发成本,而且可以快速开发这样一个系统。那么,剩下的问题就是,在不同的层次上,如何选择合适的框架来实现快速发展。如图3所示,我们可以看到不同级别的可选JavaScript解决方案。其中,有些纯粹是为了证明JavaScript是可行的;有些可以实现开发效率和运行速度的完美平衡。选择这些解决方案使我们能够实现更快的JavaScriptIoT应用程序开发。服务层对于服务层,自研物联网服务器主要采用基于node.js的方案。但是,我们发现越来越多的应用在使用Serverless架构,不仅可以快速推出一个可用的原型,而且以后可以很方便的基于这个原型添加业务功能。图4展示了我们见过的物联网服务层的三种方案:独立开发:遵循传统的服务端开发模式,定义自己需要的功能;使用云服务:直接使用成熟的物联网云服务,将各种需要的功能集成在云端;Serverless:Server可以看作是在云服务之上的独立开发,结合??了两者的便利性。每个解决方案都有自己的特点,也适用于不同开发能力的项目。但是如果要实现快速开发,那么理想的方式就是采用Serverless架构模型。自主开发是出于不同的原因,比如保密性、安全性、可扩展性、核心技术等,一定规模的公司都会采用自主开发的方式。这种开发方式与Web应用开发方式没有太大区别,都是对数据进行CRUD操作。并且像前后端分离架构一样,以API作为接口,同时支持不同的传输协议,比如MQTT、CoAP等。比如Lan(https://github.com/phodal/lan),作者之前在GitHub上开源,是一个物联网服务器的简化示例。基于Node.js和MongoDB,其架构如图5所示。使用传统的关系型数据库来存储用户信息;使用NoSQL处理不同的传感器数据;提供UI界面,供管理者管理用户;在协议上提供对HTTP、CoAP、MQTT、WebSocket等的支持,方便不同类型的适配。此外,在存储方面,物联网系统使用NoSQL作为存储介质将具有更大的优势。一般来说,物联网系统的数据写入的场景远远多于读取的场景。同时,由于设备种类繁多,不可能为每种设备创建一个表;或者考虑大量设备的特点建立一个总表,但这样的表在未来可能仍然不适用。因此,对于物联网数据,选择MongoDB等NoSQL数据库有一些优势:灵活性。使用非结构化数据模型,可以存储和处理任何结构的数据;支持横向扩展。NoSQL数据库的分布式存储架构,带来极佳的横向扩展性;实时数据分析。例如,MongoDB可以通过丰富的索引和查询支持,包括辅助、地理空间和文本搜索索引、聚合框架和本地MapReduce,就地对传感器数据进行报告分析。但是,这样的系统不可避免地存在开发周期长的问题。如果您需要快速验证,您应该考虑使用云服务来完成一些功能。物联网云服务对于硬件团队来说,直接使用云服务是构建物联网系统更简单、更快捷的方式。使用物联网云服务意味着我们可以在硬件层直接上传传感器数据,在应用层获取并分析这些数据。这类比较成熟的服务有AWSIoTThings(如图6)、AzureIoT等。基于AWSIoTThings,我们只需要在云端定义相应的数据处理规则,就可以直接连接到硬件方面的服务。但值得注意的是,单一的云服务无法提供复杂的功能,此时需要一些额外的服务。ServerlessServerless架构(如图7所示)是一种云服务,但它在可编程性和云服务之间做了折衷。它是一个基于互联网的技术架构概念。应用逻辑并不是全部在服务器端实现,而是采用FaaS(FunctionasaService)架构,通过函数组合来实现应用逻辑。理论上,这些服务提供了一层API封装,不限制我们使用的语言。使用Serverless服务,我们可以拥有更好的快速开发能力,使用同一种语言(JavaScript)来完成编程。在这个过程中,开发者要做的是:在不同的服务之间传递数据,每次只处理下一个服务需要的数据,类似于PipeandFilters架构模式。例如,一个典型的物联网应用的数据传输过程如下:对设备进行认证;转换和存储设备的数据;广播通知其他监听设备数据的服务;后台查询数据;分析数据(人工智能);可视化数据。只需少量的编程,我们就可以完成服务器端的开发。随后,着重于硬件层的开发和应用层的业务功能。应用层在应用层方面,JavaScript已经被大量使用。除了传统的桌面浏览器,还有更多可以开发JavaScript的领域。比如对于移动应用,已经有基于Cordova+WebView的成熟解决方案,而近两三年开始流行的ReactNative,让开发者可以使用JavaScript来完成物联网移动应用的开发。再比如微信小程序,可以直接使用蓝牙连接硬件设备,也可以使用JavaScript来编程。因此,从目前的Web趋势来看,在应用层,JavaScript将是快速入门的主流选择。在日常应用中,我们可以找到物联网的应用层,它经常被用作连接硬件和上传应用数据的协调设备。比如共享单车、智能手环应用等,它们不仅通过蓝牙获取数据,还向服务器上传数据。同时,有相当多的应用程序运行在桌面客户端上。因此,这一层的应用有很多种。如今,开发者在为移动端进行技术选型时,会优先考虑跨平台能力(android、iOS)。在这些跨平台框架中,混合应用框架Cordova(WebView)和ReactNative是使用最广泛的两个框架,它们都使用JavaScript作为核心开发语言。Cordova使用WebView呈现页面。因此,与ReavtNative相比,使用Cordova最大的优势在于可以复用已有的web前端应用的逻辑,并且有大量的图表工具可以直接使用——这一点在物联网应用中尤为重要.在混合应用框架中,Ionic是该领域使用最多的UI框架。ReactNative使用原生组件渲染UI组件,不仅可以解决Cordova饱受诟病的性能问题;同时也可以嵌入WebView解决一些复杂的图表显示问题。但如果只能通过蓝牙交互,可以考虑PWA或者微信小程序。运行在Chrome浏览器上的PWA应用可以直接使用Bluetooth、NFC、USB等WebDevicesAPI,即直接调用浏览器上的原生接口,实现对设备的控制。比如去年流行的微信小程序,也可以接入蓝牙、GPS、指南针、加速度计等硬件接口。同时,用户无安装成本,即开即用。此外,Electron、NW.js等框架允许开发者直接使用WebView+Node.js模块开发物联网桌面应用。可以加快UI界面的开发速度,轻松美化UI界面。硬件层在硬件层。目前,除了自带Wi-Fi的ESP8266开发板外,Arduino是最适合做原型的硬件。虽然使用JavaScript的开发板数量不多,也没有Arduino那样成熟的生态,但未来可期。在嵌入式领域,用JavaScript编写的代码具有移植性强、事件驱动、内在异步支持等特点。遗憾的是,为了保持上述JavaScript特性,目前的JavaScript开发板都需要具有较高处理性能的处理器,这也导致此类开发板的生产成本较高。不过,好消息是,大多数使用JavaScript作为开发语言的设备都具备连接互联网的网络功能,可以直接作为物联网设备使用。目前这类设备包括Tessel、Espruino、Ruff等,它们的处理器性能相当不错,价格也比较高。但是他们可以直接使用JavaScript,可以为软件开发工程师屏蔽底层细节、事件驱动和异步特性,带来更好的开发体验。幸运的是,三星推出的开源物联网框架IoT.js只需要64KBRAM和200KBROM。将来,也许它可以解决一些制造成本问题。协调层当我们的硬件层不能直接连接到互联网时,协调层就可以完成这样的功能。作为协调层设备,它应该能够连接一定数量的单片机,??接收它们的数据,并上传到服务器;它还可以与服务器通信,获取一些控制指令,并及时将这些指令发送给服务器。不同的控制器。所以,它需要有更好的处理能力,更多的RAM、ROM等。因此,在这个级别使用JavaScript不是成本问题。我们只需要利用类似于服务器和应用层的知识,就可以快速将设备连接到网络中心。您还可以直接在本地Linux机器上编写代码,然后在您的设备上无缝运行。这类应用依赖于Node.js引擎实现快速开发。可以运行在流行的树莓派、OpenWRT路由器等带有嵌入式系统的开发板上,我们只需要一块运行嵌入式linux系统的开发板就可以完成这项工作。同时,主流的ARM开发板都提供了相应的Linux移植,所以在这个层面上,我们只需要专注于业务实现即可。总结如上所述,物联网应用的架构与Web应用的架构并没有太大区别,只是在其上进行了一系列的演化。除了上面提到的一系列快速实践框架外,在物联网系统中势必会引入一些当前Web开发中流行的开发思想:微服务;开发运营;容器化。物联网会从互联网上吸取优秀的开发思想,演化成更好的架构。
