EdgeX Core Service 核心服务之 Core Command 命令

EdgeX Core Service 核心服务之 Core Command 命令

一、概述

Core-command(通常称为命令和控制微服务)可以代表以下角色向设备和传感器发出命令或动作:

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

Command微服务以通用的标准化方式公开命令,以简化与设备的通信。

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

Command微服务从metadata服务获取有关设备和传感器的知识。

Command微服务始终通过设备服务将命令和动作中继到设备和传感器,并且从不直接与设备或传感器通信。

因此,Command微服务是从EdgeX Foundry的北侧(例如规则引擎和导出设备)到特定协议的设备或传感器以及EdgeX Foundry和网关的关联设备服务侧的命令或操作请求的转换器。

Command微服务不允许通过设备服务与设备和传感器进行不必要的交互,从而在设备和传感器周围提供了一层保护。可以添加额外的安全性,不允许与设备进行未经授权的交互(通过设备服务)。还可以调节设备上的请求数量,以免设备负载过重,如果有特殊需要,甚至可以缓存请求的响应,以避免唤醒设备。

二、通过消息传递命令

2.1 介绍

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

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

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

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

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

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

2.2 消息结构

由于大多数消息总线协议缺乏通用消息头机制(如 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":"v2",
  "RequestID":"e6e8a2f4-eb14-4649-9e2b-175247911369",
  "CorrelationID":"14a42ea6-c394-41c3-8bcd-a29b9f5e6835",
  "ErrorCode":0,
  "Payload":"...",
  "ContentType":"application/json"
}

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

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

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

2.3 命令查询

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

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

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

2.3.1 按设备名称查询

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

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

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

  1. 从外部 MQTT 代理接收有关主题的查询响应消息

edgex/commandquery/response:

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

Base64 解码 Payload:

{
      
  "apiVersion":"v2",
  "requestId":"e6e8a2f4-eb14-4649-9e2b-175247911369",
  "statusCode":200,
  "deviceCoreCommand"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】94.二叉树的中序遍历

题目链接&#xff1a; 94.二叉树的中序遍历 题目描述&#xff1a; 题解&#xff1a;&#xff08;递归算法实现二叉树中序遍历&#xff09; 二叉树的中序遍历&#xff1a;按照访问左子树——根节点——右子树的方式遍历这棵树&#xff0c;而在访问左子树或者右子树的时候我们按…

LeetCode:404.左叶子之和

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;404.左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: …

AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI

成品展示 一、首先去注册个账号然后申请个API keys 二、引入依赖 <dependency><groupId>cn.bigmodel.openapi</groupId><artifactId>oapi-java-sdk</artifactId><version>release-V4-2.3.0</version></dependency><depend…

每天40分玩转Django:Django静态文件

Django静态文件 一、今日学习内容概述 学习模块重要程度主要内容静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化静态文件处理⭐⭐⭐⭐压缩、版本控制部署优化⭐⭐⭐⭐性能优化、缓存策略 二、基础配置 # settings.py import os# 静态文件配置…

改进爬山算法之一:随机化爬山法(Stochastic Hill Climbing,SHC)

随机化爬山法(Stochastic Hill Climbing),也被称为随机爬山法,是一种基于搜索算法的优化方法,是爬山算法的一个变种,它通过引入随机性来减少算法陷入局部最优解的风险,并增加搜索解空间的能力。这种方法特别适合于解决那些具有多个局部最优解的优化问题。 一、算法思想 …

农家乐系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…

《Java源力物语》-3.空值猎手

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” \quad 夜色渐深&#xff0c;在一处偏僻小径上&#xff0c;月光透过浓密的源力云层&#xff0c;在地面上投下斑驳的光影。String正独自练习着刚从…

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…

使用 OpenCV 在图像中添加文字

在图像处理任务中&#xff0c;我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数&#xff0c;可以很方便地在图像上绘制文本&#xff0c;支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字&#xff0c;介绍 cv2.putTe…

接口测试Day-02-安装postman项目推送Gitee仓库

postman安装 下载 Postman&#xff08;已提供安装包&#xff0c;此步可以跳过&#xff09; https://www.postman.com/downloads/安装 Postman 安装Postman插件newman 要想给 postman 安装 newman 插件&#xff0c;必须 先 安装 node.js。 这是前提&#xff01; 安装node.js 可能…

MySQL索引为什么是B+树

MySQL索引为什么是B树 索引是帮助MySQL高效获取数据的数据结构&#xff0c;在数据之外&#xff0c;数据库还维护着满足特定查找算法的数据结构B树&#xff0c;这些数据结果以某种特定的方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;提升数据…

C#实现图像骨架化(ZhangSuen细化算法)

原始图像: 骨架化后图像: 需要安装一个NuGet包:System.Drawing.Common 代码如下: using System.Drawing; using System.Drawing.Imaging;public class Image {public int Width { get; }public int Height { get; }private bool[,] pixels;// 构造函数,初始化图像的宽度…

【无标题】学生信息管理系统界面

网页是vue框架&#xff0c;后端直接python写的没使用框架

Flow Field——流场寻路算法

目的 一群物体到达某个目的地时&#xff0c;需要对这些海量单位做寻路和避障&#xff0c;类似塔防类游戏的怪物步行到终点的过程。 参考视频&#xff1a;https://www.bilibili.com/video/BV12bzZY2EfA 演示动画&#xff1a;https://howtorts.github.io/examples/4-basic-flow-f…

Bash 脚本教程

注&#xff1a;本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程&#xff0c;非常不错&#xff0c;至少没接触过 BASH 的也能看懂&#xff01; 建立一个脚本 Linux 中有…

区块链期末复习3.2:比特币脚本

目录 一、输入输出脚本的执行 二、简单脚本实例及压栈过程 1.P2PK&#xff08;pay to public key hash&#xff09; 2、P2PH&#xff08;pay to public key hash&#xff09; 3.多重签名 4.比特币脚本的应用&#xff1a; 三、其他常见指令 1.OP_EQUAL与OP&#xff3f;EQ…

2024大模型在软件开发中的具体应用有哪些?(附实践资料合集)

大模型在软件开发中的具体应用非常广泛&#xff0c;以下是一些主要的应用领域&#xff1a; 自动化代码生成与智能编程助手&#xff1a; AI大模型能够根据开发者的自然语言描述自动生成代码&#xff0c;减少手动编写代码的工作量。例如&#xff0c;GitHub Copilot工具就是利用AI…

【数据可视化复习方向】

1.数据可视化就是数据中信息的可视化 2.数据可视化主要从数据中寻找三个方面的信息&#xff1a;模式、关系和异常 3.大数据可视化分类&#xff1a;科学可视化、信息可视化、可视分析学 4.大数据可视化作用&#xff1a;记录信息、分析推理、信息传播与协同 5.可视化流程&…

Python 多进程编程详解

目录 一、多进程编程简介 1. 什么是多进程 2. 多进程与多线程的区别 二、Python 中的多进程编程 1. 创建进程 2. 进程间通信 3. 进程池 4. 进程同步 5. 注意事项 三、实际应用案例 四、总结 在 Python 中&#xff0c;多进程编程是一种提高程序运行效率的有效手段。相…