User Manual

Table Of Contents
################################## Bluetooth ##################################
:put ("[*] Gathering Bluetooth info...")
:global btOldestAdvertisementTimestamp
:if ([:typeof $btOldestAdvertisementTimestamp] = "nothing") do={
  # First time this script has been run since booting, need to initialize
  # persistent variables
  :set $btOldestAdvertisementTimestamp 0
}
:local btProcessingStart [/system clock get time]
:local advertisements [/iot bluetooth scanners advertisements print detail \
  as-value where \
    epoch > $btOldestAdvertisementTimestamp and \
    address ~ $addressRegex and \
    data ~ $advertisingDataRegex and \
    rssi > $rssiThreshold
]
:local advJson ""
:local advCount 0
:local advSeparator ""
:local lastAdvTimestamp 0
# Remove semicolons from MAC/Bluetooth addresses
:local minimizeMac do={
  :local minimized
  :local lastIdx ([:len $address] - 1)
  :for idx from=0 to=$lastIdx step=1 do={
    :local char [:pick $address $idx]
    :if ($char != ":") do={
      :set $minimized "$minimized$char"
    }
  }
  :return $minimized
}
:foreach adv in=$advertisements do={
  :local address ($adv->"address")
  :local ts ($adv->"epoch")
  :local rssi ($adv->"rssi")
  :local ad ($adv->"data")
  :local obj "\
    {\
      \"id\":\"$[$minimizeMac address=$address]\",\
      \"ts\":$ts,\
      \"rssi\":$rssi,\
      \"ed\":{\
        \"ad\":\"$ad\"\
      }\
    }"
  :set $advCount ($advCount + 1)
  :set $lastAdvTimestamp $ts
  # Ensure that the last object is not terminated by a comma
  :set $advJson "$advJson$advSeparator$obj"
  :if ($advSeparator = "") do={
    :set $advSeparator ","
  }
}
:if ($advCount > 0) do={
  :set $btOldestAdvertisementTimestamp $lastAdvTimestamp
}
:put ("[*] Found $advCount new advertisements \
  (processing time: $[([/system clock get time] - $btProcessingStart)])")