【问题标题】:Using bluetooth with python and dbus在 python 和 dbus 中使用蓝牙
【发布时间】:2020-03-08 05:08:12
【问题描述】:

正如标题所示。

我很难为这个找到一个像样的 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 一起使用 - 那是多么蹩脚。另外,我想学dbus。

问题:

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

一些参考资料:

编辑:

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

【问题讨论】:

    标签: python bluetooth dbus


    【解决方案1】:

    编辑:我在这里为所有这些(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 的 cmets 还为时过早。 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
    

    我会在完成配对后更新此答案..

    来自代码 sn-p 的 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]
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2021-12-10
      • 2012-07-31
      • 2017-05-24
      • 2021-12-18
      • 2017-11-06
      • 2021-03-12
      • 2012-04-21
      • 2018-05-05
      相关资源
      最近更新 更多