当前位置: 首页 > 知识库问答 >
问题:

在Python中列出附近/可发现的蓝牙设备,包括已配对的Linux

花玄裳
2023-03-14

我试图在Linux上使用Python列出所有附近/可发现的蓝牙设备,包括已经配对的设备。

我知道如何使用设备地址列出设备的服务,并且可以成功连接:

services = bluetooth.find_service(address='...')

阅读PyBluez文档,如果我不指定任何标准,我希望附近的任何设备都会出现:

如果未指定条件,则返回检测到的所有附近服务的列表

我现在唯一需要的是能够列出已经配对的设备,无论它们是开着的、关着的、附近的还是没有的。很像我在所有设置中得到的列表--

顺便说一句,以下没有列出我机器上已经配对的设备,即使它们在/附近。可能是因为一旦配对就无法发现它们:

import bluetooth
for d in bluetooth.discover_devices(flush_cache=True):
    print d

有什么想法...?

编辑:我找到并安装了“Bluez-tools”。

bt-device --list

。。。为我提供所需的信息,即添加设备的地址。

我检查了C源代码,发现这可能不像我想象的那么容易。

仍然不知道如何在Python中执行此操作。。。

编辑:我认为DBUS可能是我应该阅读的内容。似乎足够复杂。如果有人有一些代码要分享,我会非常高兴。:)

共有3个答案

汲灿
2023-03-14

您始终可以将其作为shell命令执行并读取它返回的内容:

import subprocess as sp
p = sp.Popen(["bt-device", "--list"], stdin=sp.PIPE, stdout=sp.PIPE, close_fds=True)
(stdout, stdin) = (p.stdout, p.stdin)
data = stdout.readlines()

现在data将包含所有输出行的列表,您可以根据需要对其进行格式化和播放。

薛彭薄
2023-03-14

自从采用蓝牙API版本5以来,@Micke解决方案中使用的大多数功能都被删除,与总线的交互通过ObjectManager进行。GetManagedObject[1]

import dbus


def proxyobj(bus, path, interface):
    """ commodity to apply an interface to a proxy object """
    obj = bus.get_object('org.bluez', path)
    return dbus.Interface(obj, interface)


def filter_by_interface(objects, interface_name):
    """ filters the objects based on their support
        for the specified interface """
    result = []
    for path in objects.keys():
        interfaces = objects[path]
        for interface in interfaces.keys():
            if interface == interface_name:
                result.append(path)
    return result


bus = dbus.SystemBus()

# we need a dbus object manager
manager = proxyobj(bus, "/", "org.freedesktop.DBus.ObjectManager")
objects = manager.GetManagedObjects()

# once we get the objects we have to pick the bluetooth devices.
# They support the org.bluez.Device1 interface
devices = filter_by_interface(objects, "org.bluez.Device1")

# now we are ready to get the informations we need
bt_devices = []
for device in devices:
    obj = proxyobj(bus, device, 'org.freedesktop.DBus.Properties')
    bt_devices.append({
        "name": str(obj.Get("org.bluez.Device1", "Name")),
        "addr": str(obj.Get("org.bluez.Device1", "Address"))
    })  

在bt\U设备列表中,有包含所需数据的字典:ie

例如

[{
    'name': 'BBC micro:bit [zigiz]', 
    'addr': 'E0:7C:62:5A:B1:8C'
 }, {
    'name': 'BBC micro:bit [putup]',
    'addr': 'FC:CC:69:48:5B:32'
}]

参考文献:[1]http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/

郎恺
2023-03-14

我自己设法解决了这个问题。以下代码段列出了默认蓝牙适配器上所有配对设备的地址:

import dbus

bus = dbus.SystemBus()

manager = dbus.Interface(bus.get_object('org.bluez', '/'), 'org.bluez.Manager')

adapterPath = manager.DefaultAdapter()

adapter = dbus.Interface(bus.get_object('org.bluez', adapterPath), 'org.bluez.Adapter')

for devicePath in adapter.ListDevices():
    device = dbus.Interface(bus.get_object('org.bluez', devicePath),'org.bluez.Device')
    deviceProperties = device.GetProperties()
    print deviceProperties["Address"]
 类似资料:
  • 问题内容: 我正在尝试使用Linux上的Python 列出所有附近的/可发现的蓝牙设备, 包括已经配对的 蓝牙设备。 我知道如何使用其地址列出设备的服务,并且可以成功连接: 如果我不指定任何条件,则阅读PyBluez文档时,我希望附近的任何设备都能显示出来: “如果未指定任何条件,则返回检测到的所有附近服务的列表。” 我现在唯一需要的是能够列出已经配对的设备,无论它们是打开,关闭,附近还是不打开。

  • 我正在制作一个利用蓝牙功能的应用程序,例如扫描设备等。我检查了扫描标志并返回true,但没有显示我正在测试的可发现设备。 我使用三星J7 Pro作为我的应用程序测试设备,三星J7是我想在发现的设备列表中看到的设备。 J7已设置为可发现且蓝牙已打开。 我的代码基于Monkey。蓝牙 以下是我所拥有的: 声明 功能 listview绑定到将显示发现的设备的“vm”。它不显示任何内容,计数始终为零,但我

  • 问题内容: 我正在寻找一种以编程方式列出我的设备所找到的附近任何蓝牙设备(可发现)的方法。我无法找到有关在Swift3.0中执行此调用的任何信息或教程。这篇QA帖子讨论了使用Swift 1.0查找这些设备并在Xcode 6(而不是最新版本8)中进行构建。 我尽力将代码从1.0转换为3.0语法,但是在运行以下代码时,Playground不返回任何内容: 问题答案: 正确使用IOBluetooth 下

  • 我想查找没有已配对设备的蓝牙设备。但是我的python脚本显示了我配对的设备上的蓝牙设备。如何只过滤打开的设备并忽略电脑中的配对设备,而不删除它们。 这是我的剧本

  • 我试图用BLE API扫描附近的蓝牙设备,但它似乎不起作用 我已经在清单中添加了权限 以下内容在创建对象时 创建扫描仪回调对象并进一步扫描 在logcat中,我只看到以下内容 这是我的app build gradle } 有人能指出我在这里遗漏了什么吗?

  • 问题内容: 我正在创建一个应通过蓝牙连接到特定设备的应用程序。 无论设备是否已配对,我都希望我的应用程序与此设备连接。 现在我有这个 但是此功能仅连接到配对的设备。如果我的设备尚未配对,我想将其配对。不知道该怎么做。 有人可以给我任何建议吗? 问题答案: 首次请求权限。 然后使您的设备可发现: 然后创建一个 BroadcastReceiver 来监听系统中的动作: 并通过注册以下 Boardcas