天天看點

阿裡雲物聯網平台體驗(樹莓派+Nodejs篇)

我們在《阿裡雲物聯網平台體驗(樹莓派+python篇)》裡,寫了通過Python語言開發雲到端的物聯網程式,本篇文章将介紹通過nodejs來實作類似功能。

同樣在阿裡雲官方文檔裡已經有了一個Nodejs裝置接入說明:

https://www.yuque.com/cloud-dev/iot-tech/gvttbm

文中的代碼也是把模拟的溫濕度資料上傳到物聯網雲平台的,我們依然對這個代碼進行擴充,實作接入實際的溫濕度傳感器,把資料上傳到雲端,同時雲端下發控制指令,控制LED的開和閉。

相關硬體平台的搭建由于在python篇裡已有描述,我們這裡就不在贅言了。

目前用nodejs直接操作GPIO,根據網上的資源,有兩種常見方式,一種是采用是操作rpio庫(目前最新版本是rpio2 0.4.1),一種是quick2wire-gpio-admin。(其他更好的方案,也希望網友推薦)。根據使用習慣,我這次選用的是rpio2。

需要注意的是,rpio2裡面的pin和python操作的有些不一樣,它指定的pin是實體排針的pin腳位置。比如我們的LED子產品控制腳接入的是GPIO4,在python中我們定義pin=4,在rpio2中,我們需要定義pin=7了。

阿裡雲物聯網平台體驗(樹莓派+Nodejs篇)

使用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的值相對麻煩一些,參考國外一篇文章:

https://www.instructables.com/id/Raspberry-Pi-Nodejs-Blynk-App-DHT11DHT22AM2302/

安裝bcm2835-1.46沒有出現什麼問題,不過安裝node-dht-sensor,如果直接輸入 sudo npm install -g node-dht-sensor 指令進行安裝會出現如下錯誤:

阿裡雲物聯網平台體驗(樹莓派+Nodejs篇)

我們必須要這樣執行指令才行:

1、先運作:sudo chmod -R 777 /var/root

2、後運作:sudo npm install -g --unsafe-perm node-dht-sensor則可以正确安裝,如下圖所示:

阿裡雲物聯網平台體驗(樹莓派+Nodejs篇)

擷取溫濕度的代碼比較簡單,如下:

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 指令,則運作結果如下:

阿裡雲物聯網平台體驗(樹莓派+Nodejs篇)

有了以上的操作,那麼我們把上面的代碼糅合進阿裡雲官方的示例,實作阿裡雲的雙向通信。

增加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://dev.iot.aliyun.com/sale?source=deveco_partner_yefan