MQTT 插件

此插件让您能够使用 MQTT 消息队列遥测传输 (MQTT )是一种用于设备通讯的网络协议,特别适用于带宽有限的情况。MERLIC 作为 MQTT 客户端集成到制造机器中,并通过 TCP 设置与另一个 MQTT 客户端(例如可编程逻辑控制器 [PLC] 或 SCADA 数据采集与监控系统 系统)的通讯。MQTT 是开放 OASIS 结构化信息标准促进组织 标准消息传递协议,可用于 IoT 设备之间的消息交换。MQTT 插件允许您监视流程集成系统的状态和结果,同时对其进行控制。

工作原理

主题和消息

对于通过 MQTT 进行的通讯,消息长度可为 2 字节到 256 兆字节。消息按层次结构主题组织并且支持多种消息类型,例如,建立连接、发布数据以及确认收到数据。MQTT 消息代理负责管理消息的收集和分发。该代理从所有客户端收集消息并将它们发送到订阅相应主题的任意客户端。可为每个主题保留一条消息,以便发送给以后订阅特定主题的客户端。

MQTT 客户端

MQTT 客户端可以是运行 MQTT 库并能够与 MQTT 消息代理通讯的任何设备。使用 MQTT 插件时,MERLIC 本身充当 MQTT 客户端并能够与 MQTT 代理交换消息。

要测试 MQTT 插件的函数,可以使用机器视觉系统设置中的任何现有 MQTT 客户端设备,或在本地系统上安装 MQTT 客户端软件,例如 MQTT Explorer

MQTT 消息代理

MQTT 代理是一个服务器,用于从客户端接收所有消息,然后将消息路由到已订阅特定主题的 MQTT 客户端。您可以使用任何可用的 MQTT 代理,例如 Eclipse Mosquitto™ 代理。mqtt://test.mosquitto.org:1883 上提供有一个公开实例。

限制

  • MQTT 插件目前缺少安全功能,特别是基于证书的 TLS/SSL 加密。
  • 其他插件可能会干扰插件的运行,例如,集成在 MERLIC RTE Setup 的“I/O”选项卡中的模拟 PLC。

要求

MQTT 代理和客户端

如果您的网络上没有 MQTT 代理可用,则必须安装并运行一个代理。此外,至少必须启动并连接一个 MQTT 客户端。

有效配置

您必须为流程集成模式 () 定义具有至少一个配方的有效配置。可在 MERLIC Runtime Environment Setup 中设置该配置。

结合 MQTT 插件在流程集成模式下操作

通过 MQTT 插件运行流程集成模式(即 MERLIC RTE)时必须执行以下步骤:

  1. 在本地系统上或通过远程连接提供一个 MQTT 消息代理。
  2. 提供 MQTT 客户端,以便就“merlic/action”主题向代理发送消息。这些消息可用于在流程集成模式下控制 MERLIC
  3. 通过至少一个有效配方的配置启动 MERLIC RTE,并在 MERLIC RTE Setup 中配置 MQTT 插件。有关更多信息,请参阅配置选项部分。
  4. 启动 MQTT 插件,并建立与 MQTT 消息代理的连接。有关更多信息,请参阅启动 MQTT 插件部分。
  5. 可选:使用 MQTT 客户端将有关“merlic/action”主题的消息发送到代理,以便控制 MERLIC RTE
  6. 可选:提供 MQTT 客户端以显示和浏览 MQTT 插件发布的消息。客户端可以与步骤 2 中的相同。

MQTT 插件启动后,会自动收集关于 MERLIC 视觉系统的当前状态的信息。它还会自动连接到在 MERLIC RTE Setup 的“MQTT Connection Details”部分中为插件实例定义的 MQTT 代理。MQTT 插件会在消息中将来自 MERLIC 的信息发布到以下指定的 MQTT 主题:

  • merlic/mode
  • merlic/preparedRecipeIds
  • merlic/recipes
  • merlic/runningJobId
  • merlic/state

如果已配置默认配方,MERLIC 将从初始状态“Preoperational”转变成“Initialized”,然后转变成“Ready”。在“Ready”状态下,可通过将 {"actionType": "StartSingleJob"} 发布到主题“merlic/action”来触发视觉系统的单次执行。至于连续执行,可使用 {"actionType": "StartContinuous"} 触发并使用 {"actionType": "Stop"} 停止。

有关更多信息,请参阅传入消息部分。

当执行流程集成模式(即 MERLIC RTE 应用程序时,来自 MVApp 的结果将由 MQTT 插件发布到主题“merlic/recipes/0/result”:MQTT 插件会自动更新并发送相关信息。

启动 MQTT 插件

您可以通过 MERLIC RTE Setup和命令行启动 MQTT 插件。

通过 MERLIC RTE Setup

首先必须确保 MERLIC RTE 正在运行。如果没有,可以从 MERLIC RTE Setup 启动它,步骤如下:

  • 通过 图标打开 MQTT 插件实例的菜单,然后单击“ 启动”。
  • 或者,选择左侧的 MQTT 插件实例,然后单击 MERLIC RTE Setup 底部的“ Start plug-in”按钮。

在启动 MQTT 插件之前,请确保已根据您的偏好配置 MERLIC RTE。例如,在 MERLIC RTE Setup 中添加 MQTT 插件实例时,该插件实例将使用为 MERLIC RTE 定义的日志等级。要记录发布到 MQTT 消息代理的消息,必须在启动 MERLIC RTE 和添加插件实例之前,将 MERLIC RTE 的日志等级设置为“debug”。

加载和更改配方

如果配置了默认配方,MERLIC 将加载它并从初始状态“Preoperational”转变成“Initialized”,然后转变成“Ready”。如果没有默认配方,MERLIC 在启动后直接保持“Initialized”状态。要加载第一个配方,可以使用 MQTT 客户端将以下 JSON 消息发布到主题“merlic/action”。MQTT 插件将自动接收消息。

复制
{
    "actionType": "PrepareRecipe",
    "recipeId": "0"
}

只有当 MERLIC 处于“Ready”状态时,才可以加载其他配方。

配置选项

要检查并编辑 MQTT 插件的配置,MERLIC RTE 必须正在运行,但插件必须已停止运行。您可以使用具有不同设置的多个配置。仅应使用 MERLIC RTE Setup 进行配置,如以下部分所述。但是,在文件损坏等情况下,可以在“MQTT.json”文件中手动检查和更改设置。

Plug-in Parameters

此类型参数代表通讯插件中无法在“通讯”选项卡的配置区域中调整的一般参数。它们可显示插件的版本号、日志等级的当前参数值、插件的访问等级,以及插件配置的验证设置。这些值需要在不同的位置或通过不同的方法分别进行设置。

Version

此参数显示在插件实现期间定义的版本号。它由主要版本、次要版本和维护版本组成。添加新插件实例时也会显示此版本号。版本是可选的。因此,在实现过程中可能并未定义版本号。

Log level

此参数显示插件实例的日志等级。默认情况下,该日志等级会设置为在 MERLIC RTE Setup 中添加插件实例时的相应 MERLIC RTE 进程的日志等级。

Access level

此参数显示为插件设置的访问等级。对于 MQTT 插件,访问等级默认设置为“monitor and control”。这表示插件可以接收“事件”并发送“操作”。访问等级与插件实现中定义的功能相关。无法在 MERLIC RTE Setup 中调整访问等级。

Supports rapid validation

该参数显示插件是否支持立即验证当前的插件配置。对于这个插件,勾选复选框表示支持“快速验证”。这意味着,每次在 MERLIC RTE Setup 的“通讯”选项卡中修改任何可编辑参数时,都会验证插件的配置。如果插件不支持“快速验证”,则只有在保存配置时才会验证插件的配置。

User Parameters

User parameters”代表可为插件配置的参数集。它们显示在可以展开或关闭的不同类别中。

以下部分介绍每个类别的参数。

MQTT Connection Details

此类别参数定义 MQTT 代理的连接设置。如果 MQTT 代理在本地系统上通过传统端口 1883 运行,则可以使用默认配置,而无需修改。目前尚不支持基于证书的 SSL/TLS 或基于预共享密钥的 TLS。

下图显示 MQTT 连接的可用参数以及相应的默认设置。图下有参数的详细说明。

Hostname

此参数定义 MQTT 代理的主机名或 IP 地址。默认情况下,该参数设置为“localhost”。

Port

此参数定义 MQTT 代理的运行端口。默认情况下,此参数设置为 1883

Authentication

通过此类别中的参数,您可以定义用户凭据,以便能连接到需要密码身份验证的 MQTT 代理。

下图显示可用于身份验证的参数。

Authenticate with username/password

此参数定义是否使用身份验证。默认情况下它未选中,并且在连接到 MQTT 代理时不提供用户凭据。

Username

此参数定义身份验证的用户名。它只能在选中“Authenticate with username/password”参数时设置。

Password

此参数定义身份验证的密码。它只能在选中“Authenticate with username/password”参数时设置。默认情况下,密码不显示,而是用项目符号表示。要查看纯文本密码,请单击 图标。

密码以明文形式存储。当前不支持 TLS 加密。

Topics & Messages

此类别参数定义 MERLIC RTE 通过 MQTT 插件发送的消息的设置。消息以 JSON 格式发布。

下图显示主题和消息的可用参数以及相应的默认设置。图下有参数的详细说明。有关可用主题和相应 JSON 方案的更多信息,请参阅主题概述部分。

Topic prefix

此参数定义 MERLIC RTE 用于标识其消息的主题前缀。默认情况下,前缀设置为“merlic”。有关更多信息,请参阅传出消息部分。

Compact JSON

如果设置此参数,输出将采用 JSON 格式且不包含空格或换行符。默认情况下已设置该参数。

JSON indentation level

此参数定义 JSON 缩进等级,即 JSON 消息中使用的空格数量。此选项仅在未设置“Compact JSON”参数时适用。通常使用 2 到 4 之间的缩进等级。默认情况下,此参数设置为 2

Publish errors

如果设置此参数,则 MERLIC RTE 报告的错误将发布到“merlic/error”主题及其子主题。错误消息不会被保留,也就是说,它们只会在错误发生时传递给主题的订阅者。默认情况下已设置该参数。

Publish recipe data

如果设置此参数,配方列表会发布到“merlic/recipes”主题。此外,对于每个配方,会将 Boolean 发布到“merlic/recipes/{id}/isPrepared”形式的主题,其中 {id} 是数字配方 ID。Boolean 值表示该配方当前是否已准备。这些消息将被保留,以便在插件已经运行时订阅这些主题的客户端将接收当前配方数据。默认情况下已设置该参数。

Publish result data

如果设置此参数,新结果将发布到“merlic/recipes/{id}/result”形式的主题及其子主题,其中 {id} 指生成结果的配方的数字配方 ID。结果消息不会被保留,也就是说,它们只会在结果到达时传递给主题的订阅者。默认情况下已设置该参数。

Publish result images

此参数定义是否将检索和发布作为配方执行的 MVApp 的结果图像。此参数仅在设置了“Publish result data”参数时才启用。

如果设置了“Publish result images”,则将成功检索到的结果图像的数据发布到主题“{prefix}/recipes/{id}/result/images/{dataIndex}/data”。该主题是唯一一个不传达 JSON 消息的主题。

{dataIndex} 是指 MVApp 的对应图像结果的数字(从 0 开始)索引。如果选择发布结果图像,您可以为结果图像指定一些其他设置,如滤镜模式或图像数据的有效负载格式。您可以在“Image Results”类别中找到相应的参数以及结果图像的其他配置选项。

如果无法检索图像,例如,因为该图像不再存储在 MERLIC 中或因为转换为所需格式失败,则将错误发布到“{prefix}/recipes/{id}/result/images/{dataIndex}/error”。此主题使用主题“{prefix}/error”已使用的“error.json”方案。

默认情况下不设置此参数,因此不会发布结果图像。

Image Results

此类别中的参数定义如何发布结果图像。仅当设置了类别“Topics & Messages”中的参数“Publish result images”时,这些参数才可配置。

Image result filter mode

通过此参数可以启用用于确定将检索哪些图像结果的筛选器。您可以选择以下选项。默认情况下设置为“None”。

模式

描述

None

未应用筛选器,将检索所有结果图像。

Regular expression

仅检索名称与 Result name filter regex 参数中指定的正则表达式相匹配的结果图像。

Result name filter regex

通过此参数可以指定正则表达式来筛选应发布的结果图像的名称。仅当“Image result filter mode”参数中的筛选模式设置为“Regular expression”时才提供。因此,将仅发布名称与正则表达式相匹配的结果图像。默认情况下设置为“.*”,可匹配任何内容。

Payload format for image data

此参数定义应如何在 MQTT 主题上发布实际图像数据。默认情况下,该参数设置为“Data URI (base64)”。

格式

描述

Binary

以“raw”二进制数据形式发布图像数据。这是最简单且最有效的选项,但许多 MQTT 客户端无法处理或显示二进制数据。

Base64‑encoded string

以 base64 编码字符串的形式发布图像数据。使用 base64 编码将数据清晰地表示为文本(大小开销为 33%)。

Data URI (base64)

以 base64 编码数据 URI 的形式发布图像数据。它还使用 base64 编码,但会为负载加上一个数据 URI 协议方案前缀,其中包括 MIME 类型,如适用于 HALCON Serialized Item 的“image/jpeg”、“image/png”或“application/octet-stream”。

Image format

此参数定义以哪种格式发布 MVApp 的结果图像。选定的图像格式会以蓝色突出显示。要选择其他格式,请单击相应的图像格式。根据所选的图像格式,其他参数将可进行配置。请参阅下表了解有关可用图像格式的信息。默认情况下设置为“JPEG”。

格式

描述

PNG

以 PNG 图像格式发布图像。如果选择此格式,则附加参数 PNG compression 可用。

JPEG

以 JPEG 图像格式发布图像。如果选择此格式,则以下其他参数可用:

HALCON Serialized Item

HALCON Serialized Item 格式发布图像。

通常,“byte”、“int1”、“uint2”、“int2”、“int4”、“int8”以及“real”类型的所有图像均可导出为 MVApp 结果,并转换为可用的图像格式。但是,“real”类型的图像是个例外,因为它们只能转换为“HALCON Serialized Item”格式。有关图像格式及相应的像素转换的信息,请参阅配置通讯插件中的图像结果部分。

Use progressive JPEG

仅当“Image format”参数设为“JPEG”时,此参数才可用。它定义是否以渐进式 JPEG 格式发布图像。默认情况下不设置该参数。

JPEG quality

仅当“Image format”参数设为“JPEG”时,此参数才可用。它定义压缩为 JPEG 的质量,用百分比表示。默认情况下设置为 50%

PNG compression

仅当“Image format”参数设为“PNG”时,此参数才可用。它定义压缩为 PNG 的级别。可设置为 0 到 9 之间的值。默认情况下设置为 6

Image zoom mode

此参数可用于调整结果图像的大小。下表列出了可用选项。根据所选的模式,其他参数将可进行配置。默认情况下,该参数设置为“None”。

模式

描述

None

以原始大小发布图像,不进行任何缩放。

Fixed width and height

将图像缩放到 Image widthImage height 参数中定义的大小。选择此选项后,这些参数将立即可用。指定大小将应用到所有结果图像,无论其原始大小如何,并且不会保留纵横比。

Zoom factor

系统将根据 Image zoom factor 参数中指定的系数延两个维度调整图像大小。选择此选项后,此参数将立即可用。此选项保留纵横比,并且与图像的原始大小相对应。

Image width

仅当“Image zoom mode”参数设为“Fixed width and height”时,此参数才可用。它定义结果图像的宽度。因此,将以“Image width”和“Image height”中定义的指定大小发布所有图像。指定大小将应用到所有图像,无论其原始大小如何,并且不会保留纵横比。默认情况下设置为 512 像素

Image height

仅当“Image zoom mode”参数设为“Fixed width and height”时,此参数才可用。它定义结果图像的高度。因此,将以“Image width”和“Image height”中定义的指定大小发布所有图像。指定大小将应用到所有图像,无论其原始大小如何,并且不会保留纵横比。默认情况下设置为 512 像素

Image zoom factor

仅当“Image zoom mode”参数设为“Zoom factor”时,此参数才可用。它定义用于沿两个维度调整图像大小的百分比值。您也可以指定大于 100% 的值。默认情况下,该参数设置为 100%,这表示保留原始图像大小。

Quality of Service (QoS)

此类别参数定义传输期间出现数据包丢失(例如,因数据传输错误或网络拥塞)时的代理行为。

每个参数的值均可设置为 0、1 或 2。选定的值会以蓝色突出显示。要选择其他值,请单击相应的值。下表提供其含义概述。

QoS 值

描述

0

消息仅发送一次,而无论是否被确认(“即发即弃”)。

1

消息至少发送一次,直到获得确认(“确认送达”)。

2

消息刚好发送一次(“保证送达”)

下图显示可用参数以及相应的默认设置。图下有参数的详细说明。

QoS for status updates

此参数定义状态更新的 QoS。默认情况下设置为 1

QoS for errors

此参数定义错误消息的 QoS。默认情况下设置为 2。此参数仅在设置了“Publish errors”参数时适用。

QoS for updates of the recipe list

此参数定义配方列表更新的 QoS。默认情况下设置为 2。此参数仅在设置了“Publish recipe data”参数时适用。

QoS for the delivery of new results

此参数定义新结果发送的 QoS。默认情况下设置为 0。此参数仅在设置了“Publish result data”参数时适用。

订阅 MQTT 主题

传入消息

MQTT 插件会自动订阅主题 merlic/action。但是,如果插件使用访问等级“monitor”启动,则不会订阅此主题。如果插件使用访问等级“control”启动,则不会发布有关此主题的消息。您可以通过发送以下“actionType”消息到主题 merlic/action,使用任意 MQTT 客户端控制 MERLIC 的执行:

  • SelectMode
  • PrepareRecipe
  • UnprepareRecipe
  • StartSingleJob
  • StartContinuous
  • Halt
  • Reset
  • Stop
  • Abort

示例和其他信息

传出消息

MQTT 插件会在流程集成模式下通过消息将来自 MERLIC 的信息自动发布到以下指定的 MQTT 主题:

  • merlic/mode
  • merlic/preparedRecipeIds
  • merlic/recipes
  • merlic/runningJobId
  • merlic/state

您可以使用任意 MQTT 客户端订阅 MQTT 插件发布的消息。

每个主题以占位符 {prefix} 开头,该占位符必须根据主题和消息设置使用可配置的前缀路径进行替换。对于 MQTT 插件,默认为 merlic,例如“merlic/state”。配置自定义前缀有助于将视觉应用程序集成到现有主题层次结构中,并允许多个不同视觉应用程序在同一 MQTT 代理上同时运行。

有关如何配置信息等级的信息,请参阅主题和消息部分。

保留消息

MQTT 插件自动将部分消息标记为保留,以发送给当前状态和配方列表的订阅者。客户端将在订阅主题后立即收到最新的保留消息,即使该消息是插件在订阅之前发布的。此行为仅适用于状态类信息。错误和新结果等事件类信息不会保留。

主题概述

下表列出了包含相应 JSON 方案的所有可用主题。

主题

保留

示例

JSON 方案

{prefix}/action

不适用

action.json

{prefix}/error

error.json

{prefix}/error/brief

"brief error message"

error_brief.json

{prefix}/error/code

8565

error_code.json

{prefix}/error/message

"error message"

error_message.json

{prefix}/mode

"Automatic", null

mode.json

{prefix}/preparedRecipeId

[], ["4"]

preparedRecipeIds.json

{prefix}/recipes

recipes.json

{prefix}/recipes/{id}/isPrepared

false, true

recipes_isPrepared.json

{prefix}/recipes/{id}/result

result.json

{prefix}/recipes/{id}/result/content/{idx}/value

5, 3.141592, "strings"

result_content_value.json

{prefix}/recipes/{id}/result/images/{dataIndex}/data

"data:image/png;base64"

Binarybase64Data URI (base64)

{prefix}/recipes/{id}/result/images/{dataIndex}/error

 

error.json

{prefix}/state

"SingleExecution"

state.json

{prefix}/status/runningJobId

42, null

runningJobId.json

JSON 方案