IFTTT app notifications on BLE tag appearance in KNOT's range
我们的 Bluetooth 标签和 KNOT 可用于 IoT 资产追踪的各种场景。
简介
我们的 Bluetooth 标签和 KNOT 可用于 IoT 资产追踪的各种场景。
我们将在本指南中展示的场景是:当标签进入 KNOT 的 Bluetooth 范围时,以及当标签离开 Bluetooth 工作范围时,在手机上收到通知。
该场景可以借助 IFTTT 服务来实现。IFTTT 将为你生成一个 URL。然后,你可以从 RouterOS 使用 /tool fetch,向 IFTTT 生成的 URL 发送 HTTP/web 请求,这将触发向你手机发送 APP 通知。
一旦设置好 IFTTT 服务并根据相应配置好 KNOT,你就可以将 Bluetooth 标签(TG-BT5-IN 或 OUT 型号)附加到你想追踪的任何设备上。
假设你把标签附加在一台昂贵的机器上,或者只是 ... 你的钥匙上。然后,你安装并放置 KNOT,使标签处于 KNOT 的 Bluetooth 范围内。接下来会发生什么,它又将如何工作?
KNOT 将按计划运行脚本(使用你选择的间隔)。根据脚本中配置的标签 MAC 地址 → 脚本将检查最新收到的 Bluetooth 数据包的时间(收到最新数据包的时间)。在以下情况下:
- 数据包的接收时间在 /system clock 时间的 1 分钟以内(例如,/system clock 时间为 16:02:00,而标签的负载是在 16:01:50 收到的)→ 将触发 "TAG IS WITHIN RANGE" 通知,并发送到你的手机。
- 数据包的接收时间早于 /system clock 时间 1 分钟以上(例如,/system clock 时间为 16:02:00,而标签的负载是在 16:00:50 收到的)→ 将触发 "TAG IS NOT IN RANGE" 通知,并发送到你的手机。
因为没有其他方法可以知道标签实际上是在工作范围内还是范围外,脚本使用 "time" 参数来确认。因此,当负载的接收时间不断刷新时 → 意味着标签存在,且 KNOT 成功接收数据包。当自 KNOT 收到最后一个数据包以来已经过去 1 分钟 → 意味着 KNOT 整整一分钟都没有收到来自标签的任何更新,这确认标签不在范围内。
IFTTT 设置
第一步是按照链接注册一个 IFTTT 账户或登录现有账户。
下载适用于你手机的 IFTTT 应用,你可以通过 APP 或浏览器配置后续步骤。
登录后,点击右上角的 "Create" 按钮:

这将带你进入 applet 创建界面:

在 "If This" 字段中选择 "Add" 按钮。选择名为 "Webhooks" 的服务。然后,选择一个名为 "Receive a web request" 的选项。
输入 "Event Name",例如 **{The_tag_IS_within_range}**,然后选择 "Create trigger"。这将带你返回:

在 "Then That" 字段中选择 "Add" 按钮,找到名为 "Notifications" 的操作。选择一个名为 "Send a notification from the IFTTT app" 的选项,然后点击 "Create Action" 确认。
点击 "Continue" 并查看 applet。点击 "Finish"。
现在,再次执行相同步骤以创建第二个 applet,但对于第二个,请输入另一个 "Event Name",例如 **{The_tag_is_NOT_in_range}**。
创建好两个 applet 后 → 检查为你生成的 web 请求 URL。转到链接并点击 "Documentation" 按钮:

页面将指示你需要使用的 URL:

复制此 URL - 稍后你将在脚本中使用它。
Bluetooth 标签配置
请通过链接查看我们的标签配置指南(iOS 和 Android)。
在此特定用例中,KNOT 将检查收到的 Bluetooth 负载的时间,因此为标签配置哪种数据包类型并不重要。
唯一重要的设置是 "Advertisement interval"。请确保配置了此参数。
或者你可以直接让标签保持默认设置,不做任何更改。
RouterOS 配置
信息
请注意,需要 iot 软件包。你可以从我们的下载页面获取它。 请确保已配置互联网访问,以便 KNOT 能够访问 IFTTT webhooks。
Bluetooth 扫描器
导航到 IoT>Bluetooth>Scanners。确保启用扫描器(如果它被禁用的话),然后编辑扫描器设置:

选择 Filter duplicates=keep-newest。
keep-newest 设置将确保 "Advertising reports" 部分下只保留最新的报告。扫描器捕获的新数据包(针对每个单独的 MAC 地址)将覆盖较旧的数据包。
脚本
导航到 System>Scripts 菜单并在那里添加一个新脚本。
你可以复制下方的脚本。将下方脚本复制到 "notepad" 中,然后再次将其复制到脚本的 "Source:" 字段中。
#### User params
:local addressRegex "DC:2C:6E:91:D6:F3"
:local urlNotInRange "https://maker.ifttt.com/trigger/{The_tag_is_NOT_in_range}/json/with/key/-xxxx"
:local urlInRange "https://maker.ifttt.com/trigger/{The_tag_IS_within_range}/json/with/key/-xxxx"
:local missingInterval 60000
###Time
:local realtime [/system clock get time]
:local realdate [/system clock get date]
:local tonumtime [:tonum [:totime "$realdate $realtime"]];
:local gmt ([system/clock/print as-value]->"gmt-offset")
###to offset epoch with curretn GMT
:global tonumtimeoffset ($tonumtime-$gmt)
:global Epomili
:set Epomili ([$tonumtimeoffset]."000")
###Bluetooth
:local adver
:local adver2
:local ts
:local clockmin
:set adver [/iot bluetooth scanners advertisements print detail as-value where address ~ $addressRegex]
:set adver2 ($adver->0)
:set ts ($adver2 -> "epoch")
:set clockmin ($Epomili-$missingInterval)
:local counterIN
:local counterOUT
:if ($ts<=$clockmin) do={
:set $counterIN 0;
:if ($counterOUT=0 or $counterOUT=null) do={
:set $counterOUT 0;
/tool fetch http-method=get output=user url=$urlNotInRange;
:set counterOUT ($counterOUT+1);
:log info "IFTTT notification - the tag is OUT OF range!"
} else={
:log info "Tag is OUT of range! Notification was already sent before!"
}
} else={
:set $counterOUT 0;
:if ($counterIN=0 or $counterIN=null) do={
:set $counterIN 0;
/tool fetch http-method=get output=user url=$urlInRange;
:set $counterIN ($counterIN+1);
:log info "IFTTT notification - tag IS WITHIN range!"
} else={
:log info "Tag is WITHIN the range! Notification was already sent before!"
}
}
有 3 行需要特别注意(在脚本的 ### User parameters 部分中)。
- MAC 地址行:
:local addressRegex "DC:2C:6E:91:D6:F3"
上面的行,你需要在其中输入标签的 MAC 地址(你可以在标签的标签上找到打印的标签 MAC 地址)。
- 不在范围通知 URL 行:
:local urlNotInRange "https://maker.ifttt.com/trigger/{The_tag_is_NOT_in_range}/json/with/key/-xxxx"
该行,你需要在其中输入 IFTTT 服务为你生成的 URL。URL 应如下所示 → https://maker.ifttt.com/trigger/{event}/json/with/key/-xxxxx。将 URL 中的 {event} 部分更改为在 IFTTT 门户中创建 applet 时选择的 Event Name,并将 URL 中的 -xxxxx 部分更改为 IFTTT 门户为你生成的 key。
- 在范围内通知 URL 行:
:local urlInRange "https://maker.ifttt.com/trigger/{The_tag_IS_within_range}/json/with/key/-xxxx"
该行,你需要在其中输入 IFTTT 服务为你生成的 URL。URL 应如下所示 → https://maker.ifttt.com/trigger/{event}/json/with/key/-xxxxx。将 URL 中的 {event} 部分更改为在 IFTTT 门户中创建第二个 applet 时选择的第二个 Event Name,并将 URL 中的 -xxxxx 部分更改为 IFTTT 门户为你生成的 key。
将脚本命名,例如 ifttt 并保存("Apply" 和 "OK")。
脚本将如何工作?
我们为脚本应用一个调度器,脚本将按设定的间隔运行。调度器设置将在本指南后面展示。
脚本的 ###Time 部分获取 /system clock 时间并计算 "epoch" 时间。当我们获得当前 /system clock 时间的 "epoch" 值后,我们可以从中减去 1 分钟。拥有 "减去一分钟" 的 epoch 时间值将帮助脚本将数据包的接收时间与之比较,以判断数据包是晚了 1 分钟以上,还是处于当前时间的 1 分钟间隔内。
如果标签移出范围(数据包早于 1 分钟)→ KNOT 将向 IFTTT webhook 发送 HTTP post(使用表示 "超出范围" 的 "Event Name"),并在 System>Log 中记录该事件。
如果收到标签的负载且它不早于 1 分钟 → KNOT 将向 IFTTT webhook 发送 HTTP post(使用表示 "在范围内" 的 "Event Name"),并在 System>Log 中记录该事件。
"counter" 参数将确保你不会每次脚本被调度器运行时都收到垃圾通知,这将确保你只在标签移入范围时收到 1 条通知,在标签移出范围时收到 1 条通知。
调度器
导航到 System>Scheduler 并在那里添加一个新调度器。
将其命名,例如 scheduler1,并应用你希望 KNOT 检查数据包的间隔。

在 "On Event:" 字段中添加一行 "/system script run ifttt"(其中 ifttt 是所创建脚本的名称),点击 "Apply" 和 "OK"。
结果验证
请确保你已在手机上登录 IFTTT 应用。
将标签放置在 KNOT 的 Bluetooth 范围内,一旦调度器运行脚本,你就应该收到通知,如下所示:

将标签移出 KNOT 的范围(等待 1 分钟),你将收到另一条通知:
