创建开源物联网数字孪生平台

2020-05-25 01:49:36

在上一篇博客文章中,我介绍了利用DAPR的虚拟演员创建数字双胞胎表示的概念。现在,这是一个关于这有多可行的理论帖子。当然,任何理论上的东西都应该付诸实践,这就是我这个周末一直在做的事情,😉。

对于那些想要立即看到结果的人,请随时查看以下视频以及源代码:https://github.com/roadwork/roadwork-iot.。

回顾建议的体系结构,我们可以看到我们必须构建以下组件:

注意:我的选择是使用Azure IoT Hub作为设备管理器,但是这种架构可以在任何设备管理器上运行,但是需要特定的遥测处理器。

物联网集线器:我们需要一个能够管理不同设备并允许我们处理这些事件的集线器。

遥测处理器:遥测处理器将处理传入的消息并将状态数据转发给虚拟参与者。我选择在Node.js中编写这段代码。

参与者服务:我们需要用于DAPR的能够处理参与者请求的参与者服务。在我们的例子中,我们将用C#编写这段代码。

展示台:最后,我们需要一个能够直观地呈现演员状态的展示台。在这里,我将在后端使用Next.js和Node.js以及Express。

遥测处理器相当简单,因为它充当一种路由器,接收事件并尽快将其转发给DAPR Virtual Actor实现(RoadworkActorService)。

在这里,dapr为我们完成了繁重的任务,我们只需利用fetch API向http://localhost:${DAPR_PORT}/v1.0/actors/${actorType}/${deviceId}/method/SaveData发送一个请求,它将通过一个savedata方法自动更新参与者状态。

处理这些事件并应用元数据层(用于设备ID、上次更新时间、源、…等信息)。

为了提供代码如何实现这一点的简要概述,我包含了以下代码片段。不过,您可以在以下网址找到完整的源代码:https://github.com/Roadwork/Roadwork-IoT/blob/master/src/dapr/telemetry-processor/azure/index.js。

//摄取事件(在`message`下)//.//创建包装器const wrapper={};wrapper.LastUpdate=lastUpdate.。toString();wrapper.Source=";azure-iothub";;wrapper.DeviceId=deviceID;wrapper.State=JSON。stringify(message.body);//为我们的虚拟Actor调用SaveData方法const res=aWait Fetch(`http://localhost:${DAPR_PORT}/v1.0/Actors/${ActionType}/${deviceID}/Method/SaveData`,{method:';post';,Header:{";Content-Type";:";Application/json";},Body:json。stringify(包装器)});

对于我们的Actor Service,我们只需实现由DAPRC#接口提供的接口(如此处的示例中所示:https://github.com/dapr/dotnet-sdk/tree/master/samples/Actor).。我对此进行了调整,以使用以下界面:

public class{public string deviceID{get;set;}public string Source{get;set;}public string LastUpdate{get;set;}public string State{get;set;}public Override String ToString(){var deviceID=this.DeviceId??";null";var source=this.source??";null";;var lastUpdateed=this.LastUpdate??";null";;var state=this.State??";null";;return$";[{source}][{deviceID}]{state}";;}}。

DAPR将所有内容保存到状态存储,要访问它,我们可以使用此状态存储的原生SDK。在我们的例子中,我们使用的是Redis。

我们唯一需要关注的是DAPR如何保存这些状态。每个参与者的密钥以分隔符||保存,格式为:DAPR_SERVICE||ACTOR_TYPE||ACTOR_ID||STATE_NAME。

在我们的前端,我们使用了NextJS,这是一个Reaction框架。这使得我们很容易实现我们的页面,并通过NPM run dev运行它。一旦实现,我们将利用一个setInterval,它将每秒调用Web后端。

注意:setInterval可能不是实时工作的最佳选择。然而,由于它的优化反应,状态更新效率很高。

现在一切都创建好了,我们可以通过以下命令启动不同的工具:

#启动遥测处理器src/dapr/遥测处理器/azuredapr run--app-id rw遥测处理器--azure--端口3500node index.js";IOTHUB_BUDUD_IN_EVENT_ENDPOINT";#start RoadworkTwinActor Service src/dapr/roadwork-actor-service/RoadworkTwinActordapr Run--端口3501--app-id RW-Actor-SERVICE--APP-PORT 5000点网运行#启动WEB后端。

这将启动我们的服务。我们现在可以连接设备,如下所示,这将自动开始旋转演员,并将他们可视化在前端。

目前,编写的框架允许我始终获得所连接设备的最新状态。在接下来的步骤中,我将更深入地研究如何使用定义语言(如此处所述)完成这种表示,以及我们如何利用这一点来降低强化学习算法的障碍,直接通过数字孪生框架进行推理/训练。但稍后将在一个全新的项目😉中详细介绍这一点。