咱们在《阿里云物联网平台体验(树莓派+python篇)》里,写了经过Python语言开发云到端的物联网程序,本篇文章将介绍经过nodejs来实现相似功能。node
一样在阿里云官方文档里已经有了一个Nodejs设备接入说明:https://www.yuque.com/cloud-dev/iot-tech/gvttbmpython
文中的代码也是把模拟的温湿度数据上传到物联网云平台的,咱们依然对这个代码进行扩展,实现接入实际的温湿度传感器,把数据上传到云端,同时云端下发控制指令,控制LED的开和闭。npm
相关硬件平台的搭建因为在python篇里已有描述,咱们这里就不在赘言了。json
目前用nodejs直接操做GPIO,根据网上的资源,有两种常见方式,一种是采用是操做rpio库(目前最新版本是rpio2 0.4.1),一种是quick2wire-gpio-admin。(其余更好的方案,也但愿网友推荐)。根据使用习惯,我此次选用的是rpio2。函数
须要注意的是,rpio2里面的pin和python操做的有些不同,它指定的pin是物理排针的pin脚位置。好比咱们的LED模块控制脚接入的是GPIO4,在python中咱们定义pin=4,在rpio2中,咱们须要定义pin=7了。post
使用rpio2库以前须要安装一下,输入以下命令:ui
npm install rpio2 –production阿里云
操做GPIO的代码也比较简单,以下面的示例代码:spa
const Gpio = require('/home/pi/node_modules/rpio2/lib/index.js').Gpio;
var led = new Gpio(7); //建立 Pin7 引脚
led.open(Gpio.OUTPUT, Gpio.LOW); //设置为 OUTPUT、默认低电平
for(var i = 0; i < 20; i++){
led.toggle(); //切换 led 的电平状态
led.sleep(300); //等待 500ms
}
led.close();
获取DHT11的值相对麻烦一些,参考国外一篇文章:https://www.instructables.com/id/Raspberry-Pi-Nodejs-Blynk-App-DHT11DHT22AM2302/
安装bcm2835-1.46没有出现什么问题,不过安装node-dht-sensor,若是直接输入 sudo npm install -g node-dht-sensor 命令进行安装会出现以下错误:
咱们必需要这样执行命令才行:
一、 先运行:sudo chmod -R 777 /var/root
二、 后运行:sudo npm install -g --unsafe-perm node-dht-sensor则能够正确安装,以下图所示:
获取温湿度的代码比较简单,以下:
var sensorLib = require('node-dht-sensor');
// Setup sensor, exit if failed
var sensorType = 11; // 11 for DHT11, 22 for DHT22 and AM2302
var sensorPin = 16; // The GPIO pin number for sensor signal
if (!sensorLib.initialize(sensorType, sensorPin)) {
console.warn('Failed to initialize sensor');
process.exit(1);
}
// Automatically update sensor value every 2 seconds
setInterval(function() {
var readout = sensorLib.read();
console.log('Temperature:', readout.temperature.toFixed(1) + 'C');
console.log('Humidity: ', readout.humidity.toFixed(1) + '%');
}, 2000);
执行sudo NODE_PATH=/usr/local/lib/node_modules node ./nodejs_dht11.js 命令,则运行结果以下:
有了以上的操做,那么咱们把上面的代码糅合进阿里云官方的示例,实现阿里云的双向通讯。blog
增长message函数,获取云端发送的数据:
client.on('message', function(topic, message) {
var json = JSON.parse(message.toString());
console.log("LED="+ json.params.LED.toString());
led.write( json.params.LED);
});
getPostData函数须要改造一下,把温湿度函数增长进去:
function getPostData(){
var readout = sensorLib.read();
const payloadJson = {
id: Date.now(),
params: {
temperature: readout.temperature.toFixed(1),
humidity: readout.humidity.toFixed(1)
},
method: "thing.event.property.post"
}
阿里云物联网平台上咱们所建立的设备保持不变(参见Python篇),咱们去对接云端的这个设备。
执行代码须要前面加 sudo,不然会出错。执行结果以下:
本文相关的代码文件:nodejs_dht11_led.js