阿里云物联网平台数字孪生功能Quick Start

简介: 数字孪生是物理世界的数字化呈现,可通过构建孪生体来描述设备、流程、系统、场景等业务模型,对物理世界实体信息进行实时采集、运算分析、监控统计等,助您更精准地掌握业务模型动态变化,进而实现对实际生产过程的提效和降本目的。本文从产品创建开始,一步一步演示如何使用物联网平台的数字孪生功能。

Step By Step

1、创建产品和设备
2、使用SDK模拟设备上报消息
3、添加孪生体
4、添加孪生体子节点
5、添加数字映射
6、查看效果


一、创建产品和设备
  • 1.1 控制台购买企业版实例(目前只有企业版实例支持试用数字孪生功能)

图片.png

  • 1.2 实例下面创建产品

图片.png

  • 1.3 为产品定义物模型

图片.png

图片.png

图片.png

  • 1.4 添加设备

图片.png

图片.png

二、使用SDK模拟设备上报消息
  • 2.1 pom.xml
        <dependency>
            <groupId>org.eclipse.paho</groupId>
            <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
            <version>1.1.0</version>
        </dependency>
  • 2.2 AliyunIoTSignUtil.java

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
import java.util.Map;

/**
 * AliyunIoTSignUtil
 */

public class AliyunIoTSignUtil {
    public static String sign(Map<String, String> params, String deviceSecret, String signMethod) {
        //将参数Key按字典顺序排序
        String[] sortedKeys = params.keySet().toArray(new String[] {});
        Arrays.sort(sortedKeys);

        //生成规范化请求字符串
        StringBuilder canonicalizedQueryString = new StringBuilder();
        for (String key : sortedKeys) {
            if ("sign".equalsIgnoreCase(key)) {
                continue;
            }
            canonicalizedQueryString.append(key).append(params.get(key));
        }

        try {
            String key = deviceSecret;
            return encryptHMAC(signMethod,canonicalizedQueryString.toString(), key);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * HMACSHA1加密
     *
     */
    public static String encryptHMAC(String signMethod,String content, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key.getBytes("utf-8"), signMethod);
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        byte[] data = mac.doFinal(content.getBytes("utf-8"));
        return bytesToHexString(data);
    }

    public static final String bytesToHexString(byte[] bArray) {

        StringBuffer sb = new StringBuffer(bArray.length);
        String sTemp;
        for (int i = 0; i < bArray.length; i++) {
            sTemp = Integer.toHexString(0xFF & bArray[i]);
            if (sTemp.length() < 2) {
                sb.append(0);
            }
            sb.append(sTemp.toUpperCase());
        }
        return sb.toString();
    }
}
  • 2.3 DeviceCode Sample
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.util.HashMap;
import java.util.Map;

public class Device1 {
    // 设备三元组信息
    public static String productKey = "gqu********";
    public static String deviceName = "device1";
    public static String deviceSecret = "26b39f328********";
    public static String regionId = "cn-shanghai";
    // 实例id
    public static String instanceId = "iot-06******";

    // 物模型-属性上报topic
    private static String pubTopic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post";
    // 物模型-属性响应topic
    private static String subTopic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply";

    private static MqttClient mqttClient;

    public static void main(String [] args) throws InterruptedException {

        // 初始化Client
        initAliyunIoTClient();
        try {
            mqttClient.subscribe(subTopic); // 订阅Topic
        } catch (MqttException e) {
            System.out.println("error:" + e.getMessage());
            e.printStackTrace();
        }

        // 设置订阅监听
        mqttClient.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable throwable) {
                System.out.println("connection Lost");

            }
            @Override
            public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
                System.out.println("Sub message");
                System.out.println("Topic : " + s);
                System.out.println(new String(mqttMessage.getPayload())); //打印输出消息payLoad
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

            }
        });

        // 属性上报
        for (int i = 0; i < 10000; i++) {
            postDeviceProperties();
            Thread.sleep(1000);
            System.out.println("-------------------" + i);
        }

        Thread.sleep(10000*60);
    }

    /**
     * 初始化 Client 对象
     */
    private static void initAliyunIoTClient() {

        try {
            // 构造连接需要的参数
            String clientId = "java" + System.currentTimeMillis();
            Map<String, String> params = new HashMap<>(16);
            params.put("productKey", productKey);
            params.put("deviceName", deviceName);
            params.put("clientId", clientId);
            String timestamp = String.valueOf(System.currentTimeMillis());
            params.put("timestamp", timestamp);
            String targetServer = "ssl://"+instanceId+".mqtt.iothub.aliyuncs.com:443";
            
            String mqttclientId = clientId + "|securemode=2,signmethod=hmacsha256,timestamp=" + timestamp + "|";
            String mqttUsername = deviceName + "&" + productKey;
            String mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, "hmacsha256");
            
            connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);

        } catch (Exception e) {
            System.out.println("initAliyunIoTClient error " + e.getMessage());
        }
    }

    public static void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception {

        MemoryPersistence persistence = new MemoryPersistence();
        mqttClient = new MqttClient(url, clientId, persistence);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        // MQTT 3.1.1
        connOpts.setMqttVersion(4);
        connOpts.setAutomaticReconnect(false);
        connOpts.setConnectionTimeout(10);
//        connOpts.setCleanSession(true);
        connOpts.setCleanSession(false);

        connOpts.setUserName(mqttUsername);
        connOpts.setPassword(mqttPassword.toCharArray());
        connOpts.setKeepAliveInterval(60);

        mqttClient.connect(connOpts);
    }
    
    /**
     * 汇报属性
     */
    private static void postDeviceProperties() {

        try {
            //上报数据
            //高级版 物模型-属性上报payload
            System.out.println("上报属性值");
            String payloadJson = "{\"params\":{\"temperature\":21}}";
            MqttMessage message = new MqttMessage(payloadJson.getBytes("utf-8"));
            message.setQos(1);
            mqttClient.publish(pubTopic, message);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
  • 2.4 运行结果查看

图片.png

图片.png

三、添加孪生体

图片.png

图片.png

四、添加孪生体子节点
  • 4.1 编辑孪生体

图片.png

  • 4.2 添加子节点

图片.png

  • 4.3 编辑子节点

图片.png

  • 4.4 保存模板

图片.png

  • 4.5 拖拽模板添加子节点(也可以手动重新添加一个)

图片.png

图片.png

  • 4.6 父节点编辑物模型

图片.png

图片.png

  • 4.7 编辑父节点孪生规则

图片.png

图片.png

五、添加数字映射
  • 5.1 输入脚本
//获取设备上报的消息内容。
var payload = payload("json");
//定义Map类型数据,存储键值对数据。
var data = {};
//获取设备名称。
var deviceName = topic(2);
//获取设备上报的温度数据。
var t = payload.items.temperature.value;
//存储不同设备上报的数据。
if (deviceName == "device1") {
  data["temp1"] = t;
}if (deviceName == "device2") {
  data["temp2"] = t;
}

return data;
输入脚本实际是通过规则引擎流转数据的,所以在提取物模型数据的时候,针对自定义topic和系统topic,
//获取设备上报的温度数据。
var t = payload.items.temperature.value;
是会有差异的,具体提取方式可以参考 链接
  • 5.2 输出脚本
[
  {
    "key": "temp1",
    "iotId": "<替换为自己的子节点id>",
    "identifier": "temperature"
  },
  {
    "key": "temp2",
    "iotId": "<替换为自己的子节点id>",
    "identifier": "temperature"
  }
]

图片.png

六、查看效果
  • 6.1 平台物模型数据显示

图片.png

图片.png

  • 6.2 孪生体显示

图片.png

图片.png

图片.png

  • 6.3 日志查看(常见问题排查位置)

图片.png


更多参考

数字孪生概述
使用数字孪生管理园区环境
SQL表达式

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
6月前
|
编解码 移动开发 流计算
【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点
【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点
103 2
|
6月前
|
消息中间件 DataWorks 物联网
MQTT问题之接入阿里云物联网平台如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
409 1
|
19天前
|
物联网 5G
新开的物联网卡还有2G功能吗
关于“新开物联网卡是否还有2G功能”的问题,答案并不是绝对的,因为它取决于多个因素,包括运营商的政策、网络基础设施的升级计划以及物联网卡的具体类型和应用场景。
|
20天前
|
存储 边缘计算 物联网
阿里云物联网平台:推动万物互联的智能化解决方案
随着物联网技术的快速发展,阿里云物联网平台为企业提供了一体化的解决方案,包括设备接入、数据管理和智能应用等核心功能。平台支持海量设备接入、实时数据采集与存储、边缘计算,并具备大规模设备管理、高安全性和开放生态等优势。广泛应用于智能制造、智慧城市和智能家居等领域,助力企业实现数字化转型。
101 5
|
2月前
|
传感器 数据采集 物联网
物联网和仿真技术就是这对“双胞胎”的合体——数字孪生
【9月更文挑战第4天】在科技领域,物联网与仿真技术犹如一对互补的“双胞胎”。物联网擅长采集现实数据,而仿真技术则专长于虚拟模拟。二者结合,诞生了数字孪生,即在虚拟世界中创建与现实对应的“数字双胞胎”,利用物联网数据进行实时仿真分析,预测发展趋势,辅助决策。例如,在智能工厂中,当设备故障时,数字孪生可通过仿真分析提前发现问题并提出解决方案,减少实际损失。未来,数字孪生将在各领域发挥更大作用,带来更多便利。
53 0
|
4月前
|
存储 运维 监控
阿里云物联网平台的优势
【7月更文挑战第19天】阿里云物联网平台的优势
72 1
|
5月前
|
传感器 数据采集 物联网
数字孪生:物联网与仿真技术的融合
【6月更文挑战第5天】物联网与仿真技术结合形成数字孪生,它在虚拟世界中复制现实对象,利用物联网数据进行仿真分析,预测发展趋势。以智能工厂为例,设备故障可通过数字孪生模型预判和解决,减少实际损失。示例代码展示了如何基于物联网数据在模型中进行仿真分析,揭示数字孪生在提升决策效率和未来潜力方面的价值。
119 3
|
6月前
|
Cloud Native 安全 物联网
【阿里云云原生专栏】云边端一体化:阿里云如何利用云原生技术赋能物联网
【5月更文挑战第22天】阿里云借助云原生技术赋能物联网,实现云边端一体化,提升系统弹性与敏捷性。通过容器化部署,保证高可用性与可靠性。在智能交通等领域,阿里云提供高效解决方案,实现实时数据分析与决策。代码示例展示如何使用阿里云服务处理物联网数据。同时,阿里云重视数据安全,采用加密和访问控制保障数据隐私。丰富的工具和服务支持开发者构建物联网应用,推动技术广泛应用与发展。
360 1
|
6月前
|
消息中间件 存储 JavaScript
阿里云IOC物联网异步处理基础概念
该内容介绍了异步处理基础和消息队列的相关概念。首先,同步处理指任务完成后才能执行其他操作,而异步则允许任务并行执行,不阻塞程序。异步能提高系统并发性和响应性,但也增加复杂性和资源消耗。接着,提到了消息队列,包括生产者、消费者、队列、broker和topic等概念,并指出在IoT中,设备作为生产者发送消息到特定topic,消费者从队列获取数据。最后,简要介绍了AMQP协议,它是用于应用程序间消息传递的开放标准,常用于分布式系统和物联网,如RabbitMQ和Apache Qpid。课程将以Apache Qpid为例接收IoT数据。
222 6
阿里云IOC物联网异步处理基础概念
|
6月前
|
监控 物联网
LabVIEW开发基于物联网的多功能功率分析仪
LabVIEW开发基于物联网的多功能功率分析仪
47 2

相关产品

  • 物联网平台