killall bluetoothd 一直不成功

本文介绍了一个基于Python的蓝牙守护程序Blueman的实现细节。该程序使用了dbus和GTK等技术,并通过插件系统扩展功能。文章展示了如何初始化蓝牙管理器,监听设备变化并处理信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最后调查发现是bluetman 惹得祸

贴上他的守护程序,以后也可以写一个

#! /usr/bin/python3

from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from __future__ import unicode_literals

import sys
import os.path
import os
import signal
import dbus
from dbus.mainloop.glib import DBusGMainLoop
from blueman.Constants import *
import gi
gi.require_version("Gtk", "3.0")
gi.require_version('Notify', '0.7')
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GObject
from gi.repository import Notify
try: import __builtin__ as builtins
except ImportError: import builtins

DBusGMainLoop(set_as_default=True)

#support running uninstalled
_dirname = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
if os.path.exists(os.path.join(_dirname, "CHANGELOG.md")):
    sys.path.insert(0, _dirname)

from blueman.Functions import *

from blueman.main.DbusService import DbusService

import blueman.plugins.applet
from blueman.plugins.AppletPlugin import AppletPlugin
from blueman.plugins.BasePlugin import BasePlugin

import blueman.bluez as Bluez

from blueman.main.SignalTracker import SignalTracker

from blueman.main.PluginManager import PersistentPluginManager

# Workaround introspection bug, gnome bug 622084
signal.signal(signal.SIGINT, signal.SIG_DFL)
signal.signal(signal.SIGTERM, signal.SIG_DFL)

class BluemanApplet(object):
    def __init__(self):
        setup_icon_path()
        if not Notify.init("Blueman"):
            dprint("Error: Failed to initialize libnotify")

        check_single_instance("blueman-applet")

        self.Manager = None
        self.DbusSvc = DbusService("org.blueman.Applet", "/")
        self.Signals = SignalTracker()

        self.Plugins = PersistentPluginManager(AppletPlugin, blueman.plugins.applet, self)
        self.Plugins.Load()

        self.Plugins.Run("on_plugins_loaded")

        self.bus = dbus.SystemBus()
        self.bus.watch_name_owner("org.bluez", self.on_dbus_name_owner_change)

        Bluez.Adapter().handle_signal(self.on_adapter_property_changed, 'PropertyChanged', path_keyword='path')

        Gtk.main()


    def manager_init(self):
        try:

            self.Signals.DisconnectAll()
            self.Manager = Bluez.Manager()
            self.Plugins.Run("on_manager_state_changed", True)

            self.Signals.Handle("bluez", self.Manager, self.on_adapter_removed, "AdapterRemoved")
            self.Signals.Handle("bluez", self.Manager, self.on_adapter_added, "AdapterAdded")

        except dbus.exceptions.DBusException as e:
            dprint(e)
            self.manager_deinit()
            dprint("Bluez DBus API not available. Listening for DBus name ownership changes")

    def manager_deinit(self):
        self.Signals.DisconnectAll()
        self.Manager = None
        self.Plugins.Run("on_manager_state_changed", False)

    def on_dbus_name_owner_change(self, owner):
        dprint("org.bluez owner changed to", owner)
        if owner == "":
            self.manager_deinit()
        elif self.Manager is None:
            self.manager_init()

    def on_adapter_property_changed(self, key, value, path):
        self.Plugins.Run("on_adapter_property_changed", path, key, value)

    def on_adapter_added(self, path):
        dprint("Adapter added ", path)

        def on_activate():
            dprint("Adapter activated")
            self.Plugins.Run("on_adapter_added", path)

        adapter = Bluez.Adapter(path)
        wait_for_adapter(adapter, on_activate)

    def on_adapter_removed(self, path):
        dprint("Adapter removed ", path)
        self.Plugins.Run("on_adapter_removed", path)


set_proc_title()
BluemanApplet()

转载于:https://www.cnblogs.com/eat-too-much/p/8531190.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值