MQTT和ThingsBoard配置
可以用云服务来监测由MQTT发布者发送的信息,其中之一是 Thingsboard。本文将演示如何配置 Thingsboard 和 RouterOS,以使用 MQTT 协议发布数据。RouterOS在这个方案中作为一个网关,将数据从RouterBoard发布到Thingsboard的服务器。Thingsboard在这种情况下作为一个MQTT broker (数据发布的服务器)。
在进行设置之前需要做的是:
在 Thingsboard 的系统中创建一个账户。可以按照这个 链接 来做。允许在有限的测试时间段内免费使用ThingsBoard云解决方案。
按照 指南 建立自己的服务器。有一个社区版,可以免费安装和使用。
请使用 SSL MQTT(TCP端口8883和证书),而不是非SSL MQTT(TCP端口1883)。如果使用非SSL MQTT,客户端(MQTT publisher)和服务器(MQTT broker)之间的通信很容易被嗅探捕获,获取认证数据(如客户端ID,用户名和密码)。
Thingsboard配置
在本指南中将展示本地实例服务器的安装配置,但同样的原则适用于云选项。
通过浏览器访问登录页面并登录。转到 设备 菜单。
通过点击添加按钮 "+" "添加新设备 "来创建一个新设备:
输入设备的名称并点击 "添加":
默认情况下,新创建的设备会选择访问令牌认证。
访问令牌方案
通过点击创建的设备并进入 管理凭证 设置(在 细节 部分)改变令牌:
这个令牌将被用作MQTT发布者的 "用户名"(在RouterOS设置中)。
可以按照 链接 找到更多信息。
MQTT基本方案
可以在 设备凭证 部分为特定设备改变凭证类型:
MQTT基本方案允许为MQTT认证指定客户端ID、用户名和密码。
你可以通过下面的 链接 找到更多信息。
单向SSL通信方案
推荐使用的场景!
这种类型的认证要求使用服务器证书进行SSL通信。必须生成一个服务器证书并上传到ThingsBoard实例。
要生成服务器证书,请使用 本指南 作为参考生成证书(例如,使用OPENSSL工具),将其安装上传至正确的文件夹,并在ThingsBoard配置文件中启用MQTT SSL。
配置将与上面显示的 访问令牌 和 MQTT基本方案 中的配置相同。选择其中之一。
在这种情况下,唯一的区别是设备和服务器之间的通信(只需要稍微改变RouterOS设置中的MQTT代理配置,将在后面显示)。
当使用这种方案时,通信将被加密(使用SSL)。
X.509(双向SSL通信)方案
这种类型的认证要求使用服务器证书和客户端证书进行SSL通信。必须生成一个服务器证书并上传到ThingsBoard实例。
要生成服务器证书,请使用 本指南 作为参考生成证书(例如,使用OPENSSL工具),将其安装上传至正确的文件夹,并在ThingsBoard配置文件中启用MQTT SSL。
要生成客户端证书,请使用 本指南 作为参考。
可以在 设备证书 部分为特定设备改变证书类型:
X.509方案使用客户证书进行认证。
一旦证书生成(例如,使用OPEN SSL),将RSA公钥复制到该字段,并点击 "保存 "按钮。
RouterOS配置
注: 为了配置MQTT,请确保事先安装 iot包。
MQTT Broker
访问令牌的情况
添加一个MQTT Broker,如下图所示:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=1883 username=access_token
将 "地址 "改为 ThingsBoard 服务器的实际 IP/域名地址;
将 "用户名 "改为在 ThingsBoard 设置中使用的访问令牌。
MQTT基本方案
添加一个MQTT broker ,如下图所示:
/iot/mqtt/brokers/add name=tb address=x.x.x.x client-id=clientid password=password username=username
将 "地址 "改为 ThingsBoard 服务器的实际 IP/域名地址;
将 "用户名"、"密码 "和 "客户ID "改为ThingsBoard设置中使用的实际值。
单向SSL通信方案
推荐使用的场景!
在这个场景中,RouterOS需要有一个服务器证书导入系统中。
将安装在ThingsBoard上的服务器证书拖放到路由器的 "文件列表 "菜单中:
导入服务器证书:
/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基本方案 时添加一个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通信)方案
将证书拖入路由器的 "文件列表 "菜单,服务器证书、客户端证书及其私钥。
逐一导入证书:
/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
有一个静态值的快速的MQTT发布测试:
/iot/mqtt/publish broker="tb" topic="v1/devices/me/telemetry" message="{"cpu/":\"7\"}"
。
为了将相关数据从 RouterOS 发布到 Thingsboard 上,可以使用下面的脚本作为参考。该脚本从RouterOS设备中收集数据(型号名称、序列号、RouterOS版本、当前CPU、已用内存、可用内存和正常运行时间),并将消息(数据)以JSON格式发布给代理:
# 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 ("ParseError: KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲ Gathering system info...")
:local cpuLoad
/system resource get cpu-load
/systemresourcegetcpu−load
:local freeMemory
/system resource get free-memory
/systemresourcegetfree−memory
:local usedMemory (
/system resource get total-memory
/systemresourcegettotal−memory
- $freeMemory)
:local rosVersion ParseError: KaTeX parse error: Undefined control sequence: \[ at position 45: …e=version \\ \̲[̲/system package…]
:local model
/system routerboard get value-name=model
/systemrouterboardgetvalue−name=model
:local serialNumber
/system routerboard get value-name=serial-number
/systemrouterboardgetvalue−name=serial−number
:local upTime
/system resource get uptime
/systemresourcegetuptime
#################################### MQTT #####################################
:local message \
"{\"model\":\"model\\",\\ \\"sn\\":\\"model
",
"sn
":
"serialNumber\",\
\"ros\":\"rosVersion\\",\\ \\"cpu\\":rosVersion
",
"cpu
":cpuLoad,\
\"umem\":usedMemory,\\ \\"fmem\\":usedMemory,
"fmem
":freeMemory,\
\"uptime\":\"$upTime\"}"
:log info "ParseError: KaTeX parse error: Undefined control sequence: \[ at position 20: …age"; :put ("\̲[̲\*\] Total mess…ParseError: KaTeX parse error: Can't use function '$' in math mode at position 6: :len $̲message bytes")
:put ("ParseError: KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲ Sending message to MQTT broker...")
/iot mqtt publish broker=broker topic=brokertopic=topic message=$message
:put ("ParseError: KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲ Done")
应考虑2个脚本行。
:local broker "tb"
行中,应该在引号""内指定broker的名字。
:local topic "v1/devices/me/telemetry"
行中应该在引号""内指定正确的主题(查看 Thingsboard 的 文档 了解需要使用的确切主题)。
脚本的其余配置取决于总体要求。
将上述脚本复制并粘贴到记事本中,然后再重新复制。转到系统>脚本菜单,在那里添加一个新的脚本,并粘贴上面显示的脚本。改名,例如,script1。
要运行这个脚本,可以使用命令行:
/system script run script1
验证
可以在"最新遥测"部分检查设备的接收发布数据: