【问题标题】:Can IoT device with different protocols use IoT Agents to "talk" with each other?具有不同协议的物联网设备可以使用物联网代理相互“对话”吗?
【发布时间】:2020-02-02 15:50:11
【问题描述】:

我正在使用 FIWARE Orion、IoT Agent JSON 和 IoT Agent OPC UA。我想知道,既然所有的 IoT Agent 都与 Orion 连接并将不同的 IoT 协议映射到 NGSI,那么使用不同协议的设备是否可以在不添加任何额外应用程序逻辑的情况下相互通信?

让我们考虑一个 MQTT 设备 A 和一个 OPC UA 服务器 B,例如,是否有可能:

  1. B 将其测量值报告给 Orion Context Broker,A 订阅该属性。就像是 B-->IoT Agent OPC UA-->Orion-->IoT Agent JSON-->mosquitto-->A (我尝试进行上下文提供程序注册。但是,B 实体属性(orion:1026/v2/B/attrs/XXX)的 url 显然不起作用,因为 Orion 会将 POST 发送到不存在的 orion:1026/v2/B/attrs/XXX/op/query),以及提供的属性没有在 IoT 代理 JSON 中进行配置...我觉得我的方向完全错误)

  2. A 和 B 访问同一实体并将其测量结果报告给 Orion 中的该实体。由于 A 和 B 都需要自己的 IoT 代理,并且由于重复,无法在每个代理上配置相同的实体...

试图用多个协议的设备搞乱一个实体是不是一个非常糟糕的主意...非常感谢您提前回答我的疑问!!!

【问题讨论】:

  • 也许添加一个图表(显示 A、B 等)会很清楚。

标签: fiware fiware-orion


【解决方案1】:

每个 NGSI 实体都应该映射到在现实世界中具有状态的东西。在您的情况下,您的数据模型应该基于Device,并且您应该有一个单独的基于 OPC-UA 的 Device 实体和第二个单独的 JSON Device 实体。这些是您系统中的低级实体,它们会保存来自 IoT 设备的读数,还会保存其他数据(例如电池电量或文档链接等)。

如果您想对第二个聚合实体的状态进行建模,那么您也可以这样做 - 只需 subscribe 更改设备中的上下文并将值和元数据更新到其他实体。

curl --location --request POST 'http://localhost:1027/v2/subscriptions/' \
--header 'Content-Type: application/json' \
--header 'fiware-service: openiot' \
--data-raw '{
  "description": "Notify Subscription Listener of Lamp context changes",
  "subject": {
    "entities": [
      {
        "idPattern": "Lamp.*"
      }
    ],
    "condition": {
      "attrs": ["luminosity"]
    }
  },
  "notification": {
    "http": {
      "url": "http://tutorial:3000/device/subscription/luminosity"
    },
    "attrs": ["luminosity", "controlledAsset", "supportedUnits"]
  },
  "throttling": 5
}'

可以在 here 找到从监听端点 (/device/subscription/luminosity) 执行工作的示例代码 - 这是一个仍在进行中的教程,因此目前缺少完整的文档。

function shadowDeviceMeasures(req, res) {
  const attrib = req.params.attrib;

  async function copyAttributeData(device, index) {
    await upsertDeviceEntityAsLD(device);
    if (device[attrib]) {
      await upsertLinkedAttributeDataAsLD(device, 'controlledAsset', attrib);
    }
  }

  req.body.data.forEach(copyAttributeData);
  res.status(204).send();
}

这里的重点是您可以(并且应该)考虑不同级别的数据实体 -

  • 我有一个温度计设备 - 它正在发送温度读数。它有一个temperature 属性
  • 我有一个 Building - 它里面有一个温度计 - Building 有一个temperature 属性 metadata.providedBy 链接回来到设备

根据您的用例,您可能只需要在一层考虑实体,或者您可能需要同时使用两者。

【讨论】:

  • 您好,非常感谢您的建议!我觉得思考不同层次的实体应该是我疑惑的方向!有没有关于这个metadata.providedBy 功能的示例或教程?这是 NGSI v2 还是 NGSI LD?在您的示例中,如果我查询 Building 关于 temperature 属性并且响应显示来自 Device 的实际值,是否可行?
  • Working-with-Linked-Data 教程还没有完成——我还没有写评论。您正在寻找的代码可以在here 找到。在Malaga Bootcamp 中介绍了 NGSI-v2 的等效版本
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多