杰瑞科技汇

Python lightblue如何正确安装?

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

Python lightblue如何正确安装?-图1
(图片来源网络,侵删)

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 为例):

Python lightblue如何正确安装?-图2
(图片来源网络,侵删)

你需要安装 bluez 蓝牙协议栈的开发库。

# 更新包列表
sudo apt-get update
# 安装 python-bluez 和它的开发头文件
sudo apt-get install python3-bluez bluez-dev

安装完这些系统库后,再重新运行 pip install lightblue

对于 macOS:

macOS 自带了 blueutil 命令行工具,但 lightblue 的安装可能会遇到权限问题,一个常见的解决方案是安装一个更现代的蓝牙管理工具,如 blueutil

Python lightblue如何正确安装?-图3
(图片来源网络,侵删)
# 使用 Homebrew 安装 blueutil
brew install blueutil

安装后,pip install lightblue 就能成功工作了。

对于 Windows:

在 Windows 上,情况稍微复杂一些。lightblue 在 Windows 上依赖于 PyWin32 库,因为它需要调用 Windows 的蓝牙 API。

  1. 安装 PyWin32: 你可以从非官方的 PyPI 源安装,或者从它的发布页面下载 .whl 文件。

    # 使用 pip 安装
    pip install pywin32

    如果上述命令不成功,请访问 PyWin32 的 GitHub 发布页面 下载与你 Python 版本和系统位数(32/64位)匹配的 .whl 文件,然后使用 pip 安装它。

  2. 确保蓝牙已启用: 确保你的 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("未发现任何蓝牙设备。")

如何运行:

  1. 确保你的电脑蓝牙已开启。
  2. 确保你想要搜索的蓝牙设备(如手机、耳机)也处于“可被发现”模式。
  3. 运行上面的 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。
  • 依赖底层系统:它的行为和功能高度依赖于你操作系统上的蓝牙实现(bluez on Linux, Windows API on Windows, Core Bluetooth on macOS),这可能导致跨平台行为不一致。

🔧 现代替代方案

对于新的项目,特别是需要更稳定、更现代支持的项目,可以考虑以下替代方案:

  1. pybluez:

    • lightblue 实际上是 pybluez 的一个分支或早期版本。pybluez 更专注于 Linux 上的 bluez 库,并且在 Python 3 方面做得更好。
    • 安装: pip install pybluez
    • 适用: 如果你主要在 Linux 上工作,pybluez 是一个更现代、更可靠的选择。
  2. bleak:

    • 这是一个专门为 低功耗蓝牙 设计的库,是目前最推荐的 BLE 库之一。
    • 它非常现代化,跨平台支持好(Windows, macOS, Linux),并且是异步的(asyncio),非常适合需要高效处理 I/O 的应用。
    • 注意: bleak 主要用于 BLE,而 lightblue 主要用于经典的蓝牙 RFCOMM,如果你的设备是 BLE 设备(如智能手环、心率监测器),bleak 是不二之选。
    • 安装: pip install bleak
  3. 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
分享:
扫描分享到社交APP
上一篇
下一篇