linux 是否可以使用pybluez“授权服务”?

rggaifut  于 2023-03-07  发布在  Linux
关注(0)|答案(1)|浏览(135)

如果我将蓝牙设备与PC配对,但我 * 不 * 信任它,则每当我打开蓝牙设备时,我都会在bluetoothctl中得到如下提示:

Authorize service
[agent] Authorize service 0000111f-0000-1000-8000-00805f9b34fb (yes/no):

如果键入yes,则允许连接设备。
我想写一个小的Python脚本,监视新服务并提示我使用inotify-send授权它们,pybluez似乎是完成这项工作的工具。但是,在阅读了文档之后,我不知道这是否可行。(很大程度上可能是因为我不熟悉蓝牙技术术语。)

是否可以使用pybluez监视和授权服务,如果可以,如何操作?

6rqinv9w

6rqinv9w1#

给你,不需要pybluez。

#!/usr/bin/python3

import dbus
import dbus.mainloop.glib
import dbus.service
from gi.repository import GLib

AGENT_PATH = "/org/bluez/AuthorizeServiceAgent"
AGENT_INTERFACE = 'org.bluez.Agent1'
CAPABILITY = "DisplayYesNo"

class Agent(dbus.service.Object):
    @dbus.service.method(AGENT_INTERFACE, in_signature="os", out_signature="")
    def AuthorizeService(self, device, uuid):
        print("AuthorizeService %s %s" % (device, uuid))
        if uuid == "0000111f-0000-1000-8000-00805f9b34fb":
            print("Whitelisted")
            return
        print("Rejected")
        raise dbus.DBusException("AuthorizeService rejected")

if __name__ == '__main__':
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

    bus = dbus.SystemBus()
    agent = Agent(bus, AGENT_PATH)
    obj = bus.get_object("org.bluez", "/org/bluez")

    manager = dbus.Interface(obj, "org.bluez.AgentManager1")
    manager.RegisterAgent(AGENT_PATH, CAPABILITY)
    manager.RequestDefaultAgent(AGENT_PATH)

    GLib.MainLoop().run()

我写这篇文章是为了解决一个相关的问题,即每当我插入PS4控制器时,Bluez 5. 53总是不停地解除配对。Bluez实际上所做的是每次插入控制器时发送授权服务请求,或者在您的情况下,每当您为蓝牙设备供电时,如果没有蓝牙代理响应,则会自动拒绝。如果您运行bluetoothctl,则它将充当蓝牙代理,并询问是否授权该服务。
controller issue looks fixed in the latest bluez,但不在Ubuntu LTS 22. 04或更早版本中。不确定您的情况是否受此修复的影响。
该代码基于example/test code that bluez provides

相关问题