我正在尝试在Linux上使用Python列出所有附近/可发现的蓝牙设备,包括那些已经配对的。
我知道如何使用其地址列出设备的服务,并且可以成功连接:
services = bluetooth.find_service(address='...')
阅读PyBluez文档如果我没有指定任何标准,我希望附近的设备能够出现:
“如果未指定条件,则返回检测到的所有附近服务的列表。”
我现在需要的“唯一”事情就是能够列出已经配对的设备,无论它们是开,关还是不在附近。就像我在“所有设置”中获得的列表一样 - > Ubuntu / Unity中的蓝牙。
顺便说一句,以下不会列出我机器上已配对的设备,即使它们在/附近也是如此。可能是因为配对后它们是不可发现的:
import bluetooth
for d in bluetooth.discover_devices(flush_cache=True):
print d
任何想法......?
修改:我找到并安装了“bluez-tools”。
bt-device --list
...向我提供了我需要的信息,即添加设备的地址。
我检查了C源,发现这可能不像我想象的那么容易。
仍然不知道如何在Python中执行此操作...
编辑:我认为DBUS可能就是我应该阅读的内容。看起来很复杂。如果有人有一些代码要分享,我会非常高兴。 :)
答案 0 :(得分:8)
我自己设法解决了这个问题。以下代码段列出了我的默认蓝牙适配器上所有配对设备的地址:
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"]
答案 1 :(得分:5)
您始终可以将其作为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
将包含所有输出行的列表,您可以根据需要进行格式化和播放。
答案 2 :(得分:3)
自从采用蓝牙API第5版以来,@ Micke解决方案中使用的大多数功能都已删除,并且交互 总线通过ObjectManager.GetManagedObjects [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_device
列表中,有带有所需数据的字典:
即
例如
[{
'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/
答案 3 :(得分:1)
有点长,但可以在一行中完成花招
library(tidyverse)
# update column names
Obs = map(Observed, ~{as.data.frame.matrix(.x) %>% setNames(paste0("Obs_", names(.)))})
Exp = map(Expected, ~{as.data.frame.matrix(.x) %>% setNames(paste0("Exp_", names(.)))})
# bind columns of updated lists
# round columns
# reorder columns
map2(Obs, Exp, cbind) %>%
map(~{.x %>% mutate_all(round) %>% select(matches("0"), everything())})
# $`AgeGroup`
# Obs_0 Obs_1 Exp_0 Exp_1
# 1 49841 8740 42857 15724
# 2 4440 1687 4482 1645
# 3 14537 2735 12636 4636
# 4 11531 1656 9647 3540
# 5 41580 11206 38617 14169
# 6 17091 1798 13819 5070
# 7 27807 16417 32353 11871
# 8 16068 22866 28483 10451
#
# $Sex
# Obs_0 Obs_1 Exp_0 Exp_1
# 1 92576 32101 91211 33466
# 2 90319 35004 91684 33639
#
# $EthnicGroup
# Obs_0 Obs_1 Exp_0 Exp_1
# 1 140393 57125 144500 53018
# 2 10225 2456 9277 3404
# 3 4708 1139 4278 1569
# 4 20687 5055 18832 6910
# 5 2452 518 2173 797
# 6 4430 812 3835 1407