物联网在今天已经不是一个新词汇,尤其是“物”这么接地气的东西,在互联网深入到各行各业时,自然而然会结合在一起,形成物联网。
这个“物”,就是千奇百怪、多种多样的嵌入式硬件、边缘硬件,以及通用的计算机终端的集合。
(图片来源于互联网)
而关键也就是这个所谓的“物”,尤其是嵌入式硬件,把业内各路神仙高手都给折腾得不轻,多少年了,这个“物”的开发,竟然和二十年前没什么本质差异,这能忍?
今天就聊一聊,物联网的开发到底还有没有质的提升空间,脚本语言到底合不合适物联网开发?
先别急聊物联网的开发语言,先看看互联网是怎么一步一步过来的,编程语言又是怎么个演化过程。
说是简史,那就一定得简单。
整个互联网的历史,就是人类疯狂建造信息高速的历史。
数字世界中的数据通信,和物理世界中的物品流通,尤其是和建造高速、高铁、飞机等交通基础设施以后,开辟的物流链路,并无二致。
编程的方法论可以是类似的,但用于不同目的的编程的实际操作方式,当然是会不同的。
如果针对不同目的、不同维度的编程方式是相同的,那一定意味着分工还不够精细和优化,效率还不够高。
于是对编程语言有如下粗略的分类:
离硬件最近的部分,需要用低级语言来处理,或是把高级语言翻译成低级语言处理。
接近底层的基础设施,应该用高级语言,首先肯定是C,其次按需要混编其他语言。
基础设施之上的应用框架部分,适合选用为解决现实世界的问题而生的语言,比如面向对象的语言。
最后应用的部分,根据目标应用需求,选用不同语言,大多也是面向对象或脚本等高级语言。
所有软件都封装好以后,仅仅是组装、定制、自动化、个性化,那么脚本语言是不二之选。
好了,绕了一圈,回到文章开头提出的问题。
可为什么物联网中“物”的开发,会很多年没有质的提升呢?
本质上来说,互联网开发中所用的服务器(硬件),和物联网的嵌入式硬件,也是没有区别的。
都是沙子做的高集成度芯片,加上外围电路形成核心板、主板,再接上一堆的外设,完成各自需要做的任务。
(图片来源于互联网)
那区别究竟在哪里?
还是拿造高速来形容。
服务器相当于高速路网体系中的关键交通枢纽,要打造一个网络,必然投入重金先建设枢纽进行计算调度和数据流转分配,是首先标准化的。
而物联网嵌入式硬件,相当于末端的站点,可能是一个十八线小乡村,是不是要连入高速路网都不一定,更不用说要让它承担重要的战略任务了。而且每一个十八线小乡村站,都因为各个地方的地理情况不同,千差万别,有的是建在树林里的,有建在山上的,还有建在河边甚至悬崖边的。
所以碎片化 和 场景广是物联网开发和物联网开发最大的区别。
好了,现在产能富余了,交通枢纽该建也都建差不多了,大家觉得十八线小乡村站,是不是也可以考虑并入高速路网?
这时候机会就来了,首先是扩建,让小乡村站有更大的容量和吞吐量,可以安排更多工作人员并行进行协调调度,小乡村站的承建方是开心得眉飞色舞了,因为他们的方案可以大麦,大麦!
(图片来源于互联网)
但是问题也随之而来了。
每一个小乡村的站长,都有各自的管理和建设模式,可能还是用笔和纸在记账呢!这放以前也够用啊,而且是最优性价比方案,作为站长,只需要管理自己一个人就行了,足以让小乡村站运转得井井有条。
但现在呢,让并入高速路网,说会有很多交通流量经过,也给安排了一个大团队来管理,那只用纸和笔还搞得定吗?
是不是得请一个专家来出谋划策指定方案和框架标准,至少也得向关键交通枢纽(服务器)学习呀!
好了,既然这么多十八线小乡村站都需要并如高速路网,那么我们由交通枢纽委员会来出一个标准化方案吧。
小乡村扩建以后,可以把枢纽上的一些标准范式的框架套用过来,可以裁剪适配,具体的站点怎么设计,还是得站长自己来个性化定制了。
于是,HaaS轻应用应运而生。
HaaS轻应用借鉴了互联网开发的经验,将“无所不能”的前端技术,迁移到嵌入式设备。使得在物联网的硬件开发中,也有机会打开创造力的匣子,百花齐放。
首先,它是一套框架,支撑嵌入式硬件上轻应用的运行。
其次,它以面向对象的方式封装硬件资源,使得底层基础设施的能力都能提供到位。
最后,它用脚本语言JavaScript/Python进行编程,无需编译,即可快速按需定制和自动化完成既定任务。
用来驱动硬件的脚本,大概长什么样呢?
var modbus = require('./modbus.js');
var deviceAddr = 1;
var device = modbus(
{
id: 'UART2' },
{
id: 'D13', polarity: 1 },
deviceAddr
);
var events = require('events');
var event = new events();
var status = 0x01;
setInterval(function () {
device.write('c1-8', status).then(function (data) {
console.log('write c1 data ' + data);
});
/* read back */
}, 2000);
event.on('write', function () {
device.read('c1').then(function (data) {
console.log('read c1 data ' + data);
});
})
// ...
这是一段modbus读写硬件外设的代码。
我们可以看到,实际的硬件相关操作其实是没有体现细节的,都是调用封装好的API,代码里都是一些简单逻辑。
所谓的轻应用,也可以理解为:业务脚本逻辑 + 一堆API调用。
当这些原子的功能组件API抽象得足够完善时,就可以干很多活了,比如
当然,这只是一些典型场景,适合在脚本语言做物联网开发的早期阶段,快速占领市场。
待到生态愈发成熟,可以有更多的应用场景从中受益。
(图片来源于互联网)
为什么是脚本语言?而不是其他编译性语言呢?
一句话:因为硬件性能提升了,所以可以牺牲部分运行效率,换取开发效率。
他山之石,可以攻玉。
我们来看看其他领域的应用开发的典型语言。
最成功的游戏之一,魔兽世界,使用Lua脚本开发插件,使得玩家可以轻松按自己需要个性化定制,各类玩法和插件生态得以发展得异常多姿多彩。
(图片来源于互联网)
PLC是工业控制最常见的器件,采用梯形图编程,而梯形图的逻辑解算过程,其实就是脚本语言的解释过程,只不过梯形图更像是图形化的脚本语言而已。
(图片来源于互联网)
Solidity是一种用于编写智能合约的类脚本语言,随着Ethereum的发展而被广泛采用。
sCrypt也是一款用于开发智能合约的脚本语言,在BitcoinSV上运行。
(图片来源于互联网)
越接近于解决末端实际问题的应用,越是可能使用脚本来解决。
原因是越是末端,越难以抽象和标准化,越多的定制和个性化,因此脚本是一大利器。
可以大胆猜测,脚本语言不仅适合物联网开发,而且极度适合物联网末端碎片化解决方案的全栈开发,包括嵌入式硬件、服务以及前端。