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。
问题:
一些参考:
bluetoothctl现代 debian Linux 发行版附带的著名程序的源代码: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/client/main.c编辑:
当然,还有 python bluez库。但那是 GPL 许可的。而且没有办法将设备与 bluez 配对,对吧?
编辑:我在这里为所有这些(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)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           10177 次  |  
        
|   最近记录:  |