通过 python 和 dbus 使用蓝牙

El *_*psa 4 python dbus bluetooth

正如标题所示。

我很难找到一个合适的 python dbus 模块。路上有很多烟雾、镜子和陷阱。

首先,让我们看看我做了什么。

第一个诱杀装置是dbus-python。根本无法让它工作。甚至连例子都被破坏了。

好像已经过时了,被pydbus取代了

(两者的版权所有者/作者似乎是相同的)

那我们来看看 pydbus 吧。另外,这些例子的效果也不是很好:

from pydbus import SystemBus
bus = SystemBus()
dev = bus.get('.NetworkManager', 'Devices/0')
Run Code Online (Sandbox Code Playgroud)

给出

KeyError: 'object does not export any interfaces; you might need to pass object path as the 2nd argument for get()'
Run Code Online (Sandbox Code Playgroud)

然而,如果我们尝试一些与该错误消息完全相反的东西..

dev = bus.get('.NetworkManager')
Run Code Online (Sandbox Code Playgroud)

我们得到了一个带有很多方法的漂亮对象:

dir(dev)
['ActivateConnection',
 'ActivatingConnection',
 'ActiveConnections',
 'AddAndActivateConnection',
 'AllDevices',
 'Capabilities',
 'CheckConnectivity',
 'CheckPermissions',
 'CheckpointCreate',
 'CheckpointDestroy',
 'CheckpointRollback',
 'Connectivity',
 ....
 ]
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。让我们看看我们是否可以使用蓝牙:

dev = bus.get('org.bluez')
dir(dev)
['Introspect',
 'RegisterAgent',
 'RegisterProfile',
 'RequestDefaultAgent',
 'UnregisterAgent',
 'UnregisterProfile'
 ]
Run Code Online (Sandbox Code Playgroud)

所以,这又是一个带有一些方法的好对象。然而大部分东西都不见了。让我们看一下这个例子:

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt

无法使用 pydbus 获得提到的“连接”方法..?

请不要建议我将 subprocess.Popen 与 bluetoothctl 一起使用 - 那是多么蹩脚。另外,我想学习dbus。

问题:

  • 如何访问所有蓝牙方法?
  • 正确使用的 dbus python 绑定是什么(实际上有效)?
  • 任何可行的例子都将受到高度赞赏。
  • 我想使用python实现bt配对

一些参考:

编辑:

当然,还有 python bluez库。但那是 GPL 许可的。而且没有办法将设备与 bluez 配对,对吧?

El *_*psa 9

编辑:我在这里为所有这些(python + dbus + 蓝牙)创建了一个演示: https: //github.com/elsampsa/btdemo

玩得开心。

无需从这里走得更远 - 只需使用该存储库

我在路上发现了更多的库和教程:

Medium 上的一篇文章: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()
    elif isinstance(obj, dbus.Byte ):
         print(intend*" "+ hex(obj) )
    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
Run Code Online (Sandbox Code Playgroud)

即,bluez dbus 接口实现了一个对象管理器,提供了一个很好的对象嵌套结构(请参见下面的转储)

bluez dbus 接口实现(未实现)的内容可以通过以下方式确认:

gdbus introspect --system --dest [Service] --object-path [Object path]
Run Code Online (Sandbox Code Playgroud)

其中服务器和对象路径来自此处的API 文档

例如:

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
Run Code Online (Sandbox Code Playgroud)

一旦我实现配对,我会更新这个答案..

代码片段中的 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]
Run Code Online (Sandbox Code Playgroud)

  • 嗨桑普萨。您在配对方面有进一步的了解吗? (2认同)