我们在《阿里云物联网平台体验 (树莓派 + python 篇)》里, 写了通过 Python 语言开发云到端的物联网程序, 本篇文章将介绍通过 Node.JS 来实现类似功能.
同样在阿里云官方文档里已经有了一个 Node.JS 设备接入说明: https://www.yuque.com/cloud-dev/iot-tech/gvttbm
文中的代码也是把模拟的温湿度数据上传到物联网云平台的, 我们依然对这个代码进行扩展, 实现接入实际的温湿度传感器, 把数据上传到云端, 同时云端下发控制指令, 控制 LED 的开和闭.
相关硬件平台的搭建由于在 python 篇里已有描述, 我们这里就不在赘言了.
目前用 Node.JS 直接操作 GPIO, 根据网上的资源, 有两种常见方式, 一种是采用是操作 rpio 库 (目前最新版本是 rpio2 0.4.1), 一种是 quick2wire-gpio-admin.(其他更好的方案, 也希望网友推荐). 根据使用习惯, 我这次选用的是 rpio2.
需要注意的是, rpio2 里面的 pin 和 python 操作的有些不一样, 它指定的 pin 是物理排针的 pin 脚位置. 比如我们的 LED 模块控制脚接入的是 GPIO4, 在 python 中我们定义 pin=4, 在 rpio2 中, 我们需要定义 pin=7 了.
使用 rpio2 库之前需要安装一下, 输入如下命令:
NPM install rpio2 -production
操作 GPIO 的代码也比较简单, 如下面的示例代码:
- 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 的值相对麻烦一些, 参考国外一篇文章:
安装 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 命令, 则运行结果如下:
有了以上的操作, 那么我们把上面的代码糅合进阿里云官方的示例, 实现阿里云的双向通信.
增加 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
来源: https://yq.aliyun.com/articles/676033