Ruff設備接入阿里雲IoT平臺推送告警到釘釘羣

image.png | left | 664x194

1.IoT雲端開發

  • 開通物聯網套件 www.aliyun.com/product/iot
  • =>產品管理>建立產品
  • =>產品管理>產品詳情>設備管理>添加設備
  • =>產品管理>產品詳情>設備管理>添加自定義屬性 tag,imei
屬性名key 屬性值value 描述
tag 西溪園區 1-2-56 自定義設備位置
imei XIXI2018034532 自定義設備序列號
  • =>產品管理>產品詳情>消息通訊
Topic
權限
描述
/productKey/${deviceName}/data
發佈
上報數據
payload示例 {"temperature":23,"humidity":63}
/productKey/${deviceName}/control
訂閱
下行指令
payload示例 {"device": "iotLed","state": "on"}

2. 函數計算開發

2.1 開通函數計算服務

開通FC函數計算服務www.aliyun.com/product/fcjavascript

2.2. 建立__Nodejs函數__

  • 建立服務 __IoT_Service __
  • 建立函數 pushData2Dingtalk
  • 函數腳本以下:
const https = require('https');
//釘釘羣機器人token
const accessToken = '此處是釘釘羣機器人的token';

module.exports.handler = function(event, context, callback) {
    var eventJson = JSON.parse(event.toString());

    const postData = JSON.stringify({
        "msgtype": "markdown",
        "markdown": {
            "title": "溫溼度傳感器",
            "text": "#### 溫溼度傳感器上報\n" +
                "> 設備位置:" + eventJson.tag + "\n\n" +
                "> 設備編號:" + eventJson.imei+ "\n\n" +
                "> 實時溫度:" + eventJson.temperature + "℃\n\n" +
                "> 相對溼度:" + eventJson.humidity + "%\n\n" +
                "> ###### " + eventJson.time + " 發佈 by [物聯網套件](https://www.aliyun.com/product/iot) \n"
        },
        "at": {
            "isAtAll": false
        }
    });

    const options = {
        hostname: 'oapi.dingtalk.com',
        port: 443,
        path: '/robot/send?access_token='+accessToken,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(postData)
        }
    };
    const req = https.request(options, (res) => {

        res.setEncoding('utf8');
        res.on('data', (chunk) => {});
        res.on('end', () => {
            callback(null, 'success');
        });
    });

    req.on('error', (e) => {
        callback(e);
    });

    // 寫入數據請求主體
    req.write(postData);
    req.end();

};

複製代碼

3. IoT套件-規則引擎設置

3.1 字段

deviceName() as deviceName ,
timestamp('yyyy-MM-dd HH:mm:ss') as time,
attribute('tag') as tag,attribute('imei') as imei,
humidity, temperature
複製代碼

3.2 Topic

產品/+/data  +通配符,表明產品下全量設備都使用這個規則
複製代碼

3.3 完整數據操做

image.png | left | 539x173

3.4 轉發動做-函數計算

image.png | left | 532x261

3.5 啓動規則引擎

4. 設備端開發

4.1 模擬設備開發

模擬設備的nodejs腳本iot-fc-dingtalk.jsjava

/** * package.json 添加依賴:"aliyun-iot-mqtt": "0.0.4" */
const mqtt = require('aliyun-iot-mqtt');

//設備三元組
const options = {
    productKey: "產品",
    deviceName: "設備",
    deviceSecret: "祕鑰",
    regionId: "cn-shanghai"
};

//設備與雲 創建鏈接,設備上線
const client = mqtt.getAliyunIotMqttClient(options);

//主題topic
const topic = `${options.productKey}/${options.deviceName}/data`;
const data = {
    temperature: Math.floor((Math.random()*20)+10),
    humidity: Math.floor((Math.random()*100)+20),
};
//指定topic發佈數據到雲端
client.publish(topic, JSON.stringify(data));

const subTopic = "/" + options.productKey + "/" + options.deviceName + "/control";
//訂閱topic
client.subscribe(subTopic)
//添加topic處理函數
client.on('message', function (topic, message){

    console.log(topic + "," + message.toString())
})

複製代碼

啓動虛擬設備腳本node

$node iot-fc-dingtalk.js
複製代碼

4.2 真實開發板開發

  • 建立文件夾 mkdir ali-iot-client
  • 進入文件夾 cd ali-iot-client
  • 建立工程 rap init
  • 添加硬件和驅動 rap device add humirature
  • 設備型號 DHT11
  • 在package.json中增長iot的sdk包 aliyun-iot-device-mqtt
"ruff": {
    "dependencies": {
      "aliyun-iot-device-mqtt": "^0.0.5", 

    },
    "version": 1
  }
複製代碼
  • 安裝依賴 rap install
  • 安裝完目錄結構以下: 

image.png | left | 390x388

  • 編寫業務邏輯 /src/index.js
// 引入aliyun-iot-sdk
var MQTT = require('aliyun-iot-device-mqtt');

// 我的帳號
var options = {
    productKey: "",//替換爲本身的
    deviceName: "",//替換爲本身的
    deviceSecret: "",//替換爲本身的
    regionId: "cn-shanghai",//華東2
};
// 發佈/訂閱 topic
var pubTopic = "/" + options.productKey + "/" + options.deviceName + "/data";
var subTopic = "/" + options.productKey + "/" + options.deviceName + "/control";

// 創建鏈接
var client = MQTT.createAliyunIotMqttClient(options);

$.ready(function(error) {
    if (error) {
        console.log(error);
        return;
    }
	//10s上報一次
    setInterval(publishData, 15 * 1000);

	//訂閱topic
    client.subscribe(subTopic)
    //添加topic處理函數
    client.on('message', doHandler)

});

//上報溫溼度
function publishData() {
    $('#humirature').getTemperature(function(error, temperature) {
        if (error) {
            console.error(error);
            return;
        }
        $('#humirature').getRelativeHumidity(function(error, humidity) {
            if (error) {
                console.error(error);
                return;
            }
            var data = {
                "temperature": temperature,//溫度
                "humidity": humidity       //溼度
            };
            console.log(JSON.stringify(data))
            //發佈topic,上報數據
            client.publish(pubTopic, JSON.stringify(data));
        });
    });
}

//接收topic,處理下行指令
function doHandler(topic, message) {

    console.log(topic + "," + message.toString())

    if (topic === subTopic) {
        var msgJson = JSON.parse(message.toString());
        
            //state爲on,那麼打開led-r燈
            if (msgJson.state === 'on') {

                $('#led-r').turnOn();

            } else {
                $('#led-r').turnOff();
                
            }
    }
}
複製代碼
  • 硬件接線方式查看 rap layout --visual
  • 設備上電,鏈接Ruff_Rxxxxx的wifi,部署應用程序 rap deploy -s

5. 釘釘羣收到推送

image.png | left | 193x144

6.下發指令

  • 經過IoT套件控制檯下發指令 /{productKey}/+/control
//on開燈
{"device": "iotLed","state": "on"}
//off關燈
{"device": "iotLed","state": "off"}
複製代碼

設備管理 》設備》Topic列表json

image.png | left | 656x297

更多IoT物聯網技術,敬請關注公共帳號

iot-tech-weixin.png | center | 225x224
相關文章
相關標籤/搜索