端与云的融合
端、管、云,物联网系统的三个主要构成元素,各自技术在高速发展的同时也在不断的影响着现代物联网系统的设计。
-
端,我们指终端设备,包含手机,车辆,智能家居设备等与用户直接交互的设备;
-
管,我们指通讯管道,包含有线/无线网络等连接端与与云,端与端进行数据交换的通道;
-
云,我们指运行在各地数据中心的远程服务器集群及其提供的服务;
传统端与云在软件设计方面有不同的专注点,端软件设计的重点在于思考在受限的内存和算力下如何优化单机程序;云软件设计的重点是在于如何设计可扩展的分布式计算使用多机来处理大规模的服务请求。
物联网系统里数据的产生者是各式各样的传感器,包含音频,摄像头视频,加速度传感器,温湿度传感器等。这些每时每刻都在自动产生的传感器数据,相对于移动互联网应用中用户在APP上手动交互而产生的数据会大上几个数量级。庞大的传感器数据量使得将所有原始数据传回云端处理非常困难,对终端算力和通讯管道的提速提出了要求。
近几年来终端算力的提升,使得我们可以把更多的计算放在终端设备,只与云端交换处理后的中间或结果数据,减少与云端原始数据交换。一方面减少了服务响应延时,另一方面也可以规避一些隐私数据的传输。终端算力的提升,越来越多的云端技术可以被引入到终端中。现代汽车电子中,整车电子系统发展趋向于由娱乐域和驾驶域等若干高性能计算机构成,高性能计算机之间通过以太网通讯形成了一个车载的分布式系统,一些原来在云端被验证的分布式技术开始被应用到车内。
另一方面,通讯管道的发展,4G网络的普及和即将到来的超10Gbps的理论传输速度的5G网络使得端与云的分工也在不断发生着变化。管道的提速,端与云之间可以有更高频的近实时数据交互。
端云融合在车联网的场景下, 车作为一个高复杂度的终端,与云之间也有着不断融合的趋势。车载以太网主干和5G的发展促使车与云融合的过程中会产生了一些新的设计思路,这里讨论一种车联网的整车软件架构,我们称之为C/S/ES(Client-Server-EmbeddedServer)架构,如下图。
C/S/ES架构在传统的C/S(客户端/服务器)架构中在逻辑上引入了车内嵌入式服务器ES(Embedded Server)的模块,将车内的计算与人机交互界面分离,把原来一部分在车载客户端的计算逻辑移到了ES模块中。实际部署中 客户端软件和ES可以是运行在同一个硬件模块上也可以是运行在不同的硬件模块上 ,e.g., 通过虚拟化技术来运行多个操作系统。
类似云服务的架构,ES在车内可以采用面向服务或者微服务的架构进行设计。ES中运行的服务动态注册到车内配置中心可以被依赖的服务和客户端发现。类似的,我们可以有一个代理程序将云端提供给车的服务注册到车内配置中心。
ES中支持的服务可以为车载客户端程序提供部分与云端一样的接口。另外,ES中的软件也可以被OTA更新。Android的Background Service一定程度上可以实现部分ES类似的概念, 基于独立Linux系统的ES可以为车内多个域同时提供服务而不强耦合于娱乐域,另一方面也可以使用更多跟云服务器相似的一些基于Linux的技术 。
这种C/S/ES的架构带来了几个好处:
-
轻客户端APP设计:功能的实现被抽象成服务在ES实现以接口的方式提供出来,APP应用专注于HMI逻辑的实现,根据不同应用的需求 可以采用原生/H5的方式来实现UI/UX交互 。
-
集中的计算支持多端复用:由于计算逻辑被集中到服务以接口的方式提供出来,而不强耦合与某个车载APP,使得 服务能被更多的地方所复用 。比如ES中实现的车载自诊断服务可以为云端提供远程诊断的接口,同样也可以为中控和仪表提供本地诊断信息的接口。比如连接在ES中的行车记录仪可以提供视频流服务给中控应用显示,也可以上传到视频云供手机端观看。
-
冗余ES模块实现功能的高可用:在车联网的场景下,车与云端服务通过蜂窝网络进行通讯,在隧道,地下车库或者偏远地区,我们经常会遇到蜂窝网络失效的情况。对于部分需要保持高可用的功能,我们希望即使在断网的情况下也能够在车内提供服务。比如车载智能语音助手,充电路径规划等。这个例子中我们可以通过将云端同样接口的服务在ES中有个相同或者简化的实现来提供服务。得益于动态服务发现, 客户端不需要区分服务的实现者是在车内还是云端 ,只需要并行向多个冗余的服务提供方发送同样的服务请求即可。
C/S/ES架构并不适用于所有类型的客户端应用,比较适用于分离到ES的服务有以下几类:
-
数据服务,如用户账号数据管理,车辆状态数据;
-
算法服务,如语音对话模型运算、启发式路径规划算法等;
-
控制接口,如门窗,后备箱开关控制等;
事实上,设备本地实现嵌入式服务器的设计在互联网中非常常见——现在每家每户都有的无线路由器管理界面便是以嵌入式Web Server的方式为设备功能管理提供接口。
过去几年,嵌入式服务器软件的开发也在逐步增加。对于运算能力和内存相对较强的平台,选择运行在linux上的golang或者python语言来开发ES服务是个不错的选择。对于资源比较受限的SoC和MCU,Cesanta公司的Mongoose套件提供了一个嵌入式Web Server的C语言开源实现(商业协议或GPL v.2协议),事实上它提供了HTTP/WebSocket/MQTT/CoAP/DNS等在嵌入式环境下多网络协议的支持,支持Linux/QNX/Android/FreeRTOS等多个不同的嵌入式系统,开发者仅需要集成两个源代码文件即可使用。Mongoose也提供了一个裁剪的javascript引擎mJS以支持javascript脚本的一个特性子集。
CivetWeb从Mongoose早期使用MIT协议的版本fork出来发展而成,基于MIT开源协议,提供与Mongoose类似的网络协议支持。CivetWeb集成了Lua脚本引擎以支持服务端动态页面的开发,支持服务端javascript(基于Duktape库,一个嵌入式javascript引擎),以及CGI+SQLite数据库。
RealTimeLogic的Barracuda Application Server是另一个使能IOT设备开放web访问接口的产品。开发者可以基于Barracuda开发CSP(C Server Page)和LSP(Lua Server Page)。
随着车载SoC芯片的算力的不断提升和车载以太网技术的普及,未来车型的整车电子在逐步形成车内服务器的架构形态。在这个过程中会涌现大量的,针对车载嵌入式环境设计的分布式系统软件,类似于云计算技术的发展,这些系统软件更多属于平台性质的软件,并不局限于服务某一家整车厂的特定需求,更多的会在Tier 1/Tier 2供应商中产生。
End