Eclipse Ditto 是物联网中的一项技术,实现名为 “数字孪生” 的软件模式。
数字孪生是一种虚拟的基于云的虚拟世界对象(真实世界 “事物”,例如传感器、智能加热、连接汽车、智能电网、电动汽车充电站等设备)的代表。
这项技术可能映射数百万和数十亿数字双胞胎,数字世界中存在物理 “事物”。它简化了为软件开发人员开发 IoT 解决方案,因为他们不需要知道物理 “事物” 的连接方式或位置。
使用 Ditto,一个东西(Thing)可以通过其数字孪生作为任何其他网络服务使用。
Ditto 不是另一个完整的物联网平台。 它不提供在 IoT 网关上运行的软件,也不定义或实现 IoT 协议以便与设备进行通信。
其重点在于通过提供 Web API,来简化与已连接(例如,通过 Eclipse Hono)设备的连接以及来自客户应用程序或其他后端软件的 “事物” 的后端场景。
它也没有具体说明哪些数据或哪个结构是 “物联网” 必须提供的。
使用它来获得一个完整的,认证的 Web API(HTTP 和 WebSocket)来访问你的“事物”和他们最近报告的状态。
想象一下,您正在构建物联网解决方案。 假设您使用硬件(例如传感器或执行器)和软件(例如手机或网络应用程序)来解决客户的问题。
在这种情况下,你有几个地方可以实现该软件:
Ditto 重点解决典型的“后端”在这种情况下的责任。
其设计目标是将物联网解决方案从实施和运营自定义后端的需求中解放出来。相反地,通过使用 Eclipse Ditto,他们可以专注于业务需求,将设备连接到云/后端以及实施业务应用程序。
对于 Eclipse Ditto 来说,数字孪生是一个概念,用于抽象具有包括其数字表示在内的所有功能和方面的真实世界资产/设备。
一个数字孪生
为了用 Maven 构建 Ditto,你需要:
# 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 构建 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,你需要:
# switch to the docker/ directory:
cd docker/
docker-compose up -d
在启动后检查日志:
docker-compose logs -f
你现在正在运行的有:
这个命令会在不从 MongoDB 数据库中删除数据的情况下,停止 Ditto。
docker-compose stop
在启动 Ditto 之后,我们为您的数字孪生准备了一个 HTTP 和 WebSocket 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_speed
到 77
:
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")'
观光\评论区