此文章根据MikroTik文档翻译,使用ThingsBoard平台,通过MQTT协议建立GPS的数据采集,并完成地图定位的可视化场景与Dubhe平台类似,只是协议使用的是MQTT非HTTP/HTTPs。
许多 RouterOS 设备都支持GPS。这使得 RouterOS 能够确定其 GPS 接收器的精确位置。GPS 坐标将显示当前位置的纬度和经度值(以及其他参数)。
这里的示例,通过有一台 LtAP(或其他任何支持 GPS 的 RouterOS 设备,如 KNOT 系列),并且希望追踪它的位置。并通过RouterOS将此数据发送到服务器,以便数据存储并集成到地图中,从而更方便地进行监控。此方案将使用 MQTT 协议与名为 ThingsBoard 平台进行通信。
ThingsBoard 提供云解决方案和本地安装选项(适用于不同的操作系统)。
RouterOS 添加了 Containter 容器功能,因此也可以通过 RouterOS 容器运行该平台。也意味着可以仅使用 RouterOS 设备来构建此场景:
- 支持 GPS 的硬件设备,例如,配备 LtAP 的移动载具的车辆,作为MQTT 客户端发布者的RouterOS 设备;
- 在部署一台性能更强的 RouterOS 设备,例如 CHR虚拟机,在容器部署 ThingsBoard 服务器,作为 MQTT 服务端的。
如果通过容器部署这条路线,请务必仔细选择用作 “ThingsBoard 服务器” 的设备,因为这种实现方式可能会占用大量 RAM(建议使用至少有 2 GB RAM 或 1 GB RAM )。
配置示例
将演示如何配置 GPS 接收器(MQTT 发布器)以及如何设置 ThingsBoard。
如果想使用容器功能运行 ThingsBoard 实例(MQTT 代理),请查看此处的手册。关于 ThingsBoard 和 MQTT 配置的一般指南,请参阅此处的指南。请务必阅读这两份指南,包含更多有用的信息。
在继续操作之前,请确保 ThingsBoard 已启动并运行,并且您可以访问其 Web 管理页面。确认 MQTT 端口已打开和/或已正确进行端口转发。
软件包要求: gps, iot
ThingsBoard 准备
为了简单起见,本示例将展示访问令牌和通过访问令牌进行单向 SSL 通信的场景,但您也可以使用其他可用选项。
导航至"Devices"菜单,然后点击“Add new device”按钮添加新设备→ 为其命名并创建设备(例如,LTAP):

点击刚刚添加的设备,转到“Details”部分,然后在“Manage credentials/Device Credentials”设置下生成访问令牌:

MQTT代理配置
如果是本地测试或者代理服务器可以通过 VPN 访问,则可以使用非 SSL MQTT:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=1883 username=access_token参数说明:
name这是希望提供给ThingsBoard 代理的名称,该名称将在脚本后面使用;address是ThingsBoard 代理的 IP 地址;port是ThingsBoard 代理正在监听的 TCP 端口 → 对于非 SSL 连接,通常为 TCP 1883;username由 MQTT 代理决定,例子中,它是 ThingsBoard 管理页面中生成的“Token访问令牌”。
如果是通过公网IP搭建的服务访问,建议使用 SSL MQTT:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 username=access_token ssl=yes参数说明:
name这是希望提供给ThingsBoard 代理的名称,该名称将在脚本后面使用;address是ThingsBoard 代理的 IP 地址;port是ThingsBoard 代理正在监听的 TCP 端口 → 对于 SSL,通常是 TCP 8883;username由 MQTT 代理决定,例子中,它是 ThingsBoard 管理页面中生成的“Token访问令牌”;ssl启用SSL MQTT通信。
MQTT 发布
您可以使用以下命令测试 MQTT 发布静态消息:
/iot/mqtt/publish broker="tb" topic="v1/devices/me/telemetry" message="{\"test\":\"123\"}"要发布 GPS 坐标,请导入以下脚本:
/system/script/add dont-require-permissions=no name=mqttgps owner=admin policy="ftp,re\
boot,read,write,policy,test,password,sniff,sensitive,romon" \
source=" ###Configuration###\r\
\n #Enter pre-configured broker's name within \"\":\r\
\n :local broker \"tb\"\r\
\n #Enter the topic name within \"\", per the broker's config\
uration:\r\
\n :local topic \"v1/devices/me/telemetry\"\r\
\n\r\
\n ###Variables####\r\
\n :global lat\r\
\n :global lon\r\
\n :global alt1\r\
\n :global alt2\r\
\n\r\
\n ###GPS####\r\
\n :put (\"[*] Capturing GPS coordinates...\")\r\
\n /system gps monitor once do={\r\
\n :set \$lat \$(\"latitude\");\r\
\n :set \$lon \$(\"longitude\");\r\
\n :set \$alt1 \$(\"altitude\")}\r\
\n ###remove \"meters\" from the value because JSON format wi\
ll not understand it###\r\
\n :set \$alt2 [:pick \$alt1 0 [find \$alt1 \" m\"]]\r\
\n\r\
\n :local message \\\r\
\n \"{\\\"latitude\\\":\$lat,\\\r\
\n \\\"longitude\\\":\$lon,\\\r\
\n \\\"altitude\\\":\$alt2}\"\r\
\n\r\
\n ###MQTT###\r\
\n :if (\$lat != \"none\") do={\\\r\
\n :put (\"[*] Sending message to MQTT broker...\");\r\
\n /iot mqtt publish broker=\$broker topic=\$topic message=\$\
message} else={:put (\"[*] Lattitude=none, not posting anything!\
\");:log info \"Latitude=none, not posting anything!\"}"该脚本会捕获 GPS 信息,具体来说是 latitude 纬度、longitude 经度 和 altitude 海拔值。然后,它会将这些信息构建成一个 JSON 消息。如果在 script 脚本启动时,纬度值不为“none”(即任何实际数值),则脚本会将 JSON 消息通过 MQTT 发送到名为“ tb ”的代理服务器。如果无法捕获 GPS 数据,则“纬度”会被识别为“none”,脚本只会记录无法捕获任何数据,而不会执行其他操作。
这是一个非常基础的示例。可以根据需要随意修改脚本,添加自己的“if”语句(例如,如果没有GPS信号,则发送电子邮件通知)和其他参数(任何其他从 RouterOS 脚本能获取的值,例如RouterOS版本,CPU使用率和固件版本等)。
使用以下命令运行脚本:
/system/script/run mqttgps
[*] Capturing GPS coordinates...
date-and-time: feb/01/2023 10:39:37
latitude: 56.969862
longitude: 24.162425
altitude: 31.799999 m
speed: 1.000080 km/h
destination-bearing: none
true-bearing: 153.089996 deg. True
magnetic-bearing: 0.000000 deg. Mag
valid: yes
satellites: 6
fix-quality: 1
horizontal-dilution: 1.42
data-age: 0s
[*] Sending message to MQTT broker...要实现流程自动化,请添加一个 scheduler 计划任务(例如,每 30 秒运行一次脚本):
/system/scheduler/add name=mqttgpsscheduler interval=30s on-event="/system/script/run mqttgps"结果验证
前往您创建的设备下的“Latest telemetry”部分,并确认数据已发布:

利用地图进行数据可视化
ThingsBoard 允许您使用 Widgets 小部件创建美观的仪表盘。在本例中,需要跟踪 LtAP GPS 坐标,因此需要一个地图小部件。
选择纬度和经度值,然后单击“Show on widget”按钮:

找到“Maps”软件包,然后点击“Add to dashboard”:

选择一个现有的仪表板,或者创建一个新的仪表板并随意命名:

通过调度程序或手动运行脚本,并检查结果:

现在,我们可以将其安装在移动目标上并跟踪其位置:
