如何通过 dbus 执行蓝牙发现?
How do you perform bluetooth discovery through dbus?
我是 dbus 初学者,正在尝试使用 bash dbus-send 命令执行蓝牙扫描。我用这条线:
$dbus-send --system --type=method_call --dest=org.bluez --print-reply /org/bluez/hci0 org.bluez.Adapter1.StartDiscovery
但没有发现开始...
在 dbus-monitor 中我看到:
method call time=1511273024.833459 sender=:1.55 -> destination=org.freedesktop.DBus serial=1 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=Hello
method return time=1511273024.921444 sender=org.freedesktop.DBus -> destination=:1.55 serial=1 reply_serial=1
string ":1.55"
signal time=1511273024.923719 sender=org.freedesktop.DBus -> destination=(null destination) serial=101 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.55"
string ""
string ":1.55"
signal time=1511273024.926411 sender=org.freedesktop.DBus -> destination=:1.55 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.55"
method call time=1511273024.927109 sender=:1.55 -> destination=org.bluez serial=2 path=/org/bluez/hci0; interface=org.bluez.Adapter1; member=StartDiscovery
method call time=1511273024.927628 sender=:1.1 -> destination=org.freedesktop.DBus serial=69 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0=':1.55'"
method return time=1511273024.928272 sender=org.freedesktop.DBus -> destination=:1.1 serial=43 reply_serial=69
method return time=1511273024.928729 sender=:1.1 -> destination=:1.55 serial=70 reply_serial=2
signal time=1511273024.929236 sender=org.freedesktop.DBus -> destination=:1.55 serial=5 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string ":1.55"
signal time=1511273024.929945 sender=org.freedesktop.DBus -> destination=(null destination) serial=44 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.55"
string ":1.55"
string ""
method call time=1511273024.930956 sender=:1.1 -> destination=org.freedesktop.DBus serial=71 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=RemoveMatch
string "type='signal',sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0=':1.55'"
method return time=1511273024.931635 sender=org.freedesktop.DBus -> destination=:1.1 serial=45 reply_serial=71
signal time=1511273024.932142 sender=:1.1 -> destination=(null destination) serial=72 path=/org/bluez/hci0; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.bluez.Adapter1"
array [
dict entry(
string "Discovering"
variant boolean false
)
]
array [
]
当我使用 bluetoothctl
和 scan on
时,我可以执行蓝牙扫描。我试图比较 bluetoothctl 工具和我的 bash 之间的 dbus 消息。当我在 bash 中使用 dbus 时,我收到很多信号 NameOwnerChanged
总是跟着 RemoveMatch
这让我很感兴趣....
其他 dbus 方法有效(ListNames
、GetManagedObjects
、Connect
、RemoveDevice
)
我看到这个 post 有同样的问题:How to use dbus-send to call org.bluez.Adapter1.StartDiscovery?
但我不知道如何"keep the D-Bus proxy object to the adapter alive."
你有线索吗?
我使用的是:dbus-daemon 1.10.10、Bluez 5.41
感谢您的宝贵时间
我很确定您不能使用 dbus-send 或 shell 通常执行此操作:在您的示例中,该工具将断开连接并在方法调用后立即退出 returns (这发生在扫描真正开始之前)。然后 Bluez 注意到客户端不再存在并假设没有人感兴趣并停止扫描。
我建议使用适当的编程语言:如果您打算用像 Bluez 这样的复杂 DBus API 做任何重要的事情,您无论如何都需要这样做。像 python 这样的脚本语言如果有足够好的 D-Bus 绑定就可以很好地工作。 Bash 几乎肯定没有它们:尝试在 shell 中表达复杂的 D-Bus 签名将非常痛苦,而且可能是不可能的。
您不能使用 dbus-send 执行此操作。在这种情况下,Bluez 在发件人上添加了一个断开连接观察器。您的应用程序应该获得一个 DBus 连接并且应该 运行 正在执行发现。
从 Bluez 源目录中尝试 test/test-discovery python 脚本。它做你想做的。如果您不想添加任何 Discovery 过滤器,您可以在 python 脚本和 运行 脚本的下方评论。
adapter.SetDiscoveryFilter(scan_filter)
# after commenting, run it with: python test-discovery
我是 dbus 初学者,正在尝试使用 bash dbus-send 命令执行蓝牙扫描。我用这条线:
$dbus-send --system --type=method_call --dest=org.bluez --print-reply /org/bluez/hci0 org.bluez.Adapter1.StartDiscovery
但没有发现开始...
在 dbus-monitor 中我看到:
method call time=1511273024.833459 sender=:1.55 -> destination=org.freedesktop.DBus serial=1 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=Hello
method return time=1511273024.921444 sender=org.freedesktop.DBus -> destination=:1.55 serial=1 reply_serial=1
string ":1.55"
signal time=1511273024.923719 sender=org.freedesktop.DBus -> destination=(null destination) serial=101 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.55"
string ""
string ":1.55"
signal time=1511273024.926411 sender=org.freedesktop.DBus -> destination=:1.55 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.55"
method call time=1511273024.927109 sender=:1.55 -> destination=org.bluez serial=2 path=/org/bluez/hci0; interface=org.bluez.Adapter1; member=StartDiscovery
method call time=1511273024.927628 sender=:1.1 -> destination=org.freedesktop.DBus serial=69 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "type='signal',sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0=':1.55'"
method return time=1511273024.928272 sender=org.freedesktop.DBus -> destination=:1.1 serial=43 reply_serial=69
method return time=1511273024.928729 sender=:1.1 -> destination=:1.55 serial=70 reply_serial=2
signal time=1511273024.929236 sender=org.freedesktop.DBus -> destination=:1.55 serial=5 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string ":1.55"
signal time=1511273024.929945 sender=org.freedesktop.DBus -> destination=(null destination) serial=44 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.55"
string ":1.55"
string ""
method call time=1511273024.930956 sender=:1.1 -> destination=org.freedesktop.DBus serial=71 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=RemoveMatch
string "type='signal',sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0=':1.55'"
method return time=1511273024.931635 sender=org.freedesktop.DBus -> destination=:1.1 serial=45 reply_serial=71
signal time=1511273024.932142 sender=:1.1 -> destination=(null destination) serial=72 path=/org/bluez/hci0; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.bluez.Adapter1"
array [
dict entry(
string "Discovering"
variant boolean false
)
]
array [
]
当我使用 bluetoothctl
和 scan on
时,我可以执行蓝牙扫描。我试图比较 bluetoothctl 工具和我的 bash 之间的 dbus 消息。当我在 bash 中使用 dbus 时,我收到很多信号 NameOwnerChanged
总是跟着 RemoveMatch
这让我很感兴趣....
其他 dbus 方法有效(ListNames
、GetManagedObjects
、Connect
、RemoveDevice
)
我看到这个 post 有同样的问题:How to use dbus-send to call org.bluez.Adapter1.StartDiscovery?
但我不知道如何"keep the D-Bus proxy object to the adapter alive."
你有线索吗?
我使用的是:dbus-daemon 1.10.10、Bluez 5.41
感谢您的宝贵时间
我很确定您不能使用 dbus-send 或 shell 通常执行此操作:在您的示例中,该工具将断开连接并在方法调用后立即退出 returns (这发生在扫描真正开始之前)。然后 Bluez 注意到客户端不再存在并假设没有人感兴趣并停止扫描。
我建议使用适当的编程语言:如果您打算用像 Bluez 这样的复杂 DBus API 做任何重要的事情,您无论如何都需要这样做。像 python 这样的脚本语言如果有足够好的 D-Bus 绑定就可以很好地工作。 Bash 几乎肯定没有它们:尝试在 shell 中表达复杂的 D-Bus 签名将非常痛苦,而且可能是不可能的。
您不能使用 dbus-send 执行此操作。在这种情况下,Bluez 在发件人上添加了一个断开连接观察器。您的应用程序应该获得一个 DBus 连接并且应该 运行 正在执行发现。
从 Bluez 源目录中尝试 test/test-discovery python 脚本。它做你想做的。如果您不想添加任何 Discovery 过滤器,您可以在 python 脚本和 运行 脚本的下方评论。
adapter.SetDiscoveryFilter(scan_filter)
# after commenting, run it with: python test-discovery