GPS-tracking using MQTT and ThingsBoard

本页面介绍如何在 MikroTik RouterOS 上使用 MQTT 和 ThingsBoard 配置 GPS 跟踪,详细说明支持 GPS 的设备向服务器发送位置数据的设置步骤。内容涵盖 broker 配置、设备凭据生成以及适用于 SSL 和非 SSL 设置的 MQTT publish 命令。

使用 MQTT 和 ThingsBoard 进行 GPS 跟踪

许多 RouterOS 设备都支持 GPS。它使 RouterOS 能够确定其 GPS 接收器的精确位置。GPS 坐标将指示当前位置的纬度和经度值(以及其它参数)。

假设您拥有一台 LTAP(或任何其它支持 GPS 的 RouterOS 设备),并且希望跟踪它的位置。您希望路由器将这些数据发送到服务器,数据将在那里被存储并集成到地图中,因为这样监控起来更方便。在本指南中,我们将展示如何做到这一点。此场景将利用 MQTT 协议与一个名为 ThingsBoard 的平台进行通信。

ThingsBoard 有云解决方案和不同的本地安装选项(适用于不同的操作系统)。

由于我们添加了 container 功能,现在也可以在 RouterOS 内部运行该平台。这意味着,您可以完全基于 RouterOS 设备来构建此场景 → 您希望跟踪的支持 GPS 的设备(例如配备 LTAP 的汽车 → 充当 MQTT publishers 的 RouterOS 设备),以及运行在性能更强的 RouterOS 设备内的 ThingsBoard 服务器(例如 CHR 机器 → 充当 MQTT broker 的 RouterOS 设备)。

如果您想选择这条路线(container 路线),请务必谨慎选择计划用作 "服务器" 的设备,因为这种实现可能会占用大量 RAM(建议使用至少具有 2 GB RAM 或 1 GB RAM 且负载极低 且架构为 ARM64 或 AMD64 的设备)。

配置

在本指南中,我们将演示如何配置 GPS 接收器(MQTT 发布者)以及如何设置 ThingsBoard。

如果您想使用 container 功能来运行 ThingsBoard 实例(MQTT broker),请查看此处的指南。有关 ThingsBoard 和 MQTT 配置的通用指南可在此处找到。请务必浏览这两份指南,因为它们包含更多有用的信息。

在继续之前,请确保 ThingsBoard 已启动并运行,并且您可以访问其 WEB 管理门户。确认 MQTT 端口已打开和/或端口转发正确。

ThingsBoard 准备

信息

为简单起见,本示例将展示 access-token 和通过 access-token 进行单向 SSL 通信场景,但您也可以使用其它可用选项。 导航到 "Devices" 菜单,通过 "Add new device" 按钮添加新设备 → 为其命名并创建(例如 LTAP):

点击您刚添加的设备,进入 "Details" 部分,并在 "Manage credentials/Device Credentials" 设置下生成 access token:

MQTT broker 配置

如果是本地测试或 broker 可通过 VPN 访问,您可以使用非 SSL MQTT:

/iot/mqtt/brokers/add name=tb address=x.x.x.x port=1883 username=access_token
```ros

其中:

- `name` 是您希望为 broker 指定的名称,该名称稍后将在脚本中使用。
- `address` 是 broker 的 IP 地址。
- `port` 是 broker 正在监听的 TCP 端口 → 对于非 SSL,通常为 TCP 1883。
- `username` 由 MQTT broker 决定,在我们的例子中,它是在 ThingsBoard 管理门户中生成的 "access token"。

在公共访问的情况下(当您希望通过公网 IP 地址访问 broker 时),**我们建议您使用 SSL MQTT**:

```ros
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 username=access_token ssl=yes
```ros

其中:

- `name` 是您希望为 broker 指定的名称,该名称稍后将在脚本中使用。
- `address` 是 broker 的 IP 地址。
- `port` 是 broker 正在监听的 TCP 端口 → 对于 SSL,通常为 TCP 8883。
- `username` 由 MQTT broker 决定,在我们的例子中,它是在 ThingsBoard 管理门户中生成的 "access token"。
- `ssl` 启用 SSL MQTT 通信。

### MQTT 发布

您可以使用以下命令通过静态消息测试 MQTT 发布:

```ros
/iot/mqtt/publish broker="tb" topic="v1/devices/me/telemetry" message="{\"test\":\"123\"}"
```ros

要发布 GPS 坐标,请导入如下所示的脚本:

```ros
/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 (\"[*] Latitude=none, not posting anything!\
    \");:log info \"Latitude=none, not posting anything!\"}"
```ros

简而言之,该脚本捕获 GPS 信息,特别是纬度、经度和海拔值。然后它根据这些信息构建一条 JSON 消息。如果在脚本启动时纬度值不等于 "none"(等于任何实际数值)→ 它将通过 MQTT 向名为 "**tb**" 的 broker 发送该 JSON 消息。如果无法捕获 GPS 数据 → "latitude" 被识别为 "none" → 脚本仅记录无法捕获任何内容,不执行其它操作。

这是一个非常基础的示例。请根据您的需求随意修改脚本,添加您自己的 "if"(例如在无 GPS 信号时发送电子邮件通知)和附加参数(任何其它 RouterOS 捕获的值,例如其固件版本)。

使用以下命令运行脚本:

```ros
/system/script/run mqttgps 
[*] Capturing GPS coordinates...
        date-and-time: 2023-02-01 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...
```ros

要自动化此过程,请添加一个 [scheduler](/docs/system-information-and-utilities/scheduler)(例如每 30 秒运行一次脚本):

```ros
/system/scheduler/add name=mqttgpsscheduler interval=30s on-event="/system/script/run mqttgps"
```ros

## 结果验证

转到您所创建设备下的 "Latest telemetry" 部分,确认数据已发布:

![](https://manual.mikrotik.com/mobile-networking/gps/img/gps-tracking-using-mqtt-and-thingsboard-03.webp)

## 使用地图进行数据可视化

ThingsBoard 允许您使用 [Widgets](https://thingsboard.io/docs/user-guide/ui/widget-library/) 创建视觉上吸引人的仪表板。在我们的例子中,我们希望跟踪 LTAP 的 GPS 坐标,因此我们需要一个地图 widget。

选择纬度和经度值,然后点击 "**Show on widget**" 按钮:

![](https://manual.mikrotik.com/mobile-networking/gps/img/gps-tracking-using-mqtt-and-thingsboard-04.webp)

找到 "**Maps**" 包,然后点击 "**Add to dashboard**":

![](https://manual.mikrotik.com/mobile-networking/gps/img/gps-tracking-using-mqtt-and-thingsboard-05.webp)

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

![](https://manual.mikrotik.com/mobile-networking/gps/img/gps-tracking-using-mqtt-and-thingsboard-06.webp)

通过 scheduler 或手动运行脚本,并检查结果:

![](https://manual.mikrotik.com/mobile-networking/gps/img/gps-tracking-using-mqtt-and-thingsboard-07.webp)

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

![](https://manual.mikrotik.com/mobile-networking/gps/img/gps-tracking-using-mqtt-and-thingsboard-08.webp)