MQTT and ThingsBoard configuration

本页指导 MikroTik RouterOS 用户如何配置向 ThingsBoard 发布 MQTT 数据,涵盖设备设置、身份验证场景(访问令牌、基本凭据、SSL/TLS)以及用于安全通信的证书管理。

MQTT 和 ThingsBoard 配置

简介

可用于监控 MQTT 发布者所发送信息的众多云服务之一是 Thingsboard。本文将演示如何配置 Thingsboard 和 RouterOS,以使用 MQTT 协议发布数据。在此场景中,RouterOS 将充当网关,将数据从 RouterBoard 发布到 Thingsboard 服务器。在此场景中,Thingsboard 将充当 MQTT broker(数据将发布到的服务器)。

在继续设置之前,您需要执行以下任一操作:

  • a) 在 Thingsboard 系统中创建一个账户。您可以按照此链接操作。这将允许您在有限的/测试时间段内免费使用 ThingsBoard 云解决方案。
  • b) 按照指南设置您自己的服务器。有一个社区版可以免费安装和使用。

警告

请考虑使用 SSL MQTT(TCP 端口 8883 和证书),而不是非 SSL MQTT(TCP 端口 1883)。如果您使用非 SSL MQTT,客户端(MQTT 发布者)与服务器(MQTT broker)之间的通信很容易被嗅探/抓包,从而泄露身份验证数据(例如 client-id、用户名和密码)。

Thingsboard 配置

信息

在本指南中,我们将展示本地实例/服务器安装配置,但相同的原则也适用于云选项。 通过浏览器访问登录页面并登录。转到 "Devices" 菜单。

通过点击添加按钮 "+" 并选择 "Add new device" 创建新设备:

输入设备的名称并点击 "Add":

默认情况下,为新创建的设备选择访问令牌(access token)身份验证。

访问令牌场景

您可以通过点击所创建的设备并进入 "Manage Credentials" 设置(在 "Details" 部分中)来更改令牌:

此令牌将用作 MQTT 发布者的 "username"(在 RouterOS 设置中)。

您可以通过以下链接找到更多信息。

MQTT Basic 场景

您可以在特定设备的 "Device Credentials" 部分更改凭据类型:

MQTT Basic 场景允许您为 MQTT 身份验证指定 Client ID、Username 和 Password。

您可以通过以下链接找到更多信息。

单向 SSL 通信场景

警告

推荐使用的场景!

重要: 这种类型的身份验证要求您使用服务器证书进行 SSL 通信。必须生成服务器证书并将其上传到 ThingsBoard 实例。

要生成服务器证书,请参考本指南 → 生成证书(例如使用 OPENSSL 工具),将其安装/上传到正确的文件夹,并在 ThingsBoard 配置文件中启用 MQTT SSL。 配置将与上面所示的 Access token 和 MQTT Basic 场景相同。因此选择其中任一个即可。

在这种情况下,唯一的区别是设备与服务器之间的通信(您只需在 RouterOS 设置中略微更改 MQTT broker 配置,稍后将展示)。

使用此场景时,通信将被加密(使用 SSL)。

X.509(双向 SSL 通信)场景

信息

这种类型的身份验证要求您使用服务器证书和客户端证书进行 SSL 通信。必须生成服务器证书并将其上传到 ThingsBoard 实例。

要生成服务器证书,请参考本指南 → 生成证书(例如使用 OPENSSL 工具),将其安装/上传到正确的文件夹,并在 ThingsBoard 配置文件中启用 MQTT SSL。

要生成客户端证书,请参考本指南。 您可以在特定设备的 "Device Credentials" 部分更改凭据类型:

X.509 场景使用客户端证书进行身份验证。

证书生成后(例如使用 OpenSSL),将 RSA 公钥复制到字段中并点击 "Save" 按钮。

RouterOS 配置

note:要配置 MQTT,请确保事先安装了 iot 软件包。

MQTT Broker

访问令牌场景

如下所示添加一个 MQTT broker:

/iot/mqtt/brokers/add name=tb address=x.x.x.x port=1883 username=access_token
  • 将 address 更改为您 ThingsBoard 服务器的实际 IP/域名地址。
  • 将 username 更改为您在 ThingsBoard 设置中使用的访问令牌。
MQTT Basic 场景

如下所示添加一个 MQTT broker:

/iot/mqtt/brokers/add name=tb address=x.x.x.x client-id=clientid password=password username=username
  • 将 address 更改为您 ThingsBoard 服务器的实际 IP/域名地址;
  • 将 username、password 和 client-id 更改为您在 ThingsBoard 设置中使用的实际值。
单向 SSL 通信场景

警告

推荐使用的场景! 在此场景中,RouterOS 需要将服务器证书导入其系统。

将安装到 ThingsBoard 中的服务器证书拖放到路由器的 "File List" 菜单中:

导入服务器证书:

/certificate/import file-name=mqttserver.pem passphrase=""

使用 SSL 单向通信和访问令牌场景时,如下所示添加一个 MQTT broker:

/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 username=access_token ssl=yes
  • 将 address 更改为您 ThingsBoard 服务器的实际 IP/域名地址。
  • 将 username 更改为您在 ThingsBoard 设置中使用的访问令牌。
  • 确保使用 port=8883(服务器正在监听的 MQTT SSL 端口)。
  • 确保启用 ssl=yes。

使用 SSL 单向通信和 MQTT Basic 场景时,如下所示添加一个 MQTT broker:

/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 client-id=clientid password=password username=username ssl=yes
  • 将 address 更改为您 ThingsBoard 服务器的实际 IP/域名地址。
  • 将 username、password 和 client-id 更改为您在 ThingsBoard 设置中使用的实际值。
  • 确保使用 port=8883(服务器正在监听的 MQTT SSL 端口)。
  • 确保启用 ssl=yes。
X.509(双向 SSL 通信)场景

将证书拖放到路由器的 "Files/File List" 菜单 → 服务器证书、客户端证书及其私钥。

逐个导入证书:

/certificate/import file-name=mqttserver.pem passphrase=""
/certificate/import file-name=cert.pem passphrase=""
/certificate/import file-name=key.pem passphrase=""

如下所示添加一个 MQTT broker:

/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 certificate=cert.pem_0 ssl=yes
  • 将 address 更改为您 ThingsBoard 服务器的实际 IP/域名地址。
  • 将所选的 certificate 更改为您导入的实际客户端证书名称。
  • 确保使用 port=8883(服务器正在监听的 MQTT SSL 端口)。
  • 确保启用 ssl=yes。

MQTT Publish

a) 使用静态值进行快速 MQTT 发布测试:

/iot/mqtt/publish broker="tb" topic="v1/devices/me/telemetry" message="{\"cpu\":\"7\"}"

b) 为了将 RouterOS 中的相关数据发布到 Thingsboard,您可以将下面所示的脚本作为参考。该脚本从 RouterOS 设备收集数据(型号名称、序列号、RouterOS 版本、当前 CPU、已用内存、可用内存和运行时间),并以 JSON 格式将消息(数据)发布到 broker:

# Required packages: iot
################################ Configuration ################################  
# Name of an existing MQTT broker that should be used for publishing  
:local broker "tb"
# MQTT topic where the message should be published  
:local topic "v1/devices/me/telemetry"
#################################### System ###################################  
:put ("[\*] Gathering system info...")  
:local cpuLoad [/system/resource/get cpu-load]  
:local freeMemory [/system/resource/get free-memory]  
:local usedMemory ([/system/resource/get total-memory] - $freeMemory)  
:local rosVersion [/system/package/get value-name=version \  
[/system/package/find where name ~ "^routeros"]]  
:local model [/system/routerboard/get value-name=model]  
:local serialNumber [/system/routerboard/get value-name=serial-number]  
:local upTime [/system/resource/get uptime]
#################################### MQTT #####################################  
:local message \  
"{\"model\":\"$model\",\  
\"sn\":\"$serialNumber\",\  
\"ros\":\"$rosVersion\",\  
\"cpu\":$cpuLoad,\  
\"umem\":$usedMemory,\  
\"fmem\":$freeMemory,\  
\"uptime\":\"$upTime\"}"
:log info "$message";  
:put ("[\*] Total message size: $[:len $message] bytes")  
:put ("[\*] Sending message to MQTT broker...")  
/iot/mqtt/publish broker=$broker topic=$topic message=$message  
:put ("[\*] Done")

应考虑 2 行脚本。

:local broker "tb"

行,您应在引号 "" 内指定 broker 的名称。

:local topic "v1/devices/me/telemetry"

行,您应在引号 "" 内指定正确的 topic(查看 Thingsboard 的文档以获取需要使用的确切 topic)。

脚本配置的其余部分取决于整体需求。

将上述脚本复制并粘贴到记事本中,然后再次复制。导航到 System>Scripts 菜单,在其中添加一个新脚本,并粘贴上面所示的脚本。为其命名,例如 script1。

要运行该脚本,您可以使用命令行:

/system/script/run script1

验证

您可以在 "Latest telemetry" 部分下检查设备接收/发布的数据: