lightblue 是一个非常经典的 Python 库,用于在蓝牙设备上进行编程,它为 Python 提供了跨平台的蓝牙功能,可以让你轻松地搜索附近的蓝牙设备、作为客户端(连接其他设备)或服务器(等待其他设备连接)进行数据交换。

lightblue 的核心特点
- 跨平台:支持 Windows、macOS 和 Linux。
- 简单易用:API 设计简洁,对于基本的蓝牙操作非常直观。
- 功能全面:支持蓝牙的多种模式,包括:
- 设备发现:搜索周围的蓝牙设备。
- 客户端模式:主动连接蓝牙服务器。
- 服务器模式:监听来自其他蓝牙设备的连接。
- RFCOMM 串口通信:这是最常用的蓝牙通信方式,用于传输数据。
安装步骤
1 使用 pip 安装 (推荐)
lightblue 可以通过 Python 的包管理器 pip 直接安装,打开你的终端或命令行工具,执行以下命令:
pip install lightblue
注意:在 macOS 上,你可能需要使用 pip3 来确保为 Python 3 安装:
pip3 install lightblue
2 可能遇到的问题:依赖项安装
lightblue 是一个 Python 封装,它依赖于底层的蓝牙系统库,在安装 lightblue 时,pip 通常会自动尝试安装这些依赖项,如果自动安装失败,你可能需要手动安装它们。
对于 Linux (以 Ubuntu/Debian 为例):

你需要安装 bluez 蓝牙协议栈的开发库。
# 更新包列表 sudo apt-get update # 安装 python-bluez 和它的开发头文件 sudo apt-get install python3-bluez bluez-dev
安装完这些系统库后,再重新运行 pip install lightblue。
对于 macOS:
macOS 自带了 blueutil 命令行工具,但 lightblue 的安装可能会遇到权限问题,一个常见的解决方案是安装一个更现代的蓝牙管理工具,如 blueutil。

# 使用 Homebrew 安装 blueutil brew install blueutil
安装后,pip install lightblue 就能成功工作了。
对于 Windows:
在 Windows 上,情况稍微复杂一些。lightblue 在 Windows 上依赖于 PyWin32 库,因为它需要调用 Windows 的蓝牙 API。
-
安装 PyWin32: 你可以从非官方的 PyPI 源安装,或者从它的发布页面下载
.whl文件。# 使用 pip 安装 pip install pywin32
如果上述命令不成功,请访问 PyWin32 的 GitHub 发布页面 下载与你 Python 版本和系统位数(32/64位)匹配的
.whl文件,然后使用pip安装它。 -
确保蓝牙已启用: 确保你的 Windows 系统蓝牙功能已开启,并且可以正常工作。
基本使用示例
安装完成后,你就可以在 Python 代码中导入并使用 lightblue 了。
示例 1:搜索附近的蓝牙设备
这个示例会扫描并打印出周围所有可用的蓝牙设备。
import lightblue
print("正在搜索蓝牙设备...")
# 使用 lightblue.finddevices() 搜索设备
# 它返回一个列表,每个元素是一个元组 (地址, 名称, 类别)
devices = lightblue.finddevices()
if devices:
print("发现以下设备:")
for addr, name, device_class in devices:
print(f" - 名称: {name}, 地址: {addr}")
else:
print("未发现任何蓝牙设备。")
如何运行:
- 确保你的电脑蓝牙已开启。
- 确保你想要搜索的蓝牙设备(如手机、耳机)也处于“可被发现”模式。
- 运行上面的 Python 脚本。
示例 2:作为客户端连接一个蓝牙设备
这个示例会连接到一个特定的蓝牙设备,并向其发送一条消息。
import lightblue
# 目标设备的地址 (从上面的搜索示例中获得)
# !! 请替换成你自己的设备地址 !!
target_address = "00:11:22:33:44:55"
# 目标设备开放的 RFCOMM 通道 (通常需要提前知道,或者通过服务发现)
# !! 请替换成正确的通道号 !!
target_channel = 1
try:
print(f"正在连接到设备 {target_address} 的通道 {target_channel}...")
# lightblue.socket() 创建一个 RFCOMM 套接字
sock = lightblue.socket(lightblue.RFCOMM)
# 连接目标设备
sock.connect((target_address, target_channel))
print("连接成功!")
# 发送数据 (注意:需要是字节串)
message = "Hello from Python!".encode('utf-8')
sock.send(message)
print(f"已发送: {message.decode('utf-8')}")
# (可选) 接收数据
# data = sock.recv(1024)
# print(f"已接收: {data.decode('utf-8')}")
except ConnectionRefusedError:
print("连接被拒绝!请检查设备地址和通道号是否正确,且设备是否在等待连接。")
except OSError as e:
print(f"发生错误: {e}")
finally:
# 确保关闭套接字
if 'sock' in locals():
sock.close()
print("连接已关闭。")
示例 3:作为服务器等待连接
这个示例会让你的电脑成为一个蓝牙服务器,监听特定通道的连接请求,并在连接后接收数据。
import lightblue
# 服务器监听的通道号 (1-30 之间)
server_channel = 10
try:
# 创建一个 RFCOMM 套接字
sock = lightblue.socket(lightblue.RFCOMM)
# 绑定到所有可用的本地地址和指定的通道
sock.bind(("", server_channel))
# 开始监听,允许1个排队连接
sock.listen(1)
# 设置设备为可被发现模式 (可选,但推荐)
# 这会让其他设备更容易找到你
lightblue.setdiscoverable(True, "Python Server")
print(f"服务器已启动,正在监听通道 {server_channel}...")
print("请确保设备处于可被发现模式。")
# 等待客户端连接
# accept() 会阻塞程序,直到有客户端连接
client_sock, client_info = sock.accept()
print(f"已接受来自 {client_info[0]} 的连接!")
# 接收客户端发送的数据
while True:
data = client_sock.recv(1024)
if not data:
break
print(f"收到消息: {data.decode('utf-8')}")
except OSError as e:
print(f"发生错误: {e}")
finally:
# 关闭套接字
if 'sock' in locals():
sock.close()
if 'client_sock' in locals():
client_sock.close()
print("服务器已关闭。")
重要注意事项和替代方案
⚠️ lightblue 的局限性
- 不再积极维护:
lightblue项目已经有一段时间没有大的更新了。 - Python 3 兼容性:虽然
lightblue在 Python 3 上通常可以工作,但可能会遇到一些小问题或 bug。 - 依赖底层系统:它的行为和功能高度依赖于你操作系统上的蓝牙实现(
bluezon Linux, Windows API on Windows, Core Bluetooth on macOS),这可能导致跨平台行为不一致。
🔧 现代替代方案
对于新的项目,特别是需要更稳定、更现代支持的项目,可以考虑以下替代方案:
-
pybluez:lightblue实际上是pybluez的一个分支或早期版本。pybluez更专注于 Linux 上的bluez库,并且在 Python 3 方面做得更好。- 安装:
pip install pybluez - 适用: 如果你主要在 Linux 上工作,
pybluez是一个更现代、更可靠的选择。
-
bleak:- 这是一个专门为 低功耗蓝牙 设计的库,是目前最推荐的 BLE 库之一。
- 它非常现代化,跨平台支持好(Windows, macOS, Linux),并且是异步的(
asyncio),非常适合需要高效处理 I/O 的应用。 - 注意:
bleak主要用于 BLE,而lightblue主要用于经典的蓝牙 RFCOMM,如果你的设备是 BLE 设备(如智能手环、心率监测器),bleak是不二之选。 - 安装:
pip install bleak
-
bluepy:- 另一个专注于低功耗蓝牙的库,在 Linux 上非常流行,性能优秀。
- 它使用 C 语言编写,性能很高,但主要面向 Linux。
| 特性 | lightblue |
pybluez |
bleak |
|---|---|---|---|
| 主要用途 | 经典蓝牙 RFCOMM | 经典蓝牙 RFCOMM | 低功耗蓝牙 |
| Python 版本 | Python 2/3 (兼容性一般) | Python 2/3 (更好支持) | Python 3 (推荐) |
| 平台支持 | Windows, macOS, Linux | Linux (最佳), macOS, Windows | Windows, macOS, Linux |
| 维护状态 | 停止维护 | 较少更新 | 积极维护 |
| 异步支持 | 无 | 无 | 有 (asyncio) |
| 安装 | pip install lightblue |
pip install pybluez |
pip install bleak |
- 如果你只是想快速做一个简单的经典蓝牙通信原型,并且不介意一些潜在的兼容性问题,
pip install lightblue仍然是一个可行的选择。 - 如果你进行的是更严肃的开发,或者主要在 Linux 环境下工作,建议使用
pybluez。 - 如果你正在开发与 智能设备、IoT 相关的应用,几乎可以肯定是 BLE 设备,那么请直接选择
bleak。
