具有不同协议的物联网设备可以使用物联网代理相互 "talk" 吗?

Can IoT device with different protocols use IoT Agents to "talk" with each other?

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

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

  1. B 向订阅该属性的 Orion Context Broker 报告其测量结果。就像是 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 代理,并且由于重复...

  3. 无法在每个代理处配置相同的实体

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

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

如果您想对第二个聚合实体的状态建模,那么您也可以这样做 - 只需 subscribe 更改设备上下文和 Upsert将值和元数据移交给另一个实体。

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
}'

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

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 link回到设备

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