如标题所示。

我很难为此找到一个不错的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]

10-06 00:54