当前位置: 首页 > 科技观察

当JavaScript遇上物联网(IoT)

时间:2023-03-18 13:46:43 科技观察

1995年,当在Netscape工作的BrendanEich开始为NetscapeNavigator2.0开发一种名为LiveScript的脚本语言时,没有人会想到avascript会被用于物联网在当今的互联网软件开发中扮演着重要的角色。如今,Javascript已经在越来越多的领域攻城掠地,例如web工程建设、后端服务器开发、3D图像、AR、VR等等。甚至,近年来,我们惊喜地发现JS可以用来开发硬件设备。今天就和大家聊一聊使用JS进行简单物联网开发的心得体会。任何可以用JavaScript编写的应用最终都会使用JavaScript——阿特伍德定律什么是物联网我们总是在谈论物联网,那么什么是物联网呢?IOT是InternetofThings的缩写,直译是“由对象组成的互联网”,准确翻译应该是“物联网”。物联网(InternetofThings),又称传感器网络,简单来说就是互联网从人到物的延伸。事实上,物联网可以从两个方向拆分,即从“物”到“网”,或者从“网”到“物”。物联网可以理解为人们跨越空间限制和自身条件感知物体的过程。从“网”到“物”,是人跨越空间控制物的过程。物联网应用开发平台介绍在物联网应用开发领域,知名的开发平台主要有以下几类:嵌入式操作系统,包括VxWorks、FreeRTOS、LiteOS等;极客硬件平台,包括树莓派、Arduino等;JavaScript物联网应用开发平台,包括Ruff、Tessel、JerryScript、Johnny-Five等。嵌入式操作系统,从功能上来说,可以满足目前的大部分需求。但是:入门门槛极高,想要成为优秀的嵌入式开发工程师的开发者需要学习大量的软硬件知识。与软件行业相比,嵌入式领域的人才数量有限。嵌入式领域的发展方式已经大大落后于整个行业的发展。敏捷软件开发方法和精益创业理念受限于工具,很少在嵌入式领域得到应用,因??此该领域的工程方法发展缓慢。这些操作系统的编程概念通常属于一个专门的领域,因此知识很难在行业内共享,开发人员在行业内流动也相对困难。因此,嵌入式领域对现代软件开发理念的理解也落后于软件行业。极客硬件平台,其初衷是为了降低开发门槛,让更多的开发者进入硬件开发领域。But:只是在操作的入门层面下功夫,真正开发难的是编程概念。对于大多数软件开发人员来说,困难在于硬件中的编程概念。各种接口和参数对于软件开发者来说是很难理解和掌握的。更关键的因素是,这些平台只解决了原型制作的问题。即使开发者可以通过它实现一个产品原型,也很难在真正的产品中使用。应用到产品上,往往需要重新设计硬件,这些平台的优势就消失了。两者最本质的复杂性在于它们的编程模型。对于软件开发者来说,GPIO、I2C等硬件接口完全是另一种语言。参数详细信息数据表。到目前为止,您可能会认为,物联网行业对软件工程师来说就像另一个世界,一点也不友好。是的,很多人都这么认为,所以有人想用更高级的语言来改变世界,其中最活跃的就是JavaScript社区。本节内容参考了RuffCTO郑烨的相关文章。将现代开发方法引入硬件开发。JavaScript物联网应用开发平台目前主要分为几类:在硬件上运行JavaScript,如JerryScript、Espruino等;提供硬件抽象能力,如Tessel、Johnny-Five、Cylon.js等;面向生产的能力,例如Ruff。Ruff的优势与Arduino相比,Ruff更接近于网络。由于Arduino诞生较早,标准开发板没有网络通讯方式。虽然可以以扩展的形式加入,但是上手有点复杂。Ruff天然支持Wifi通信,使用R??uff进行http通信和使用普通的nodejshttp通信没有区别,而且上手极其简单。当然,由于Arduino发布的比较早,一开始就是模块化开发的,所以感觉Arduino的第三个模块还是比较简单的,就像搭积木一样。与Arduino相比,没有那么成熟和完整。Ruff比RaspberryPi更接近物联网开发。树莓派的本质是一个浓缩但相对完整的操作系统。你可以在树莓派上做任何事情,浏览网页,编写网络服务器程序,当然也可以直接编写树莓派的I/O接口。(定时启动咖啡机,喂狗。。。)Ruff的功能比较简单。可以认为Ruff的功能就是一个单片机。可以部署各种web服务器,但是如果想访问浏览器等图形界面是不可能实现的,但它的核心目标是为硬件编程,功耗更低,效率更高。总而言之,就是两者设计初衷的不同。树莓派作为电脑使用,太弱很多功能无法发挥,而Ruff开发包作为硬件应用,太强则反映不了真实场景。Ruff入门Ruff入门非常简单。通过官网教程,我们可以快速使用Javascript写一个简单的灯饰'usestrict';$.ready(function(error){if(error){console.log(error);return;}$('#led-r').turnOn();//开小灯});$.end(function(){$('#led-r').turnOff();});然后连接到Ruff自己的wifi热点。通过无线网络,使用命令rapdeploy-s将程序下载到开发板。整个过程极其简单自然。并不比配置一个前端项目复杂多少。Ruff拥抱互联网。如果Ruff只能简单地开发一个简单的程序比如开关小灯,那就只能当玩具了。真正的“物联网”只有连接到广阔的互联网才能实现。后面会介绍如何将ruff接入阿里云物联网套件,实现信息上报和采集,实现从“物”到“网”的信息感知,从“网”到“物”的远程控制。阿里云物联网套件是阿里云专门为物联网领域的开发者推出的。其目的是帮助开发者构建安全性和性能强的数据通道,方便终端(如传感器、执行器、嵌入式设备或智能家电等)和云端的双向通信。全球多节点部署,让海量设备在全球范围内安全低延迟接入阿里云IoTHub。提供多重保护,确保云端设备的安全。性能方面,可支持亿级设备长连接,百万级消息并发。物联网套件还提供一站式托管服务,从数据采集到计算到存储,用户无需购买服务器部署分布式架构,用户只需要在web端配置规则即可实现全栈服务,例如采集+计算+存储。总而言之,基于物联网套件提供的服务,物联网开发者可以快速搭建稳定可靠的物联网平台。当然,您可以访问阿里云物联网套件的产品详情页面,探索物联网套件的强大功能。AlibabaCloud–IoTSuite–ProductDetails从架构图中我们也可以看出,红色的消息发布通道是我们前面讲的从“物”到“网”的感知过程,蓝色的订阅消息服务是控制过程从“网络”到“物”我们前面讲过。阿里云物联网套件目前没有官方的JSSDK。然而,物联网套件使用的MQTT协议是一种通用的物联网通信协议。我们可以根据JavaSDK接入阿里云产品的通用Openapi。Ruff程序代码示例:'usestrict';varfs=require('fs');varos=require('os')varmqtt=require('mqtt')varproductKey='填写在阿里云IoT申请的productKey'vardeviceNamesuite='填写在阿里云物联网套件中应用的deviceName'vardeviceSecret='填写在阿里云物联网套件中应用的deviceSecret'vartargetServer="tcp://"+productKey+".iot-as-mqtt.cn-上海.aliyuncs.com:1883"varport=1883varhost=productKey+'.iot-as-mqtt.cn-shanghai.aliyuncs.com'varclientId=os.hostname();vartimestamp=(newDate()).valueOf()varmqttClientId=clientId+"|securemode=3,signmethod=hmacsha1,timestamp="+timestamp+"|";varmqttUsername=deviceName+"&"+productKeyvarcontent='clientId'+clientId+'deviceName'+deviceName+'productKey'+productKey+'timestamp'+timestamp//varforge=require('forge')//varhmac=forge.hmac.create();//hmac.start('sha1',deviceSecret);//hmac.update(content);//varmqttPassword=hmac.digest().toHex();//console.log(mqttPassword)//目前ruff不能使用cryptoand其他包,可以自己实现一个hmacsha1加密varmqttPassword='generatedsecrettext';varpuburl="/"+productKey+"/"+deviceName+"/update"varsuburl="/"+productKey+"/"+deviceName+"/get"vartsl_options={port:port,host:host,rejectUnauthorized:false,keepalive:100,clientId:mqttClientId,用户名:mqttUsername,密码:mqttPassword}$.ready(function(error){if(error){console.log(error);return;}varmqttClient=mqtt.connect(targetServer,tsl_options)mqttClient.on('connect',function(){console.log('**********Connected**********')//当按钮按下时,通过mqtt协议,来阿里云mns服务发送消息$('#button').on('push',function(){vardata={ts:(newDate()).valueOf(),deviceName:deviceName}mqttClient.publish(puburl,JSON.stringify(data))console.log(JSON.stringify(data))});//level0:最多传输一次//level1:至少传输一次//level2:仅传输一次mqttClient.subscribe(suburl,{qos:1})//控制小红灯??在收到消息时亮灭mqttClient.on('message',function(topic,message){varmsg=message.toString()console.log('你收到的消息是:'+msg)if(msg=='turn_on_led'){$('#led-r').turnOn();setTimeout(function(){$('#led-r').turnOff();},500)}})})mqttClient.on('error',function(error){console.log(error)})});服务器代码示例:constRPCClient=require('@alicloud/pop-core').RPCClient;constMNSClient=require('@alicloud/mns');constBase64=require('js-base64').Base64;variotClient=newRPCClient({accessKeyId:'阿里云accessKeyId',secretAccessKey:'阿里云accessKeySecret',endpoint:'https://iot.cn-shanghai.aliyuncs.com',apiVersion:'2017-04-20'});varmnsClient=newMNSClient('阿里云账号id',{region:'cn-shanghai',accessKeyId:'阿里云accessKeyId',accessKeySecret:'阿里云accessKeySecret',});constqueueName='aliyun-iot-xGEDKBE*****'//激活阿里云物联网套件生成MNS消息队列//从队列中消费消息setInterval(async()=>{try{varreceiveRes=awaitmnsClient.receiveMessage(queueName)vardeleteRes=awaitmnsClient.deleteMessage(queueName,receiveRes.body.ReceiptHandle);varpayload=JSON.parse(Base64.decode(receiveRes.body.MessageBody))vardata=Base64.decode(payload.payload)console.log('数据从物联网设备接收到的是:'+data)}catch(err){console.log(err)}},500)constproductKey='**********'//阿里云物联网套件productKeyconstdeviceName='**********'//阿里云物联网套件deviceNameconstiotClientParams={ProductKey:productKey,TopicFullName:`/${productKey}/${deviceName}/get`,MessageContent:Base64.encode('turn_on_led'),}//发送消息给ruffsetInterval(async()=>{try{varsedRes=awaitiotClient.request('Pub',iotClientParams)}catch(err){console.log(err)}},2000)*注:服务器程序不需要购买阿里云的ECS,可以在本地测试,物联网套件和MNS是按量计费的,非生产环境几乎不会有成本,只需注册一个阿里云账号使用上面的代码示例编写起来比较简单,可以实现简单的物联网设备和服务器程序的双向通信。