我有一个 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