0

问题的背景

因此,我正在开发一个小型 posix shell 脚本,该脚本旨在围绕蓝牙进行,并且由于我正在考虑将其“发布”给公众,因此我正在优化它并稍后与其他人共享代码,以便我可以对其进行审查。


问题

我获取与主机配对的每个蓝牙设备(即运行此 shell 脚本的设备)的方式是:

busctl tree org.bluez > $tempfile
while read mac; do
    t=$(echo "${mac##*/dev_}"| grep -v "└─/org")
    a=${t%%/*}
    #Discard repeats due to there being "sub-adresses"
    if [ -z "$a" ] || [ "$a" != "$t" ]; then
        continue;
    fi
    #There's other code running here

done < $tempfile

然后在循环中使用对象名称,我只是使用它们来返回它们的地址,以及其他我不会详细介绍的属性,就像这样

c=$(busctl get-property $SERVICE $OBJ_TEMPLATE"$a" $INTERFACE Address)
c=${c##s }
# will return something like " 00:00:00:dd:33:22"

这在很大程度上是无用的,因为从我所看到的 busctl 树给出的对象名称,格式化后,对应于它将从属性回复的内容address

事情是我害怕由于 busctl 部分或设备部分的某种损坏,它们可能不匹配,两者仍然可以正常工作,但前提是我将对象名称视为别名而不是固定的通用固定命名约定

exe:在执行 busctl 树时,它会回复其中一行:├─/org/bluez/hci0/dev_00_00_00_00_B5_C8但 get-property 将返回s 22:33:21:25:AA:B4

4

1 回答 1

2

您可能会更好地通过调用接口获取有关哪些设备可用的信息GetManagedObjectsorg.freedesktop.DBus.ObjectManager

例如:

busctl call org.bluez / org.freedesktop.DBus.ObjectManager GetManagedObjects

要仅获取缓存中的设备(及其地址),您可以轻松地 grep 该信息:

 busctl call org.bluez / org.freedesktop.DBus.ObjectManager GetManagedObjects | grep -Po '"org.bluez.Device1".*?"Address" s \S+'

要查找设备是否已配对,您可以将其添加到 grep:

busctl call org.bluez / org.freedesktop.DBus.ObjectManager GetManagedObjects | grep -Po '"org.bluez.Device1".*?"Address" s \S+\s+.*?"Paired" b \S+'
于 2021-11-15T14:33:17.840 回答