Jeff Atwood曾提出“任何能够用JavaScript实现的应用,最终都必将用JavaScript实现”他对JavaScript的推崇不言而喻。而当下这个物联网大热的时代,JavaScript支持HTTP和JSON、支持函数式编程、可提供交互式环境等特点堪称适用于物联网全栈开发。本文详解了JavaScript可参与的每一个物联网过程,并针对开源项目进行了汇总。
物联网节点JavaScript开发
网络中,HTTP协议与JSON数据格式特别是RESTful API无疑具有支配地位,各种云服务,数据传输都基于这些协议来进行。而JavaScript为HTTP和JSON提供了最好的支持,当物联网系统采用JavaScript开发时,天然对接了互联网上海量的云服务与云资源,包括云存储、云计算等一系列资源都可被方便调用,就像你在手机端访问各种云服务一样。微服务构架在服务器端的兴起,让JavaScript编写的每一个物联网节点都可以作为一个大系统中的微服务,通过RESTfulAPI接口提供自己的服务。
在设计模式上,JavaScript的回调与事件循环等基于事件驱动的编程模型非常适合物联网。在物联网环境下,环境在不断变化,物联网节点要不断对环境的变动做出响应,换句话说物联网系统通常是I/O密集型的系统,回调与事件循环高效地完成了密集I/O操作这项工作,而事件响应式编程相比于多进程和多线程编程在内存的使用上又非常高效,而这又是物联网系统所需要的,通常物联网系统都是资源受限系统,内存与CPU的频率都非常有限。物联网节点底层开发中通常采用中断响应模式,在CPU中由称为中断控制器的硬件来检查中断信号的出现,并在中断出现后控制CPU执行特定程序片段,这一执行模式和JavaScript的回调一致,很容易使用JavaScript回调机制来实现硬件的中断响应。
物联网节点的部署特点决定了其回收维护成本非常高昂甚至是不可接受的。而物联网节点要不断应对新的环境与应用需求,所以在开发中物联网节点的远程部署与更新是非常重要的一个功能。JavaScript本来就是实现从服务器端向客户端部署的一门语言,其天然就具有在网路上实现远程部署的属性,实现起来就像你用浏览器下载JavaScript脚本并运行一样简单。JavaScript的热部署也是一个比较热门的研究领域,通过热部署,物联网节点可以实现在运行过程中远程添加新功能,远程修正bug。
前面讲了使用JavaScript来做物联网开发的好处,那么也有必要讲一下JavaScript在物联网应用中相对于Web应用的不同以及误区。第一个问题就是实时性。作为嵌入式系统的物联网网关,首要面对的就是实时性问题,比如各种电机的控制,一些电压信号的采集都是有实时性要求的,需要在规定的时间内完成所需工作。由于JavaScript的内存管理使用垃圾收集机制,所以必然存在由于垃圾收集而导致应用中断执行的情况,甚至有可能在一些情况下造成实时性要求遭到破坏。所以在设计JavaScript物联网实时程序时需要考虑内存垃圾数据时间对实时性的影响。当然,也可以采用另一个设计模式,就是把实时任务使用C语言编写的单独线程来实现,利用JavaScript的单线程特点,这种设计模式不会在嵌入式系统中占用过多的资源,毕竟JavaScript本来就是一种嵌入在浏览器里的语言。
另一方面,由于物联网网关是需要长期运行的设备,相对于Web端需要有更高的可靠性与稳定性,所以单元测试与集成测试是必须的,而且需要使用代码分析工具保证代码没有任何内存及文件句柄的泄漏。即使在垃圾收集环境下,内存泄漏也是存在的,而在嵌入式系统中由于内存有限,特别容易泄漏。好在服务器端JavaScript的开发应用已经有很长一段时间了,可以从服务器开发里借鉴不少工具。