如标题所示。
我很难为此找到一个不错的python dbus模块。途中有很多烟,镜子和陷阱。
首先,让我们看看我做了什么。
第一个诱杀装置是dbus-python。根本无法正常工作。甚至例子都是坏的。
它似乎已过时,并由pydbus代替
(他们的版权拥有者/作者似乎都一样)
让我们看看pydbus。同样,这些示例也不是那么好用:
from pydbus import SystemBus
bus = SystemBus()
dev = bus.get('.NetworkManager', 'Devices/0')
给
KeyError: 'object does not export any interfaces; you might need to pass object path as the 2nd argument for get()'
但是,如果我们尝试完全相反的错误消息。
dev = bus.get('.NetworkManager')
我们通过许多方法获得了一个不错的对象:
dir(dev)
['ActivateConnection',
'ActivatingConnection',
'ActiveConnections',
'AddAndActivateConnection',
'AllDevices',
'Capabilities',
'CheckConnectivity',
'CheckPermissions',
'CheckpointCreate',
'CheckpointDestroy',
'CheckpointRollback',
'Connectivity',
....
]
到目前为止,一切都很好。让我们看一下是否可以使用蓝牙:
dev = bus.get('org.bluez')
dir(dev)
['Introspect',
'RegisterAgent',
'RegisterProfile',
'RequestDefaultAgent',
'UnregisterAgent',
'UnregisterProfile'
]
因此,再次使用某些方法创建了一个不错的对象。但是,大多数事情都丢失了。让我们看一下这个例子:
https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt
无法使用pydbus获得提到的“连接”方法。
请不要建议我使用subprocess.Popen和bluetoothctl-那是多么la脚。此外,我想学习dbus。
问题:
如何获得所有蓝牙方法的访问权限?
什么是正确使用的dbus python绑定(实际上有效)?
任何工作示例将不胜感激。
我想使用python实现bt配对
一些参考:
另一个SO问题:Bluez Programming
Dbus规格:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc
现代debian linux发行版附带的著名
bluetoothctl
程序的源代码:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/client/main.c不错的dbus文章:https://medium.com/cesar-update/exposing-a-d-bus-interface-in-linux-part-2-90374a9e381b
编辑:
当然,有python bluez库。但这是GPL许可的。而且无法将设备与bluez配对,对吗?
最佳答案
编辑:我在这里为所有这些(python + dbus +蓝牙)创建了一个演示:https://github.com/elsampsa/btdemo
玩得开心。
无需从这里进一步走-只需使用该仓库
我在途中发现了更多库和教程:
中的文章:https://medium.com/@trstringer/talking-to-systemd-through-dbus-with-python-53b903ee88b1
Bluetool库:https://github.com/emlid/bluetool
dbus规格:https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces
我对dbus-python的评论还为时过早。 Bluetool使用它,通过遵循bluetool的代码,我可以继续前进:
import dbus
def my_pprint(obj, intend = 0):
if isinstance(obj, dict):
for key, value in obj.items():
print(intend*" "+str(key)+" : ")
my_pprint(value, intend = intend + 4)
print()
elif isinstance(obj, list):
for value in obj:
my_pprint(value, intend = intend + 4)
print()
else:
print(intend*" "+str(obj))
bus = dbus.SystemBus()
proxy_object = bus.get_object("org.bluez","/")
manager = dbus.Interface(proxy_object, "org.freedesktop.DBus.ObjectManager")
objects = manager.GetManagedObjects()
my_pprint(objects) # see DUMP 1 in the end of this answer
即bluez dbus接口实现了object manager,从而提供了一个很好的对象嵌套结构(请参见下面的转储)
可以通过以下方法确认在bluez dbus接口上未实现的内容:
gdbus introspect --system --dest [Service] --object-path [Object path]
服务器和对象路径来自API文档here
例如:
gdbus introspect --system --dest org.bluez --object-path /org/bluez
gdbus introspect --system --dest org.bluez --object-path /
gdbus introspect --system --dest org.bluez --object-path /org/bluez/hci0
实现配对后,我将更新此答案。
代码段中的DUMP1
/org/bluez :
org.freedesktop.DBus.Introspectable :
org.bluez.AgentManager1 :
org.bluez.ProfileManager1 :
/org/bluez/hci0 :
org.freedesktop.DBus.Introspectable :
org.bluez.Adapter1 :
Address :
9C:B6:D0:8C:5D:D6
AddressType :
public
Name :
sampsa-xps13
...
...
org.freedesktop.DBus.Properties :
org.bluez.GattManager1 :
org.bluez.LEAdvertisingManager1 :
ActiveInstances :
SupportedInstances :
SupportedIncludes :
tx-power
appearance
local-name
org.bluez.Media1 :
org.bluez.NetworkServer1 :
/org/bluez/hci0/dev_58_C9_35_2F_A1_EF :
org.freedesktop.DBus.Introspectable :
org.bluez.Device1 :
Address :
58:C9:35:2F:A1:EF
AddressType :
public
Name :
Nokia 5
Alias :
Nokia 5
Class :
5898764
Icon :
phone
Paired :
1
Trusted :
0
Blocked :
0
...
...
org.freedesktop.DBus.Properties :
org.bluez.Network1 :
Connected :
0
org.bluez.MediaControl1 :
Connected :
0
[any other devices follow]