分享|EdgeX Core Service 核心服务之 Core Command 命令
本文将介绍核心服务之核心命令: Core Command

核心服务提供了 EdgeX 北向和南向之间的中介。正如这些服务的名称所暗示的,它们是 EdgeX 功能的“核心”。核心服务是连接“事物”、收集的传感器数据和 EdgeX 配置的固有知识所在。

本文将介绍核心服务之核心命令: Core Command

EdgeX Foundry 在下面将统一简称为 EdgeX

本文内容大部分来自官方文档:EdgeX Core Services

核心由以下微服务组成:

  • Core Data 核心数据:持久存储库和相关管理服务,用于从南向对象收集的数据。
  • Command 命令:促进和控制从北向到南向的驱动请求的服务。
  • Metadata 元数据:有关连接到 EdgeX Foundry 的对象的元数据的存储库和关联管理服务。元数据提供了配置新设备并将其与其拥有的设备服务配对的功能。
  • Registry & Configuration 注册表和配置:为其他 EdgeX Foundry 微服务提供有关系统内关联服务和微服务配置属性(即初始化值存储库)的信息。

目的

Command 命令微服务(通常称为命令和控制微服务)允许发出命令或操作设备的指令:

  • EdgeX Foundry 中的其他微服务(例如 边缘分析或规则引擎微服务)
  • 可能与存在于同一系统上的其他 EdgeX Foundry(应用程序例如,需要管理代理来关闭传感器)
  • 对于任何需要命令这些设备的外部系统(例如,一个基于云的应用程序确定了需要修改一组设备上的设置)

命令微服务以通用的、规范化的方式公开命令,简化与设备通信的方法。有两种类型的命令可以发送到设备。

  • GET 命令从设备请求数据,这通常用于请求设备最新的传感器读数。
  • SET 命令请求采取操作或启动设备或在设备上设置某些配置。

在大多数情况下,GET 命令是对设备最新传感器读数的简单请求。因此,请求通常是无参数的(请求中不需要参数或正文)。SET 命令需要一个请求正文,其中正文提供用作请求中的参数的键/值对数组值(即 {"additionalProp1": "string", "additionalProp2": "string"})。

命令微服务从元数据服务获取有关设备的信息。命令服务始终通过设备服务将命令(GET 或 SET)中继到设备。命令服务从不直接与设备通信。因此,命令微服务是从 EdgeX 北向应用(例如分析或应用服务)到协议特定设备服务和关联设备的命令或操作请求的代理服务。

虽然命令服务目前不属于其职责的一部分,但它可以在设备周围提供一层保护。可以添加额外的安全性,不允许与设备进行未经授权的交互(通过设备服务)。命令服务还可以调节设备上的请求数量,以免设备不堪重负——甚至可能缓存响应,以避免唤醒设备,除非有特殊必要。

入门

通过消息传递命令

介绍

以前,从第三方系统(企业应用程序、云应用程序等)到 EdgeX 的通信只能通过 REST 完成,以便驱动设备或从传感器获取最新信息。第三方系统对命令服务进行 REST 调用,然后将请求中继到也使用 REST 的设备服务。没有内置方法可以向 EdgeX 或其管理的设备/传感器发出基于消息的请求。

从 Levski(V2.3) 版本开始,核心命令服务添加了对外部 MQTT 连接的支持(与应用程序服务提供外部 MQTT 连接的方式相同), 这将使其能够充当内部消息总线(通过 MQTT 或 Redis Pub/Sub 实现)和外部 MQTT 消息总线之间的桥梁。

作为消息总线桥的核心命令

Core Command 服务将作为 EdgeX 入口点,通过消息总线向南向设备发送命令。

图像

第三方系统不应被授予访问 EdgeX 内部消息总线的权限。因此,为了通过消息总线(特别是 MQTT)实现通信,命令服务需要从第三方或外部 MQTT 主题获取消息,并将它们内部传递到 EdgeX 内部消息总线,最终将它们路由到设备服务然后到设备/传感器(南向)。

相反,来自南向设备的响应消息也将通过内部 EdgeX 消息总线发送到命令服务,然后它们可以桥接到外部 MQTT 主题并响应第三方系统请求者。

消息结构

由于大多数消息总线协议缺乏通用消息头机制(如 HTTP),因此提供请求/响应元数据是通过定义与每个请求/响应关联的 MessageEnvelope 对象来完成的。消息主题名称的作用类似于 REST 请求中的 HTTP 路径和方法。也就是说,主题名称指定任何命令请求的设备接收者,就像 HTTP 请求中的路径一样。

图像

消息封装

下面是命令查询请求的 MessageEnvelope 示例:

{
  "apiVersion": "v3",
  "RequestId": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "ContentType": "application/json",
  "QueryParams": {
    "offset": "0",
    "limit": "10"
  }
}

下面是命令查询响应的 MessageEnvelope 示例:

{
  "ApiVersion": "v3",
  "RequestID": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "ErrorCode": 0,
  "Payload": "...",
  "ContentType": "application/json"
}

格式化请求和响应的消息共享一个公共的基础结构。最外层的 JSON 对象表示消息封装,用于传递有关请求/响应的元数据,包括 ApiVersionRequestIDCorrelationID, ..等等。

Payload 字段包含 base64 编码的响应正文。

ErrorCode 字段提供错误指示。ErrorCode 将为 0(无错误)或 1(指示错误)作为错误条件的两个枚举值。当出现错误时(ErrorCode 设置为 1),Payload 包含一个消息字符串,指示有关错误的更多信息。如果没有错误(ErrorCode 0),则 Payload 中没有消息字符串。

命令查询

Core Command 服务订阅 QueryRequestTopic 并将响应发布到配置文件中定义的 QueryResponseTopic。收到请求后,Core Command 服务将尝试从请求主题级别解析 <device-name>。第三方系统或应用程序必须发布命令查询请求消息并订阅来自相同主题的响应。以下是 Core Command 使用的默认主题命名:

  • 订阅命令查询请求主题:edgex/commandquery/request/#
  • 发布命令查询响应主题:edgex/commandquery/response

请求主题中的最后一个主题级别必须是 #(all) 或要查询的 <device-name>

按设备名称查询

通过消息传递按设备名称查询设备核心命令的示例:

向外部 MQTT 代理发送关于主题的查询请求消息 edgex/commandquery/request/Random-Boolean-Device

{
  "apiVersion": "v3",
  "ContentType": "application/json",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "RequestId": "e6e8a2f4-eb14-4649-9e2b-175247911369"
}

从外部 MQTT 代理接收有关主题的查询响应消息 edgex/commandquery/response

{
  "ReceivedTopic": "",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "ApiVersion": "v3",
  "RequestID": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "ErrorCode": 0,
  "Payload": "eyJhcGlWZXJzaW9uIjoidjIiLCJyZXF1ZXN0SWQiOiJlNmU4YTJmNC1lYjE0LTQ2NDktOWUyYi0xNzUyNDc5MTEzNjkiLCJzdGF0dXNDb2RlIjoyMDAsImRldmljZUNvcmVDb21tYW5kIjp7ImRldmljZU5hbWUiOiJSYW5kb20tQm9vbGVhbi1EZXZpY2UiLCJwcm9maWxlTmFtZSI6IlJhbmRvbS1Cb29sZWFuLURldmljZSIsImNvcmVDb21tYW5kcyI6W3sibmFtZSI6IldyaXRlQm9vbFZhbHVlIiwic2V0Ijp0cnVlLCJwYXRoIjoiL2FwaS92Mi9kZXZpY2UvbmFtZS9SYW5kb20tQm9vbGVhbi1EZXZpY2UvV3JpdGVCb29sVmFsdWUiLCJ1cmwiOiJodHRwOi8vZWRnZXgtY29yZS1jb21tYW5kOjU5ODgyIiwicGFyYW1ldGVycyI6W3sicmVzb3VyY2VOYW1lIjoiQm9vbCIsInZhbHVlVHlwZSI6IkJvb2wifSx7InJlc291cmNlTmFtZSI6IkVuYWJsZVJhbmRvbWl6YXRpb25fQm9vbCIsInZhbHVlVHlwZSI6IkJvb2wifV19LHsibmFtZSI6IldyaXRlQm9vbEFycmF5VmFsdWUiLCJzZXQiOnRydWUsInBhdGgiOiIvYXBpL3YyL2RldmljZS9uYW1lL1JhbmRvbS1Cb29sZWFuLURldmljZS9Xcml0ZUJvb2xBcnJheVZhbHVlIiwidXJsIjoiaHR0cDovL2VkZ2V4LWNvcmUtY29tbWFuZDo1OTg4MiIsInBhcmFtZXRlcnMiOlt7InJlc291cmNlTmFtZSI6IkJvb2xBcnJheSIsInZhbHVlVHlwZSI6IkJvb2xBcnJheSJ9LHsicmVzb3VyY2VOYW1lIjoiRW5hYmxlUmFuZG9taXphdGlvbl9Cb29sQXJyYXkiLCJ2YWx1ZVR5cGUiOiJCb29sIn1dfSx7Im5hbWUiOiJCb29sIiwiZ2V0Ijp0cnVlLCJzZXQiOnRydWUsInBhdGgiOiIvYXBpL3YyL2RldmljZS9uYW1lL1JhbmRvbS1Cb29sZWFuLURldmljZS9Cb29sIiwidXJsIjoiaHR0cDovL2VkZ2V4LWNvcmUtY29tbWFuZDo1OTg4MiIsInBhcmFtZXRlcnMiOlt7InJlc291cmNlTmFtZSI6IkJvb2wiLCJ2YWx1ZVR5cGUiOiJCb29sIn1dfSx7Im5hbWUiOiJCb29sQXJyYXkiLCJnZXQiOnRydWUsInNldCI6dHJ1ZSwicGF0aCI6Ii9hcGkvdjIvZGV2aWNlL25hbWUvUmFuZG9tLUJvb2xlYW4tRGV2aWNlL0Jvb2xBcnJheSIsInVybCI6Imh0dHA6Ly9lZGdleC1jb3JlLWNvbW1hbmQ6NTk4ODIiLCJwYXJhbWV0ZXJzIjpbeyJyZXNvdXJjZU5hbWUiOiJCb29sQXJyYXkiLCJ2YWx1ZVR5cGUiOiJCb29sQXJyYXkifV19XX19",
  "ContentType": "application/json",
  "QueryParams": {}
}

Base64 解码 Payload

{
  "apiVersion": "v3",
  "requestId": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "statusCode": 200,
  "deviceCoreCommand": {
    "deviceName": "Random-Boolean-Device",
    "profileName": "Random-Boolean-Device",
    "coreCommands": [
      {
        "name": "WriteBoolValue",
        "set": true,
        "path": "/api/v3/device/name/Random-Boolean-Device/WriteBoolValue",
        "url": "http://edgex-core-command:59882",
        "parameters": [
          { "resourceName": "Bool", "valueType": "Bool" },
          { "resourceName": "EnableRandomization_Bool", "valueType": "Bool" }
        ]
      },
      {
        "name": "WriteBoolArrayValue",
        "set": true,
        "path": "/api/v3/device/name/Random-Boolean-Device/WriteBoolArrayValue",
        "url": "http://edgex-core-command:59882",
        "parameters": [
          { "resourceName": "BoolArray", "valueType": "BoolArray" },
          {
            "resourceName": "EnableRandomization_BoolArray",
            "valueType": "Bool"
          }
        ]
      },
      {
        "name": "Bool",
        "get": true,
        "set": true,
        "path": "/api/v3/device/name/Random-Boolean-Device/Bool",
        "url": "http://edgex-core-command:59882",
        "parameters": [{ "resourceName": "Bool", "valueType": "Bool" }]
      },
      {
        "name": "BoolArray",
        "get": true,
        "set": true,
        "path": "/api/v3/device/name/Random-Boolean-Device/BoolArray",
        "url": "http://edgex-core-command:59882",
        "parameters": [
          { "resourceName": "BoolArray", "valueType": "BoolArray" }
        ]
      }
    ]
  }
}

查询全部

通过消息方式查询所有设备核心命令的示例:

向外部 MQTT 代理发送关于主题的查询请求消息 edgex/commandquery/request/all

{
  "apiVersion": "v3",
  "ContentType": "application/json",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "RequestId": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "QueryParams": {
    "offset": "0",
    "limit": "5"
  }
}

从外部 MQTT 代理接收有关主题的查询响应消息 edgex/commandquery/response

{
  "ApiVersion": "v3",
  "ContentType": "application/json",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "RequestID": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "ErrorCode": 0,
  "Payload": "..."
}

命令请求

Core Command 服务订阅配置文件中定义的 CommandRequestTopic。收到请求后,Core Command 服务会尝试从请求主题级别解析 <device-name> <command-name> 和 <method>, 并将响应发送回,并将 <device-name><command-name> 和 <method> 附加到配置中定义的 CommandResponseTopicPrefix 文件。第三方系统或应用程序必须发布命令请求消息并订阅来自相同主题的响应。以下是 Core Command 使用的默认主题命名:

  • 订阅命令请求主题:edgex/command/request/#
  • 发布命令响应主题:edgex/command/response/<device-name>/<command-name>/<method>

请求主题中的最后一个主题级别 (<method>) 必须是 get 或 set

Get 命令

通过消息发送 get 命令请求的示例:

向外部 MQTT 代理发送有关主题的命令请求消息 edgex/command/request/Random-Boolean-Device/Bool/get

{
  "apiVersion": "v3",
  "ContentType": "application/json",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "RequestId": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "QueryParams": {
    "ds-pushevent": "false",
    "ds-returnevent": "true"
  }
}

从外部 MQTT 代理接收有关主题的命令响应消息 edgex/command/response/#

{
  "ReceivedTopic": "edgex/command/response/Random-Boolean-Device/Bool/get",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "ApiVersion": "v3",
  "RequestID": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "ErrorCode": 0,
  "Payload": "eyJhcGlWZXJzaW9uIjoidjIiLCJyZXF1ZXN0SWQiOiJlNmU4YTJmNC1lYjE0LTQ2NDktOWUyYi0xNzUyNDc5MTEzNjkiLCJzdGF0dXNDb2RlIjoyMDAsImV2ZW50Ijp7ImFwaVZlcnNpb24iOiJ2MiIsImlkIjoiM2JiMDBlODYtMTZkZi00NTk1LWIwMWEtMWFhNTM2ZTVjMTM5IiwiZGV2aWNlTmFtZSI6IlJhbmRvbS1Cb29sZWFuLURldmljZSIsInByb2ZpbGVOYW1lIjoiUmFuZG9tLUJvb2xlYW4tRGV2aWNlIiwic291cmNlTmFtZSI6IkJvb2wiLCJvcmlnaW4iOjE2NjY1OTE2OTk4NjEwNzcwNzYsInJlYWRpbmdzIjpbeyJpZCI6IjFhMmM5NTNkLWJmODctNDhkZi05M2U3LTVhOGUwOWRlNDIwYiIsIm9yaWdpbiI6MTY2NjU5MTY5OTg2MTA3NzA3NiwiZGV2aWNlTmFtZSI6IlJhbmRvbS1Cb29sZWFuLURldmljZSIsInJlc291cmNlTmFtZSI6IkJvb2wiLCJwcm9maWxlTmFtZSI6IlJhbmRvbS1Cb29sZWFuLURldmljZSIsInZhbHVlVHlwZSI6IkJvb2wiLCJ2YWx1ZSI6ImZhbHNlIn1dfX0=",
  "ContentType": "application/json",
  "QueryParams": {}
}

Base64 解码 Payload

{
  "apiVersion": "v3",
  "requestId": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "statusCode": 200,
  "event": {
    "apiVersion": "v3",
    "id": "3bb00e86-16df-4595-b01a-1aa536e5c139",
    "deviceName": "Random-Boolean-Device",
    "profileName": "Random-Boolean-Device",
    "sourceName": "Bool",
    "origin": 1666591699861077076,
    "readings": [
      {
        "id": "1a2c953d-bf87-48df-93e7-5a8e09de420b",
        "origin": 1666591699861077076,
        "deviceName": "Random-Boolean-Device",
        "resourceName": "Bool",
        "profileName": "Random-Boolean-Device",
        "valueType": "Bool",
        "value": "false"
      }
    ]
  }
}

Set 命令

通过消息发送 set 命令请求的示例:

向外部 MQTT 代理发送有关主题的命令请求消息 edgex/command/request/Random-Boolean-Device/WriteBoolValue/set

{
  "apiVersion": "v3",
  "ContentType": "application/json",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "RequestId": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "Payload": "eyJCb29sIjogImZhbHNlIn0="
}

Payload 是 base64 编码的 json 结构:

{ "Bool": "false" }

从外部 MQTT 代理接收有关主题的命令响应消息 edgex/command/response/#

{
  "ReceivedTopic": "edgex/command/response/Random-Boolean-Device/WriteBoolValue/set",
  "CorrelationID": "14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "ApiVersion": "v3",
  "RequestID": "e6e8a2f4-eb14-4649-9e2b-175247911369",
  "ErrorCode": 0,
  "Payload": null,
  "ContentType": "application/json",
  "QueryParams": {}
}

笔记

在某些情况下,Core Command 服务将无法正确发布响应,例如:

  • 配置文件中未指定响应主题
  • 无法对请求进行 JSON 解码 MessageEnvelope
  • 无法解析 <device-name><command-name> 或 <method>

配置安全 MQTT 连接

实际上,用户通常需要提供凭据或证书才能连接到外部 MQTT 代理。要将此类机密散播到 Command 服务的机密存储中,您可以按照散播服务机密文档中的说明进行操作。

以下示例演示如何设置命令服务以通过 usernamepassword 身份验证连接到外部 MQTT 代理。

示例 - 通过环境覆盖设置 SecretsFile 和 ExternalMQTT

environment:
    EXTERNALMQTT_ENABLED: "true"
    EXTERNALLMQTT_URL: "<url>" # e.g. tcps://broker.hivemq.com:8883
    EXTERNALMQTT_AUTHMODE: usernamepassword
    SECRETSTORE_SECRETSFILE: "/tmp/core-command/secrets.json"
...
volumes:
    - /tmp/core-command/secrets.json:/tmp/core-command/secrets.json

示例 - Secrets.json

{
  "secrets": [
    {
      "secretName": "mqtt",
      "imported": false,
      "secretData": [
        {
          "key": "username",
          "value": "edgexuser"
        },
        {
          "key": "password",
          "value": "p@55w0rd"
        }
      ]
    }
  ]
}

笔记

自 EdgeX 3.0 起, 部分的 SecretPath 配置属性已重命名为 SecretName。但是,在源代码中,它仍然被称为 SecretPath,并且如果启用了 ExternalMQTT,将会破坏命令服务。这是一个已知问题,将在 EdgeX 3.1 中修复。在 EdgeX 3.1 之前,要解决此问题,您需要通过 Consul UI 手动将 添加到配置中,然后重新启动 Command 服务生效。

配置

请参阅常规通用配置文档了解所有服务通用的配置设置。 以下仅是特定于 Core Command 的附加设置和部分。

EdgeX 3.0

对于 EdgeX 3.0,MessageQueue.Internal 配置已移至通用配置 MessageBus =4> 和 已移至下方 MessageQueue.ExternalExternalMQTT

Writable

属性默认值描述
如果服务使用 -cp/--configProvider 标志运行,则可以在服务运行时动态更改配置的可写部分中的条目
LogLevelINFO日志条目严重级别。不属于默认级别或更高级别的日志条目将被忽略。

Writable.InsecureSecrets

属性默认值描述
.mqtt---在非安全模式下运行时连接到安全外部 MQTT 的秘密

Writable.Telemetry

属性默认值描述
请参阅通用配置了解所有服务通用的遥测配置 Writable.Telemetry
MetricsCore Command 收集的服务指标。布尔值指示是否启用指标报告。
Tags<empty>要包含在报告的每个指标中的任意核心元数据服务级别标签的列表。

服务

属性默认值描述
Core Command 的独特设置。常用设置可以在常用配置中找到
Port59882微服务端口号
StartupMsgThis is the EdgeX Core Command Microservice服务完成引导启动时记录消息

Clients.core-元数据

属性默认值描述
Protocolhttp构建服务端点的 URI 时使用的协议
Hostlocalhost托管服务的主机名或 IP 地址
Port59881目标服务暴露的端口

消息总线.可选

属性默认值描述
CoreCommand 的独特设置。常用设置可以在常用配置中找到
ClientIdcore-command连接到 MQTT 或 NATS 基础 MessageBus 时使用的 ID

外部 Mqtt

属性默认值描述
Enabledfalse指示是否通过消息传递连接到外部 MQTT 代理以获取命令
Urltcp://localhost:1883连接到 MQTT 代理的完全限定 URL
ClientIdcore-command用于连接到代理的 ClientId
ConnectTimeout5s指示代理连接超时之前等待多长时间的持续时间,即“30 秒”。
AutoReconnecttrue指示如果断开连接是否重试连接
KeepAlive10无活动数据流动时客户端 ping 之间的秒数,以避免客户端断开连接。必须大于 2
QOS0服务质量 0(最多一次)、1(至少一次)或 2(恰好一次)
Retaintrue保留 MQTT 连接的设置
SkipCertVerifyfalse指示是否应跳过证书验证
SecretNamemqtt用于检索您的机密的机密提供程序中的路径名称。必须非空白。
AuthModenone指示连接到代理时使用的内容。必须是“none”、“cacert”或“cacert”之一。、“用户名密码”、“客户端证书”。如果 SecretPath 中存在 CA 证书,那么它将用于除“none”之外的所有模式。

ExternalMqtt.Topics

属性默认值描述
键值映射允许发布和订阅外部消息总线
CommandRequestTopicedgex/command/request/#用于订阅第 3 方命令请求
CommandResponseTopicPrefixedgex/command/response用于将响应发布回第三方系统。 /<device-name>/<command-name>/<method> 将添加到此发布主题前缀
QueryRequestTopicedgex/commandquery/request/#用于订阅第 3 方命令查询请求
QueryResponseTopicedgex/commandquery/response用于将命令查询响应发布回第三方系统

V3 配置迁移指南

  • 已删除 RequireMessageBus
  • MessageQueue.External 移至 ExternalMQTT

请参阅通用配置参考了解有关常见配置更改的完整详细信息。

源代码

Core Command 的源代码可以在 edgex-go 中找到:https://github.com/edgexfoundry/edgex-go/tree/v3.1/cmd/core-command

额外信息-正则表达式获取命令

EdgeX 3.0

Regex Get 命令是 EdgeX 3.0 中的新增功能

命令服务支持命令名称的正则表达式语法。 正则表达式语法将与 DeviceProfile 中的所有设备资源匹配。

请考虑以下示例设备配置文件:

apiVersion: 'v2'
name: 'Simple-Device'
deviceResources:
  - name: 'Xrotation'
    isHidden: true
    description: 'X axis rotation rate'
    properties:
      valueType: 'Int32'
      readWrite: 'RW'
      units: 'rpm'
  - name: 'Yrotation'
    isHidden: true
    description: 'Y axis rotation rate'
    properties:
      valueType: 'Int32'
      readWrite: 'RW'
      'units': 'rpm'
  - name: 'Zrotation'
    isHidden: true
    description: 'Z axis rotation rate'
    properties:
      valueType: 'Int32'
      readWrite: 'RW'
      'units': 'rpm'

Regex 命令 .rotation 将返回包括 XrotationYrotation, 和 Zrotation

请注意,Go 接受的 RE2 语法 regexp 包包含类似 .*+ ...等。 这些字符在执行前需要进行 URL 编码:

$ curl http://localhost:59882/api/v3/device/name/Simple-Device01/%2Erotation
{
  "apiVersion": "v3",
  "statusCode": 200,
  "event": {
    "apiVersion": "v3",
    "id": "821f9a5d-e521-4ea7-83f9-f6bce6881dce",
    "deviceName": "Simple-Device01",
    "profileName": "Simple-Device",
    "sourceName": ".rotation",
    "origin": 1679464105224933600,
    "readings": [
      {
        "id": "c008960a-c3cc-4cfc-b9f7-a1f1516168ea",
        "origin": 1679464105224933600,
        "deviceName": "Simple-Device01",
        "resourceName": "Xrotation",
        "profileName": "Simple-Device",
        "valueType": "Int32",
        "units": "rpm",
        "value": "0"
      },
      {
        "id": "7f38677a-aa1f-446b-9e28-4555814ea79d",
        "origin": 1679464105224933600,
        "deviceName": "Simple-Device01",
        "resourceName": "Yrotation",
        "profileName": "Simple-Device",
        "valueType": "Int32",
        "units": "rpm",
        "value": "0"
      },
      {
        "id": "ad72be23-1d0e-40a3-b4ec-2fa0fa5aba58",
        "origin": 1679464105224933600,
        "deviceName": "Simple-Device01",
        "resourceName": "Zrotation",
        "profileName": "Simple-Device",
        "valueType": "Int32",
        "units": "rpm",
        "value": "0"
      }
    ]
  }
}

API 参考

EdgeX Foundry Core Command 微服务是其他服务通过其管理设备服务触发设备和传感器操作的渠道。

https://raw.githubusercontent.com/edgexfoundry/edgex-go/v3.1/openapi/v3/core-command.yaml

关于我们

亿琪软件

上海亿琪软件有限公司成立于 2016 年,专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域,致力于物联网领域前沿技术的创新,为用户提供全方位、智能化和安全的物联网解决方案。

2023 年,公司发布“YiFUSION |工业边缘智能融合一体机”产品,为工业客户提供一整套的边缘计算+AI 能力:高性能数据采集、多类型数据融合、AI 算法集成、云端业务对接。在边缘网关的基础上,集成了 IoT 平台的边缘协同能力、本地 Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。

2022 年,公司推出 “YiCLOUD |亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域,公司软硬件产品和解决方案获得华为技术认证,得到中国移动 OCP 认证,公司还是边缘计算产业联盟 ECC 成员。

关注我们

公司公众号爱好者公众号
yiqisoftedgexfoundry

联系我们--商业服务

  • 网站:http://yiqisoft.cn
  • 邮件:support@yiqisoft.cn
  • 电话:021-68863086
  • 手机:186-1666-9123
分享|EdgeX Discovery 发现 - 动态设备发现
本文提供了 EdgeX Foundry Discovery 动态设备发现的基本原理和运行机制。