我在python中尝试蓝牙编程.它一直工作到昨天.今天早上有停电,由于某种原因,蓝牙模块被禁用,无法打开.所以,我做了一个sudo hciconfig hci0 reset,然后打开它.从那时起,最简单的程序无法执行.就拿这一次的例子.它卡在advertise_service中bluetooth模块中并抛出以下错误(仅供参考:virtualenv在这里不是问题.系统范围的python也做同样的事情).
Traceback (most recent call last):
File "bt.py", line 17, in <module>
advertise_service( server_sock, "SampleServer", service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], profiles = [ SERIAL_PORT_PROFILE ])
File "/home/machinename/.virtualenvs/py27/local/lib/python2.7/site-packages/bluetooth/bluez.py", line 242, in advertise_service
raise BluetoothError (str (e))
bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')
Run Code Online (Sandbox Code Playgroud)
有时在编译和重新安装Bluez驱动程序时出现了不同的错误:
Traceback (most recent call last):
File "build/bdist.linux-x86_64/egg/bluetooth/bluez.py", line 268, in advertise_service
bluetooth.btcommon.BluetoothError: error no advertisable device.
Run Code Online (Sandbox Code Playgroud)
但所有这些在这台机器之前就像一个魅力; 事实上,当我写这篇文章的时候,所有的程序都可以和我的其他ubuntu(14.04LTS)机器一起工作.我检查了源代码,并追溯到一个_bluetooth.so文件 …
似乎commit b1eb2c4cd057624312e0412f6c4be000f7fc3617
gatttool已被弃用,但我无法找到任何替代gattool的信息.
每个Python蓝牙LE包都在gatttool上进行了中继,现在我的ArchLinux系统坏了,因为bluez包没有用--enabled-deprecatedflag 构建(这将构建gatttool二进制).
pygatt只是在我的系统上打破并且bluepy没有构建,因为他们自己(在我的系统坏了)上运行bluez代码来构建gatttool.
无论如何我想在任何替换的gatttool周围写一个新包装但我无法找到关于这个主题的任何信息.
那么我可以使用bluez堆栈中的哪个工具编写新的Python蓝牙LE包装器?
我在这方面很努力,所以任何帮助/指针都将不胜感激。
我一直在尝试使用pyblueZ从RSSI获取精确值
我得到了一些不错的结果,但这是我不想要的(来自blueZ doc):
对于BR / EDR控制器,将Connection_Handle用作Handle命令参数和返回参数。RSSI参数返回测得的接收信号强度指示(RSSI)与到另一个BR / EDR控制器的Connection_Handle的黄金接收功率范围限制之间的差。Connection_Handle应为ACL连接的Connection_Handle。控制器返回的任何正RSSI值表示RSSI高于上限多少dB,任何负值表示RSSI低于下限多少dB。零值表示RSSI在黄金接收功率范围内。
换句话说,当接收器靠近发生器时,RSSI值仍将为0(可能是2/3米的范围),这确实让我感到困扰。
我使用的方法是BlueZ 的命令HCI_Read_RSSI,这里有一个示例:https : //github.com/ewenchou/bluetooth-proximity
获取RSSI值的另一种方法是通过事件获取它:HCI_Inquiry_Result_with_RSSI,这里我得到RSSI的真实值,但它是发现模式,有点慢,并且将所有设备的mac地址返回给我。而且我也不想。
以我的知识和我无法让Google找到想要的东西这一事实,我似乎陷入了困境。
所以我的问题是:
无论如何,有没有要研究blueZ提供的蓝牙API?我似乎在任何地方都找不到!并且不要开始与我谈论他们的文档,这几乎是不存在的!
有什么方法可以使HCI_Inquiry_Result_with_RSSI与单个mac地址一起工作?
还有其他获取RSSI值的方法吗?我尝试了hcitool(出现了同样的问题?),l2ping(在4/5成功后,我得到了100%的ping损失,我没有对此进行深入研究)
难道是我的加密狗被操纵了吗?
如果我尝试从BLE设备检测RSSI会有所不同吗?
(我现在暂时要坚持使用蓝牙,但是如果您想到我可以使用的任何其他射频信号,只需提及它,我将牢记在心以便以后使用。)
感谢您到那里阅读我的问题的任何人。
对我的英语感到抱歉,这已经很漫长了。
和平
编辑:使用Bluez,我可以发现BT classic,或者向RSSI询问特定的地址(但是获得的值超出黄金范围)。我也可以发现BLE,但找不到任何可用于RSSI的特定地址(适用于BLE)的信息...
我正在研究一个Python脚本来搜索蓝牙设备并使用RFCOMM连接它们.此设备具有密码/密码.我正在使用PyBlueZ,据我所知,这个库无法处理Passkey/Password连接(Python PyBluez连接到passkey protected device).
我能够发现设备并检索它们的名称和地址:
nearby_devices = bluetooth.discover_devices(duration=4,lookup_names=True,
flush_cache=True, lookup_class=False)
Run Code Online (Sandbox Code Playgroud)
但如果尝试使用以下方法连接到特定设备:
s = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
s.connect((addr,port))
Run Code Online (Sandbox Code Playgroud)
我收到一个错误'Device or resource busy (16)'.
我使用hcitool和bluetooth-agent尝试了一些bash命令,但我需要以编程方式进行连接.我能够使用此处描述的步骤连接到我的设备:如何在Linux上从命令行配对蓝牙设备.
我想询问是否有人使用Python连接到使用Passkey/Password的蓝牙设备.我正在考虑在Python中使用bash命令subprocess.call(),但我不确定这是不是一个好主意.
谢谢你的帮助.
我有一个使用 Rasbian OS 启动的 Raspberry pi B 型,并插入了一个蓝牙适配器。当从我的 PC 搜索时,我能够发现我的 pi,并且能够使用 Blueman GUI 进行配对。这是我用于配对过程的 python 程序:
from bluetooth import *
server_sock=BluetoothSocket(L2CAP)
server_sock.bind(("", 17))
with open(sys.path[0] + "/sdp_record.xml", "r") as fh:
service_record = fh.read()
self.bus = dbus.SystemBus()
self.manager = dbus.Interface(self.bus.get_object("org.bluez", "/"),"org.bluez.Manager")
adapter_path = self.manager.DefaultAdapter()
self.service = dbus.Interface(self.bus.get_object("org.bluez",adapter_path),
"org.bluez.Service")
service_handle = service.AddRecord(service_record)
print "Service record added"
server_sock.listen(1)
print("Waiting for connection on L2CAP")
try:
client_sock, client_info = server_sock.accept()
print("Accepted connection from ", client_info)
while True:
data = client_sock.recv(1024)
if len(data) == 0:
break …Run Code Online (Sandbox Code Playgroud) 我正在使用 python 的蓝牙模块import bluetooth,我相信它是 PyBluez 包。我能够很好地从 bluetooth.BluetoothSocket 类连接、发送和接收,但是当涉及到连接状态时,我的应用程序完全不知情。
我希望我的应用程序在设备断开连接时禁用某些功能,但似乎没有任何类型的 BluetoothSocket.is_connected() 方法。我希望它能在蓝牙状态发生变化时立即检测到它们。
通常有很多关于像这样简单的事情的主题,所以如果这是重复的,请道歉。我已经多次搜索这个网站寻找答案,但没有发现任何特定于 python 的内容。
在我当前的项目中,需要通过蓝牙将文件从 Windows 计算机发送到 android 设备,除了标准状态和配对的蓝牙连接之外,手机上没有任何内容。我查看了 pybluez,它似乎很简单,可以在客户端和服务器架构之间发送文件(实际上它在我的笔记本电脑和台式机之间发送的速度相当快),但我一生都找不到任何方法让 python 到建立连接后,将文件从计算机发送到 android;我的尝试一直是从设备上抓取蓝牙 mac 地址之类的东西
nearby_devices = bluetooth.discover_devices(
duration=8, lookup_names=True, flush_cache=True, lookup_class=False)
Run Code Online (Sandbox Code Playgroud)
然后尝试像这样发送文件
port = 1
for addr, name in nearby_devices:
bd_addr = addr
sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.connect((bd_addr, port))
sock.send("download-app")
sock.close()
Run Code Online (Sandbox Code Playgroud)
当然,使用 pybluez 文档给出的示例脚本,我可以在客户端和服务器之间无缝发送文件,但我仍然无法将文件发送到所选的 android 设备(即使我指定了它的地址并知道它在范围)
我正在进行一项设置,希望将 RaspberryPi-3 连接到另一台机器。大多数时候它是一台 Windows 机器。在 Pi 上,我想通过蓝牙将所有键盘敲击转发到另一台(Windows)机器。
因此我做了一些研究,几年前一个叫 Liam 的人写了一个 Python 脚本,显然它在 BlueZ 4 上运行得很好。所以我决定在 BlueZ 5 上尝试一下。到目前为止还没有运气。
好吧,我想,好吧,我们降级版本吧。所以我从源代码编译了它,版本 4.10。没有运气。树莓派甚至不知道它安装了蓝牙适配器,可能是一些驱动程序出了问题。
于是我开始接触 BlueZ 5,一开始很简单。但实际上我现在正在努力注册 sdp_Record.xml。以及稳定的连接。
首先是 BlueZ 4 实现的参考文件:
BlueZ4.py:
#!/usr/bin/python2.7
#
# PiTooth allows the Raspberry Pi to act as a Bluetooth keyboard, and relays
# keypresses from a USB keyboard to a Bluetooth client. Written by Liam Fraser
# for a Linux User & Developer tutorial.
#
import os # Used to call external commands
import sys # Used …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在运行 ubuntu 18 的 lenovo y50-70 笔记本电脑上运行一个简单的 python 蓝牙示例。但是在执行此操作时,我注意到 Pybluez 库无法找到任何设备,而使用 bluetoothctl 工具可以。
import bluetooth
print("performing inquiry...")
nearby_devices = bluetooth.discover_devices(duration=8,
lookup_names=True, flush_cache=True, lookup_class=False)
print("found %d devices" % len(nearby_devices))
for addr, name in nearby_devices:
try:
print(" %s - %s" % (addr, name))
except UnicodeEncodeError:
print(" %s - %s" % (addr, name.encode('utf-8', 'replace')))
Run Code Online (Sandbox Code Playgroud)
运行上面的代码会得到输出:found 0 devices。运行 bluetoothctl 时给出以下输出:
[NEW] Controller 40:B8:9A:44:E0:46 daan-Lenovo-Y50-70 [default]
Agent registered
[bluetooth]# scan on
Discovery started
[CHG] Controller 40:B8:9A:44:E0:46 Discovering: yes
[NEW] Device 30:AE:A4:37:A2:4A 30-AE-A4-37-A2-4A
[NEW] …Run Code Online (Sandbox Code Playgroud) 我在尝试着pip install pybluez,但收到此错误:
Collecting PyBluez\n Using cached PyBluez-0.23.tar.gz (97 kB)\n Preparing metadata (setup.py) ... error\n error: subprocess-exited-with-error\n\n \xc3\x97 python setup.py egg_info did not run successfully.\n \xe2\x94\x82 exit code: 1\n \xe2\x95\xb0\xe2\x94\x80> [1 lines of output]\n error in PyBluez setup command: use_2to3 is invalid.\n [end of output]\n\n note: This error originates from a subprocess, and is likely not a problem with pip.\nerror: metadata-generation-failed\n\n\xc3\x97 Encountered error while generating package metadata.\n\xe2\x95\xb0\xe2\x94\x80> See above for output.\n\nnote: This is an issue with the …Run Code Online (Sandbox Code Playgroud)