作者:俏巴
概述
IoT Studio服務開發是一個物聯網業務邏輯的開發工具,通過編排服務節點的方式快速完成簡單的物聯網業務邏輯的設計。本文主要使用:定時觸發、設備和釘釘機器人節點實現對燈泡的定時控制,並將控制後的結果發送給釘釘機器人。本文以官方文檔:定時關燈為基礎,針對文檔中缺少設備屬性上報,釘釘機器人配置參考較老等問題,逐一介紹整個鏈路的完整實現。
Step By Step
1、創建產品和設備,使用Code完成屬性上報
- 1.1 創建產品和設備
- 1.2 使用開源Java MQTT SDK上報屬性,參考鏈接:基於開源JAVA MQTT Client連接阿里雲IoT
import com.alibaba.taro.AliyunIoTSignUtil;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.util.HashMap;
import java.util.Map;
public class IoTDemoPubSubDemo {
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> productKey = <span class="hljs-string">"a1Agp******"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> deviceName = <span class="hljs-string">"LightDevice1"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> deviceSecret = <span class="hljs-string">"RLHDiBljxC7YQE7opM**************"</span>;
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> regionId = <span class="hljs-string">"cn-shanghai"</span>;
<span class="hljs-comment">// 物模型-屬性上報topic</span>
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> pubTopic = <span class="hljs-string">"/sys/"</span> + productKey + <span class="hljs-string">"/"</span> + deviceName + <span class="hljs-string">"/thing/event/property/post"</span>;
<span class="hljs-comment">// 物模型-屬性訂閱topic</span>
private <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> subTopic = <span class="hljs-string">"/sys/"</span> + productKey + <span class="hljs-string">"/"</span> + deviceName + <span class="hljs-string">"/thing/service/property/set"</span>;
private <span class="hljs-keyword">static</span> MqttClient mqttClient;
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span> [] args){
initAliyunIoTClient();
postDeviceProperties();
<span class="hljs-keyword">try</span> {
mqttClient.unsubscribe(pubTopic); <span class="hljs-comment">//取消訂閱</span>
mqttClient.subscribe(subTopic); <span class="hljs-comment">// 訂閱Topic</span>
} <span class="hljs-keyword">catch</span> (MqttException e) {
System.out.println(<span class="hljs-string">"error:"</span> + e.getMessage());
e.printStackTrace();
}
<span class="hljs-comment">// 設置訂閱監聽</span>
mqttClient.setCallback(<span class="hljs-keyword">new</span> MqttCallback() {
@Override
public <span class="hljs-keyword">void</span> connectionLost(Throwable throwable) {
System.out.println(<span class="hljs-string">"connection Lost"</span>);
}
@Override
public <span class="hljs-keyword">void</span> messageArrived(<span class="hljs-built_in">String</span> s, MqttMessage mqttMessage) throws Exception {
System.out.println(<span class="hljs-string">"Sub message"</span>);
System.out.println(<span class="hljs-string">"Topic : "</span> + s);
System.out.println(<span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>(mqttMessage.getPayload())); <span class="hljs-comment">//打印輸出消息payLoad</span>
<span class="hljs-comment">// 訂閱到消息後即刻彙報</span>
System.out.println(<span class="hljs-string">"收到雲端下發指令後向平臺上行消息"</span>);
mqttClient.publish(pubTopic, <span class="hljs-keyword">new</span> MqttMessage((<span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>(mqttMessage.getPayload())).getBytes(<span class="hljs-string">"utf-8"</span>)));
}
@Override
public <span class="hljs-keyword">void</span> deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
}
<span class="hljs-comment">/**
* 初始化 Client 對象
*/</span>
private <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> initAliyunIoTClient() {
<span class="hljs-keyword">try</span> {
<span class="hljs-comment">// 構造連接需要的參數</span>
<span class="hljs-built_in">String</span> clientId = <span class="hljs-string">"java"</span> + System.currentTimeMillis();
<span class="hljs-built_in">Map</span><<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>> params = <span class="hljs-keyword">new</span> HashMap<>(<span class="hljs-number">16</span>);
params.put(<span class="hljs-string">"productKey"</span>, productKey);
params.put(<span class="hljs-string">"deviceName"</span>, deviceName);
params.put(<span class="hljs-string">"clientId"</span>, clientId);
<span class="hljs-built_in">String</span> timestamp = <span class="hljs-built_in">String</span>.valueOf(System.currentTimeMillis());
params.put(<span class="hljs-string">"timestamp"</span>, timestamp);
<span class="hljs-comment">// cn-shanghai</span>
<span class="hljs-built_in">String</span> targetServer = <span class="hljs-string">"tcp://"</span> + productKey + <span class="hljs-string">".iot-as-mqtt."</span>+regionId+<span class="hljs-string">".aliyuncs.com:1883"</span>;
<span class="hljs-built_in">String</span> mqttclientId = clientId + <span class="hljs-string">"|securemode=3,signmethod=hmacsha1,timestamp="</span> + timestamp + <span class="hljs-string">"|"</span>;
<span class="hljs-built_in">String</span> mqttUsername = deviceName + <span class="hljs-string">"&"</span> + productKey;
<span class="hljs-built_in">String</span> mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, <span class="hljs-string">"hmacsha1"</span>);
connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);
} <span class="hljs-keyword">catch</span> (Exception e) {
System.out.println(<span class="hljs-string">"initAliyunIoTClient error "</span> + e.getMessage());
}
}
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> connectMqtt(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> clientId, <span class="hljs-built_in">String</span> mqttUsername, <span class="hljs-built_in">String</span> mqttPassword) throws Exception {
MemoryPersistence persistence = <span class="hljs-keyword">new</span> MemoryPersistence();
mqttClient = <span class="hljs-keyword">new</span> MqttClient(url, clientId, persistence);
MqttConnectOptions connOpts = <span class="hljs-keyword">new</span> MqttConnectOptions();
<span class="hljs-comment">// MQTT 3.1.1</span>
connOpts.setMqttVersion(<span class="hljs-number">4</span>);
connOpts.setAutomaticReconnect(<span class="hljs-literal">true</span>);
// connOpts.setCleanSession(true);
connOpts.setCleanSession(<span class="hljs-literal">false</span>);
connOpts.setUserName(mqttUsername);
connOpts.setPassword(mqttPassword.toCharArray());
connOpts.setKeepAliveInterval(<span class="hljs-number">60</span>);
mqttClient.connect(connOpts);
}
<span class="hljs-comment">/**
* 彙報屬性
*/</span>
private <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> postDeviceProperties() {
<span class="hljs-keyword">try</span> {
<span class="hljs-comment">//上報數據</span>
<span class="hljs-comment">//高級版 物模型-屬性上報payload</span>
System.out.println(<span class="hljs-string">"上報屬性值"</span>);
<span class="hljs-built_in">String</span> payloadJson = <span class="hljs-string">"{\"params\":{\"LightSwitch\":1}}"</span>;
MqttMessage message = <span class="hljs-keyword">new</span> MqttMessage(payloadJson.getBytes(<span class="hljs-string">"utf-8"</span>));
message.setQos(<span class="hljs-number">0</span>);
mqttClient.publish(pubTopic, message);
} <span class="hljs-keyword">catch</span> (Exception e) {
System.out.println(e.getMessage());
}
}
}
1.3 設備狀態查看
2、IoT Studio中進行產品和設備綁定,完整服務開發模塊搭建
- 2.1 綁定產品和設備
2.2 創建服務開發
2.3 釘釘機器人Webhook獲取
- 2.4 部署啟動定時任務
3 測試效果
- 3.1 釘釘群消息
- 3.2 程序運行日誌
Sub message
Topic : /sys/a1Agp/LightDevice1/thing/service/property/set
{"method":"thing.service.property.set","id":"50505571","params":{"LightSwitch":0},"version":"1.0.0"}
收到雲端下發指令後向平臺上行消息