天天看点

阿里云IoT Studio服务开发定时关灯功能示例Demo

作者:俏巴

概述

IoT Studio服务开发是一个物联网业务逻辑的开发工具,通过编排服务节点的方式快速完成简单的物联网业务逻辑的设计。本文主要使用:定时触发、设备和钉钉机器人节点实现对灯泡的定时控制,并将控制后的结果发送给钉钉机器人。本文以官方文档: 定时关灯 为基础,针对文档中缺少设备属性上报,钉钉机器人配置参考较老等问题,逐一介绍整个链路的完整实现。

Step By Step

1、创建产品和设备,使用Code完成属性上报

  • 1.1 创建产品和设备
阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo
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>&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">String</span>&gt; params = <span class="hljs-keyword">new</span> HashMap&lt;&gt;(<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">"&amp;"</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 设备状态查看

阿里云IoT Studio服务开发定时关灯功能示例Demo

2、IoT Studio中进行产品和设备绑定,完整服务开发模块搭建

  • 2.1 绑定产品和设备
阿里云IoT Studio服务开发定时关灯功能示例Demo

2.2 创建服务开发

阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo

2.3 钉钉机器人Webhook获取

阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo
阿里云IoT Studio服务开发定时关灯功能示例Demo
  • 2.4 部署启动定时任务
阿里云IoT Studio服务开发定时关灯功能示例Demo

3 测试效果

  • 3.1 钉钉群消息
阿里云IoT Studio服务开发定时关灯功能示例Demo
  • 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"}
收到云端下发指令后向平台上行消息           

参考链接

什么是IoT Studio