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 部分中)。

  1. MAC 地址行:
:local addressRegex "DC:2C:6E:91:D6:F3"

上面的行,你需要在其中输入标签的 MAC 地址(你可以在标签的标签上找到打印的标签 MAC 地址)。

  1. 不在范围通知 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。

  1. 在范围内通知 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 分钟),你将收到另一条通知: