本文要点:
经优化的 JavaScript 引擎现在可运行在内存低至 32KB 的低配置嵌入式设备上。
JavaScript 等脚本语言屏蔽了内存管理等一些容易导致软件缺陷的底层细节问题,提升了开发人员的效率。此外,JavaScript 有庞大的开发人员群体,使物联网开发人员的招聘和培训工作更加轻松。
Ecma TC53 专委会致力于为嵌入式系统建立标准 API。标准化 API 搭建了各种嵌入式系统硬件间互操作的桥梁,将使硬件制造厂商和开发人员都从中受益。
TC53 正在推进对输入输出、传感器、网络、通信、能源管理和显示等方面的标准 API 制定。
Moddable 公司致力于为开发人员提供工具,支持在低规格微控制器上使用标准 JavaScript 创建开放式物联网产品。
鉴于互联的嵌入式物联网设备已广泛用于解决实际问题,软件架构师和开发人员已逐渐认识到,构建高效的物联网解决方案需要硬件、固件和软件的精巧结合。近些年,微控制器已经发展强大到足以运行 JavaScript。另一方面,经优化的 JavaScript 引擎已可运行在内存低至 32KB 的低配置嵌入式设备上。虽然通常性能最高的做法是使用 C 语言等对设备进行原生编程,但在许多情况下,生产效率和可维护性上的考虑要胜过对速度的要求。
在比利时Ghent大学研究人员Robbert Gurdeep Singh和Christophe Scholliers的论文中提出:
“编写正确高效的微控制器程序,是非常困难和耗时的……使用 C 语言等底层语言编写微控制器程序,存在难以调试和维护的问题。”
针对使用 JavaScript 编程微控制器中存在的机会和挑战,InfoQ 采访了Moddable公司的Peter Hoddie和Lizzie Prader。Moddable 致力于为开发人员提供工具,支持在低成本微控制器上使用标准 JavaScript 创建开放式物联网产品。
InfoQ:请介绍一下 Moddable。InfoQ先前曾报道了XS JavaScript引擎,但在我看来 Moddable 还有更丰富的产品线。
Peter Hoddie:是的,大家已经很熟悉 XS 了,它是当前唯一针对微控制器设计和优化的现代 JavaScript 引擎。但 XS 只是一个出发点,一个引擎还需要考虑运行时。我们为 Moddable SDK 创建的运行时中,对包括图形、网络、安全在内的每个组件都针对微处理器做了优化,非常适合物联网产品的软件开发。
InfoQ:Moddable 的未来愿景是什么?在 Moddable 官网上提到,使用低成本微控制器实现开放性物联网产品,你们为什么考虑聚焦于低端微控制器?请解释一下你们提出的“开放性”及其重要性。
Hoddie:我们所作的一切,都是以物联网产品负责人为出发点。这听上去很奇怪,毕竟我们的工作是为开发人员提供工具。
关注产品负责人的表现之一,就是我们聚焦于低端微控制器。我们希望每个设备都能运行很好的软件,这样的软件安全、可靠并易于使用。如果一个产品需要数百美元的硬件才能运行软件,那么一切都毫无意义。
“开放性”在我们的行业中已被滥用。我们坚信开放性的基本原则,并基于 FOSS(自由开源软件,Free and open-source software)许可发布了 Moddable SDK。但凡可能之处,我们均做到了开放,并通过 ECMA TC39 和 TC53 对开放标准做出了贡献。所有一切均有利于产品负责人,因为基于标准构建的产品更加可靠、安全,具有更好的互操作性。
但 Moddable 的愿景并不局限于此。我们认为,物联网产品同样可以像计算机、电话和服务器那样对第三方软件(即 App)开放。如果这一理念得以落地,那么用户可以轻松地更改其产品的功能和行为。例如,用户可以更改设备所连接的云服务,或是选择完全隔离互联网的方式运行。要实现该理念,在技术上依然存在许多挑战。JavaScript 解决了其中许多问题,它是一种正被数百万开发人员使用的开放标准语言。而且在网络上运行的经历表明 JavaScript 具有很好的可移植性,可以运行在照明、冰箱、锁、手表等各种设备上。通过安装 App 为用户的物联网设备提供更多选项和控制,将改变物联网领域的游戏规则。
InfoQ:给我们介绍一些使用 Moddable 构建的产品实例吧。
Lizzie Prader:如果您最近浏览过百思买或 Home Depot 的家用电器部分,则可能会在无意识情况下感受到 Moddable 的产品。一些洗衣机、烘干机、冰箱、烤箱以及更多电器中,已经内置了我们的软件,为用户在显示屏上提供操作接口、配置运行逻辑、控制运作方式和云通信。
救护车消毒系统是我们最近正开发的一款产品。该产品使用了六个传感器,确定何时需要对救护车的内部消毒。一旦救护车处于空置状态,系统会自动激活紫外线进行消毒。我们的软件控制着包括传感器和云通信在内的整个系统。
我们也正在研究监控设备制造的控制面板,这是我们的首个涉及工业物联网产品的项目,对我们而言是全新的和有趣的挑战。我们正在构建的彩色触摸屏用户界面,将取代七段式显示器及各种按钮和转盘。这种类型的界面非常便于用户上手,可以更轻松地设置系统和开展操作。
InfoQ:嵌入式系统编程中常使用 C/C++,部分原因是出于性能上的考虑。你们为什么选择 JavaScript 构建 Moddable?
Hoddie:根据我们的经验,使用脚本语言可更轻松地构建复杂的项目,包括物联网产品。脚本语言为程序员处理了许多细节。一个高效的运行时是与编程语言密切相关的,因此我们必须专注于一种语言。之所以选择 JavaScript,是因为许多开发人员都了解 JavaScript。其标准明晰,并且得到测试套件的良好支持。在构建项目时,我们尽可能使用 JavaScript。
正如你所提到的,在性能等场景下需要 C 语言。我们提供了称为“XS in C”的 API,有效地连接 JavaScript 和 C 语言。出于可移植性和安全性上的考虑,用户安装的 App 是完全使用 JavaScript 实现的。但是设备制造厂商提供的对象则可以按厂商自身的喜好,例如使用 C 语言为 App 提供高性能服务。这类似于在网络浏览器内置了许多原生服务,网页中的脚本可使用这些服务。
InfoQ:安全性对物联网用户是一个重要特性。安全意味着使用该产品不会对用户或其周边环境造成有害的影响。Moddable 如何为开发人员应对因引入低规格设备而带来的风险提供帮助? 我能想到的程序运行问题包括程序超出内存、电池寿命等设备限制,以及一些由于错误所导致的程序行为中断,例如著名的“undefined is not a function error”错误消息。
Hoddie:资源受限系统本身就比较大的系统更安全,虽然这看起来似乎有悖直觉。原因在于较小的系统通常是也是较简单的系统,因此往往更加鲁棒。出错隐患处越少,开发人员就更容易掌控。
JavaScript 的使用也提高了安全性。许多在 C 语言中常见的编程错误,例如忘记释放内存、缓冲区末尾写入溢出等,并不会发生在 JavaScript 中。JavaScript 的单线程执行模型也对安全性有一定裨益,它避免出现易于出错且难以调试的多线程代码。当然,Moddable SDK 仍然可以使用 Web Workers API 利用多核 SoC(如 ESP32 微控制器)的优势。
我们对处理异常同样采取了非常保守的态度,包括你提到的“undefined is not a function error”错误。这些异常会导致设备处于不稳定的、类似僵尸的状态。Moddable SDK 设置在发生内存不足、堆栈溢出等意外错误时重启设备。Moddable SDK 经优化可在重启后立刻开始执行 JavaScript,这样设备可在几毫秒时间内回到安全状态,使得设备恢复正常。
为了检测内存不足和堆栈溢出等资源耗尽问题,我们提供了 xsbug 调试器,实时显示资源的使用情况图。这有利于开发人员可视化地查看产品在开发过程中的行为,在问题出现之前及时发现。
InfoQ:对一些物联网产品而言,安全性是另一个至关重要的非功能性要求。不安全的产品可能被恶意行为者掌控、篡改或丧失功能。Moddable 对开发安全的物联网产品提供了哪些支持?
Hoddie:安全的重要性是大家的共识。但在安全性中存在许多意义尚不明晰的方面。
和许多其它产品一样,Moddable SDK 支持 TLS 安全通信。不同之处在于,我们使用 JavaScript 实现 TLS。
安全性的另一方面是如何防止第三方篡改固件。该方面上存在多种措施,例如安全启动等,这些的确是微控制器提供的功能。我们在此上并未做太多的工作。只要硬件支持,那么就可在产品中使用。
安全启动等功能就是要将第三方代码拒之门外。但应谨记,我们的愿景是支持第三方代码进入。我们希望用户能够在自己的物联网产品中自由地安装所需的应用。因此,我们需要一种支持输入非受信任代码、同时确保全系统安全性的方法。
为此,我们通过 TC39 的 Secure ECMAScript(SES)提案,将安全执行方式引入 JavaScript 语言标准。SES 允许 JavaScript 在极其轻量级的隔离专区中做沙盒化执行。这将限制已安装的应用只能访问部分系统功能。SES 的最重要之处在于,产品负责定义安全策略,SES 作为执行安全策略的工具。XS 是第一个实现 SES 的 JavaScript 引擎,它证明了 SES 轻量级到足以在连接 Wi-Fi 的照明设备上流畅运行。
InfoQ:介绍一下 TC53 委员会吧。它的作用是什么?为什么要额外成立这样一个委员会?目前推出了哪些规范?还有哪些规范在制定中?
Hoddie:当 Ecma 国际(Ecma International)首次就 TC53 咨询我们时,我的反应和你所提的问题一样。这世界根本不需要另立一个物联网标准嘛。
但是大多数物联网标准都是关于通信协议的,驻足于产品的物理边缘之外。我们对 TC53 采用了不同的做法。我们绝对不是去制造出另一个规范,而是去制定运行于产品内部的标准 API。产品制造厂商可以使用这些 API 实现自身的软件,而用户通过 App 安装 API。这些 API 必须是标准的,这样应用可运行在多个制造厂商的照明设备、车库门开启器或洗衣机上,类似于网页可运行在多个厂商的浏览器上。
TC53 规范的优点在于,我们不必操心具体哪种通信协议将主导物联网。因为我们可以编写运行在产品内部的可移植代码,因此可以实现产品所需的任何协议。
该委员会的正式名称是“用于嵌入式系统的 ECMAScript 模块”(ECMAScript Modules for Embedded Systems)。我们已经拟出了一份涵盖输入输出、传感器和显示器的规范草案。其中输入输入涵盖了网络 Socket,它是实现网络协议的基础。为开展实验,我们给出了一个基于 XS 的 ESP8266 微控制器的原型实现。J5e 项目(Johnny Five for Embedded Systems)提供了一个很好的例子,它对流行的 Johnny Five 机器人使用 JavaScript 框架做了重构,完全使用 TC53 IO API 在 JavaScript 中实现。
InfoQ:嵌入式程序的可移植性是通过何种方法实现的?或者说,如何最小化由硬件模块变化所导致的程序更改?
Prader:这是完全可行的。JavaScript 是一种与平台无关的语言,进而 Moddable SDK 中的 JavaScript API 也是与平台完全无关的。我们的 Commodetto 图形库、Piu 用户接口框架、网络协议、蓝牙低功耗(BLE)、文件和硬件 API 都是 JavaScript 实现的。这意味着,使用我们的 API 编写的应用,可以在多个目标平台上运行,无需更改任何代码。
我们基于 TC53 定义的 API,也是使用纯 JavaScript 实现的。JavaScript API 中封装了硬件制造厂商实施的所有设备相关代码,应用开发人员不必关注底层细节,只需使用熟悉的标准 API 编写 JavaScript 应用。例如,如果开发人员已经编写了一个应用,在屏幕上显示某个温度传感器数据。那么他们无需更改代码,或只需最少的更改,就能将该温度传感器更换成其它任何符合 TC53 规范的温度传感器,或是将显示器更换成其它任何符合 TC53 规范的显示器。
InfoQ:物联网的快速发展正受阻于哪些痛点?更具体而言,哪些痛点阻碍了 JavaScript 在物联网环境中的使用?
Prader:物联网依然存在很多问题。例如用户隐私未受充分尊重、各企业的产品自成体系、产品间的互操作受限于制造商、某些产品的安全性堪忧,各类问题层出不穷。简而言之,物联网仍支离破碎。Moddable 和所有的 TC53 贡献者正致力于解决这些问题。我们相信 JavaScript 语言和建立标准的作用。
然而另一个挑战在于,如何说服他人首选 JavaScript 进行嵌入式开发。在过去的几年中,我在商贸展会、学术会议和技术聚会上与数百人做过交流,大家的反应各异,兴奋、冷漠甚至敌对。一些 JavaScript 开发人员很高兴看到自身的编程技能可应用于新的平台,而其他一些开发人员则不希望开发运行于浏览器之外的应用。有一些嵌入式开发人员对学习嵌入式开发的新方法跃跃欲试,而另有部分开发人员则对有人会考虑使用 JavaScript 之类的语言感到不可思议。我们的嵌入式开发方法相对较新,与经典技术大相径庭。可以理解它并不会立刻得到所有人的认同。
Hoddie:总而言之,物联网步入正轨需要很多人的共同努力。我们的工作是为众多开发人员创建一种可用于每种物联网产品软件开发的普适方法。为实现摆脱专用 API 和突破不开放固件的局限这一目标,JavaScript 语言和制定中的 TC53 规范是很好的工具。
InfoQ:对于那些想要了解更多物联网相关知识、着手实现第一个嵌入式程序、甚至只是想了解其他人工作的开发人员来说,您能推荐一些好的教学资源吗?
Prader:大家可以立刻动手开始编写嵌入式应用。Moddable SDK在GitHub上开源提供,其中给出了150多个应用例子和详细的API文档。适用于各种硬件平台的例子不胜枚举。初学者无需顾虑硬件问题,有支持 Mac、Windows 和 Linux 的硬件模拟器可用。
Moddable 团队也在企业博客和Twitter上发布了一些使用 Moddable SDK 的最新项目。这些项目并非我们一家独有。
Peter 和我刚完成了一本面向开发人员学习的图书!书名定为《使用 JavaScript 开发 ESP32 和 ESP8266 微控制器物联网》(“物联网 Development for ESP32 and ESP8266 with JavaScript”),现在已可购买。该书不仅适用于着手使用 JavsScript 编写嵌入式应用的开发人员,也适用于考虑使用自身现有技能实现嵌入式产品的 Web 开发人员。
当然,还有很多相关资源。Twitter 和博客上有很多专业开发人员和爱好者的工作分享,在视频网站和会议网站上分享了一些演讲者的视频,还有一些电子邮件通信组和播客。我个人推荐Stacy Higginbotham的电子邮件通信组,她在其中分享了物联网的方方面面,从芯片到消费产品,从初创企业到行业巨头,内容详尽。
受访者简介
Peter Hoddie 是一位致力于客户端软件的工程师和企业家。他以编写可突破消费类硬件上用户体验界限的紧凑高效代码而闻名于众。他和团队开发的软件已赋能苹果、惠而浦、Palm、Sling、HP 和 Sony 等公司的大众消费类产品。Peter 认为,任何产品的首个用户就是创建该产品的开发人员,他们无法在不稳定、复杂甚至令人困惑的基础上构建出可吸引用户的消费类产品。他在上世纪 90 年代年代领导了 Apple 的 QuickTime 开发,并为 MPEG-4 文件格式标准的开发做出贡献。他是 Moddable 的共同创始人,ECMA TC39 代表(delegate),曾任 ECMA TC53 主席(Chair)。
Lizzie Prader 是一位任职于旧金山湾区 Moddable 的软件工程师。她致力于使消费物联网产品对终端用户更加开放和可定制,是一位从事物联网领域工作的物联网怀疑论者(IoT Skeptic)。她专长于为嵌入式系统开发触摸屏用户界面,并为开发人员创建了多种资源。
原文链接: Programming Microcontrollers with JavaScript – Q&A with Peter Hoddie and Lizzie Prader
评论