带时间戳的简单蓝牙设备监视器

带时间戳的简单蓝牙设备监视器

我有一个 Raspberry Pi(是的,带有 BT),我希望它能够用作一个非常简单的蓝牙监视器,将它听到的信标/附近设备 ID/任何内容记录在一个很长的文本文件中,以供以后处理。

我已经bluez安装了 et al.,我甚至可以做一个

sudo bluetoothctl -- scan on

获得附近设备的漂亮的 ANSI 颜色输出:

[NEW] Device A3:33:00:AB:CC:FF A3-33-00-AB-CC-FF
[CHG] Device A3:33:00:AB:CC:FF RSSI: -72

&C

我可以使用 shell 将此输出捕获到文本文件中,尽管有 ANSI 控制字符,但我仍然非常高兴。

我唯一想要但却没有的是每个条目的时间戳。

天哪我试过了一切.我甚至不知道关心大约亚秒级的精度。只是一些时间戳。我只会如果我得不到它们。

答案1

尝试以下命令:

stdbuf -oL bluetoothctl -- scan on | ts

解释:

ts实用程序在输入的每一行开头添加一个时间戳。它有许多有用的选项,如时间戳格式、绝对时间或相对时间(自开始ts或上一行以来经过的时间)。

但是,大多数程序(包括 bluetoothctl)如果没有连接到终端,都会缓冲其输出。这意味着如果我们将输出导入ts,则在缓冲区满之前不会显示任何内容,这意味着很多的线路必须积累才能全部被冲洗掉立刻,违背了 的目的ts。为了解决这个问题,我们可以使用该stdbuf实用程序覆盖输出缓冲,使其逐行进行,即,只要输出一行,它就会被刷新,并且 ts 可以为其添加时间戳并显示它。

答案2

请不要

当我测试这个附加时间戳时:

bluetoothctl | tr -d '\r' | while read -r line; do echo "$(date +%T) $line"; done

使用此方法,我们可以追踪多少秒前AA:BB:CC:DD看到以 MAC 开头的蓝牙标签:

bluetoothctl | awk '/Device AA:BB:CC:DD/' | tr -d '\r' | while read -r line; do 

    MAC=_$(echo "$line" | cut -d' ' -f4 | tr -d ':')
    
    declare ${MAC}_TS=$(date +%s)
    
    TMP=${MAC}_TS
    TS=${!TMP}

    TMP=${MAC}_PREV_TS
    PREV_TS=${!TMP}

    printf "%-2d %s\n" "$((TS - PREV_TS))" "$line"

    declare ${MAC}_PREV_TS=$TS

done

相关内容