简介
许多RouterOS设备有 GPS 支持。允许RouterOS确定其GPS接收器的精确位置。GPS坐标将显示当前位置的纬度和经度值(以及其他参数)。
比如有 LTAP (或任何其他支持GPS的RouterOS设备),希望跟踪它的位置。想让路由器把这些数据发送到服务器上,这些数据将被储存并整合到地图上,因为这样监控起来更方便。在本指南中将展示如何做到这一点。这个方案利用MQTT协议与一个叫做 ThingsBoard 的平台进行通信。
ThingsBoard有一个云解决方案和不同的本地安装选项(在不同的操作系统上)。
因为添加了 容器 功能,因此也可以在RouterOS中运行该平台。这意味着可以建立该方案,仅在RouterOS设备上→希望跟踪的支持GPS的设备(例如,配备 LTAP 的汽车→作为 MQTT publishers 的RouterOS设备),以及在更强大的RouterOS设备内运行的ThingsBoard服务器(如 CHR 机器作为 MQTT broker 的RouterOS设备)。
如果想选择这个办法(容器),一定要仔细挑选打算用作 "服务器 "的设备,因为这种实现方式内存占用很大(建议设备至少有 2 GB RAM 或 1 GB RAM ,并且是 ARM64 或 AMD64 架构)。
配置
在本指南中将演示如何配置一个GPS接收器(MQTT发布器)以及如何设置ThingsBoard。
如果想使用容器功能来运行ThingsBoard实例(MQTT代理),请查看 指南。关于ThingsBoard和MQTT配置的一般准则可以在指南中找到 这里 。阅读这两个指南,会有额外的有用信息。
在继续进行之前,确保ThingsBoard已经启动并运行,并且能够访问管理WEB。确认MQTT端口已打开,端口转发正确。
需要的安装包: gps, iot
ThingsBoard准备
本例将展示 access-token 和 通过access-token进行单向SSL通信 场景,也可以使用其他可用选项。
导航到 设备 菜单,通过 添加新设备 按钮添加一个新设备→命名并创建它(例如,LTAP):
点击刚刚添加的设备,进入 细节 部分,在 管理凭证/设备凭证 设置下生成一个访问令牌:
MQTT broker配置
如果是本地测试,或者broker可以通过VPN使用,也可以使用非SSL的MQTT:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=1883 username=access_token
其中:
name是希望的broker的名字,这个名字将在以后的脚本中使用;address是broker 的IP地址;port是broker 监听的TCP端口,对于非SSL,通常是TCP 1883;username是由MQTT broker决定的,在这个例子中是ThingsBoard管理门户中生成的 "访问令牌"。
如果是公共访问(想通过其公共IP地址访问broker 时),建议使用SSL MQTT:
/iot/mqtt/brokers/add name=tb address=x.x.x.x port=8883 username=access_token ssl=yes
其中:
name是给broker 的名字,这个名字将在以后的脚本中使用;address是broker 的IP地址;port是broker 监听的TCP端口,对于SSL来说,通常是TCP 8883;username是由MQTT broker 决定的,在例子中是一个在ThingsBoard管理门户中生成的 "访问令牌";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信息,特别是纬度、经度和海拔值。然后从这些信息中构造出一个JSON信息。如果在脚本启动的时候,纬度值不等于 "无"(等于任何实际的数值),那就会通过MQTT将JSON消息发送到名为 tb 的broker 那里。如果GPS数据不能被捕获→"纬度 "被识别为 "无"→脚本只记录没有任何东西被捕获,而不做其他事情。
这只是一个非常基本的例子。可以根据自己的需要修改脚本并添加自己的 "if"(也许是在没有GPS信号的情况下发送电子邮件通知)和额外的参数(任何其他的RouterOS捕获值,如固件版本)。
用命令运行脚本:
/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...
要使这个过程自动化,可以添加一个 时间表 来运行脚本,如每30秒一次:
/system/scheduler/add name=mqttgpsscheduler interval=30s on-event="/system/script/run mqttgps"
结果验证
进入创建的设备下的 "最新遥测 "部分,确认数据已经发布:
使用地图进行数据可视化
ThingsBoard允许使用 Widgets 来创建具有视觉吸引力的仪表盘。在案例中想跟踪LTAP GPS坐标,所以要添加一个地图部件。
选择纬度和经度值并点击 显示在部件上 按钮:
找到 地图 包,点击 添加到仪表板:
选择一个现有的仪表板或创建一个新的仪表板,并命名:
通过调度程序或手动运行脚本并检查结果:
现在可以把它安装在一个移动的目标上并跟踪它的位置: