此文章根据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启用S​​SL 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”:

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

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

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