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" 部分下检查设备接收/发布的数据:
