数字孪生教程:数字孪生框架 Eclipse Ditto 快速上手指南

Eclipse Ditto 及数字孪生

Eclipse Ditto 是什么?

Eclipse Ditto 是物联网中的一项技术,实现名为 “数字孪生” 的软件模式。

数字孪生是一种虚拟的基于云的虚拟世界对象(真实世界 “事物”,例如传感器、智能加热、连接汽车、智能电网、电动汽车充电站等设备)的代表。

这项技术可能映射数百万和数十亿数字双胞胎,数字世界中存在物理 “事物”。它简化了为软件开发人员开发 IoT 解决方案,因为他们不需要知道物理 “事物” 的连接方式或位置。

使用 Ditto,一个东西(Thing)可以通过其数字孪生作为任何其他网络服务使用。

Eclipse Ditto 不是什么?

Ditto 不是另一个完整的物联网平台。 它不提供在 IoT 网关上运行的软件,也不定义或实现 IoT 协议以便与设备进行通信。

其重点在于通过提供 Web API,来简化与已连接(例如,通过 Eclipse Hono)设备的连接以及来自客户应用程序或其他后端软件的 “事物” 的后端场景。

它也没有具体说明哪些数据或哪个结构是 “物联网” 必须提供的。

什么时候使用数字孪生?

使用它来获得一个完整的,认证的 Web API(HTTP 和 WebSocket)来访问你的“事物”和他们最近报告的状态。

想象一下,您正在构建物联网解决方案。 假设您使用硬件(例如传感器或执行器)和软件(例如手机或网络应用程序)来解决客户的问题。

在这种情况下,你有几个地方可以实现该软件:

  • 在硬件上或附近,例如 在使用 C/C++ 的 Arduino或使用 Python 的 Raspberry PI 上,
  • 可选地在建立因特网连接的网关上(例如基于 Eclipse Kura)
  • 在使用 Java、Javascript、Swift等的移动或 Web 应用程序中,
  • 在“后端”履行好几项责任
    • 提供从硬件抽象的API,
    • 在硬件和客户应用之间路由请求,
    • 确保只有授权的访问,
    • 将上次报告的硬件状态保持为高速缓存,并在硬件当前未连接时提供数据,
    • 向有关方面(例如其他后端服务)通知变化,
    • ...

Ditto 重点解决典型的“后端”在这种情况下的责任。

其设计目标是将物联网解决方案从实施和运营自定义后端的需求中解放出来。相反地,通过使用 Eclipse Ditto,他们可以专注于业务需求,将设备连接到云/后端以及实施业务应用程序。

数字孪生

对于 Eclipse Ditto 来说,数字孪生是一个概念,用于抽象具有包括其数字表示在内的所有功能和方面的真实世界资产/设备。

一个数字孪生

  • 镜像物理资产/设备
  • 提供围绕设备的方面 + 服务
  • 保持真实和数字世界的同步
  • 可以应用于工业和以消费者为中心的物联网场景

Eclipse Ditto 构建

使用 Apache Maven 构建

为了用 Maven 构建 Ditto,你需要:

  • JDK 8 >= 1.8.0_92(由于旧版本 JDK 中的错误,您将收到编译错误),
  • 安装了 Apache Maven 3.x,
  • 一个正在运行的 Docker 守护进程(最低版本 17.06)。
# if you have the Docker daemon running with remote access enabled (e.g. in a Vagrant box or on localhost):
mvn clean install -Pdocker-build-image -Ddocker.daemon.hostname=<ip/host of your Docker daemon>

# if you have the Docker daemon running on your machine and you are running on Unix, you can also connect against the Docker socket:
mvn clean install -Pdocker-build-image -Ddocker.daemon.url=unix:///var/run/docker.sock

使用 Docker 构建

为了用 Docker 构建 Ditto,你需要一个正在运行的 Docker 守护进程(最低版本 17.06)。

如果您没有适用的 Maven 和 JDK 版本,您也可以使用 Maven Docker 镜像作为构建环境。在 Linux 或 macOS 主机上,您可以像下面这样公开 Docker 套接字(socket)到 Maven:

# Start up the Docker image with maven:
docker run -it --rm --name mvn-ditto \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD":/usr/src/mymaven -w /usr/src/mymaven \
    -u root \
    maven:3.5.0-jdk-8 \
    /bin/bash

# From within the Docker image, build the Docker images:
mvn clean install -Pdocker-build-image \
    -Ddocker.daemon.url=unix:///var/run/docker.sock

# Docker images are now available on your Docker host

运行 Ditto

启动 Ditto

为了启动 Ditto,你需要:

  • 一个正在运行的 Docker 守护进程(最低版本 17.06),
  • Docker Compose安装(最低版本 1.14),
  • Ditto 的 Docker 镜像
    • 可以按照上一步来建造它们,
    • 或者使用 Docker Hub 上的预建 Ditto 镜像。
# switch to the docker/ directory:
cd docker/
docker-compose up -d

在启动后检查日志:

docker-compose logs -f

你现在正在运行的有:

  • 一个 MongoDB 作为 Ditto 的后备数据存储(不是 Ditto 的一部分,但是通过 Docker 启动),
  • Ditto 微服务:
    • Policies
    • Things
    • Thing-Search
    • Gateway
  • 作为反向代理的 nginx 实例,在端口 8080 上执行一个简单的“基本认证”
    • 包括 http://localhost:8080 上的一些静态 HTTP + API 文档。

停止 Ditto

这个命令会在不从 MongoDB 数据库中删除数据的情况下,停止 Ditto。

docker-compose stop

使用 Ditto 作为数字孪生服务

在启动 Ditto 之后,我们为您的数字孪生准备了一个 HTTP 和 WebSocket API。

数字孪生 API 示例:

假设我们要为汽车创建一个数字孪生。数字孪生该保存静态元数据和动态状态数据。国家数据应该像现实世界的数据一样频繁变化。

这些静态和动态类型的数据在 Ditto 模型中被映射为“属性”(attributes,对于静态元数据)和“特征”(features,对于动态状态数据)。一些元数据和状态数据的 JSON 表示可能看起来像这样:

{
  "attributes": {
    "manufacturer": "ACME",
    "VIN": "0815666337"
  },
  "features": {
    "transmission": {
      "properties": {
        "automatic": true,
        "mode": "eco",
        "cur_speed": 90,
        "gear": 5
      }
    },
    "environment-scanner": {
      "properties": {
        "temperature": 20.8,
        "humidity": 73,
        "barometricPressure": 970.7,
        "location": {
          "longitude": 47.682170,
          "latitude": 9.386372
        },
        "altitude": 399
      }
    }
  }
}

背景:Ditto 只知道 “属性”(attributes)和“特征”(features)。

在 “属性”(元数据)内部,我们可以使用我们需要的任何 JSON 值添加尽可能多的 JSON 密钥。

在 “功能”(状态数据)里面,我们可以添加尽可能多的功能,但是每个功能都需要一个“属性” JSON 对象。在这个 JSON 对象的内部,我们可以使用我们需要的任何 JSON 值来添加尽可能多的 JSON 键。

创建数字孪生

我们使用 cURL 来为上面的例子创建了一个 Thing。 基本认证将使用用户 “ditto” 的凭证。这些凭据默认在通过 “docker” 启动的 nginx 中创建。(请参阅 ditto/docker/README.md

curl -u ditto:ditto -X PUT -d '{
   "attributes": {
     "manufacturer": "ACME",
     "VIN": "0815666337"
   },
   "features": {
     "transmission": {
       "properties": {
         "automatic": true, 
         "mode": "eco",
         "cur_speed": 90, 
         "gear": 5
       }
     },
     "environment-scanner": {
       "properties": {
         "temperature": 20.8,
         "humidity": 73,
         "barometricPressure": 970.7,
         "location": {
           "longitude": 47.682170,
           "latitude": 9.386372
         },
         "altitude": 399
       }
     }
   }
 }' 'http://localhost:8080/api/1/things/org.eclipse.ditto:fancy-car'

结果是一个数字孪生标记。事物 ID 是 org.eclipse.ditto:fancy-car。一个 ID 必须总是在:之前包含一个名称空间(namespace)。 这样的事情更容易组织。

查询数字孪生

通过使用指定的 JSON 格式将数字孪生创建为 Thing,Ditto 隐式地为我们的 Thing 提供了一个 API。

对于我们知道 ID 的事物,我们可以简单地通过 ID 来查询它们:

curl -u ditto:ditto -X GET 'http://localhost:8080/api/1/things/org.eclipse.ditto:fancy-car'

# if you have python installed, that's how to get a prettier response:
curl -u ditto:ditto -X GET 'http://localhost:8080/api/1/things/org.eclipse.ditto:fancy-car' | python -m json.tool

查询特定的状态

为 Thing 创建的 API 还为每个属性和特征属性提供 HTTP 端点。

这样,我们可以例如只是检索我们的花式汽车 cur_speed

curl -u ditto:ditto -X GET 'http://localhost:8080/api/1/things/org.eclipse.ditto:fancy-car/features/transmission/properties/cur_speed'

更新特定的状态

我们可以简单地使用 HTTP API 来更新一个属性或特性属性,例如 更新 cur_speed77

curl -u ditto:ditto -X PUT -d '77' 'http://localhost:8080/api/1/things/org.eclipse.ditto:fancy-car/features/transmission/properties/cur_speed'

搜索所有的事物

当我们丢失了我们已经创建的东西的概况时,我们可以使用搜索 HTTP 端点,例如 使用名称为 “ACME” 的相同制造商搜索所有东西:

curl -u ditto:ditto -X GET 'http://localhost:8080/api/1/search/things?filter=eq(attributes/manufacturer,"ACME")'
尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.