咱們在《阿里雲物聯網平臺體驗(樹莓派+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