Python蓝牙开发(一)——跨平台蓝牙库bleak

前期开发中尝试在树莓派、windows平台使用pybluez库遇到一些问题(广播无法被检索等)。另外,由于该库作者已经没有继续维护,所以换用bleak库进行尝试。树莓派实现NI蓝牙OOB

1、关于bleak库

1.1 简介

Bleak是一款GATT客户端软件,能够连接到BLE GATT服务器设备。其旨在提供一个异步、跨平台的Python API,用于连接和与传感器等进行通信。

bleak项目github地址

特性:

  • 支持Windows 10,version 16299或更高版本;
  • 支持Linux,bluez > = 5.43,可以通过,$bluetoothd -v来查看相应版本;
  • OS X/macOS支持Core Bluetooth API,至少OS X 10.11版本以上;
  • Android后端兼容python-for-android

Bleak支持读、写、以及GATT服务的通知,以及相关函数用于发现BLE设备。

1.2 安装bleak库

  • windows平台,直接可以使用pip install bleak安装即可。

  • 在树莓派上进行测试,可以正常安装。sudo pip3 install bleak

    树莓派硬件平台:树莓派 3B

    系统:ubuntu-22.04.4-preinstalled-desktop-arm64

1.3 bleak库使用

BleakScanner类,用于搜索周边蓝牙设备。

python 复制代码
import asyncio
from bleak import BleakScanner

async def main():
    devices = await BleakScanner.discover()
    for d in devices:
        print(d)

asyncio.run(main())

BleakClient类,用于连接蓝牙设备,读、写、接收GATT服务的通知。

python 复制代码
import asyncio
from bleak import BleakClient

address = "24:71:89:cc:09:05"
MODEL_NBR_UUID = "2A24"

async def main(address):
    async with BleakClient(address) as client:
        model_number = await client.read_gatt_char(MODEL_NBR_UUID)
        print("Model Number: {0}".format("".join(map(chr, model_number))))

asyncio.run(main(address))

1.4 搜索NUS并连接

NUS(Nordic Semiconductor(nRF)UART Service),Nordic公司的蓝牙串口服务,相应示例代码如下:

c 复制代码
UART_SERVICE_UUID = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
UART_RX_CHAR_UUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
UART_TX_CHAR_UUID = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"

def match_nus_uuid(device: BLEDevice, adv: AdvertisementData):
	if UART_SERVICE_UUID.lower() in adv.service_uuids:
		return True
	return False

# 搜索设备, 查看是否匹配NUS UUID,找到后可尝试建立连接,进行读写。
device = await BleakScanner.find_device_by_filter(match_nus_uuid)

# 创建BleakClient客户端,连接后进行串口操作
async with BleakClient(device, disconnected_callback=handle_disconnect) as client:
	await client.start_notify(UART_TX_CHAR_UUID, handle_rx)

  print("Connected, start typing and press ENTER...")

	loop = asyncio.get_running_loop()
   nus = client.services.get_service(UART_SERVICE_UUID)
   # 接收蓝牙串口信息
   rx_char = nus.get_characteristic(UART_RX_CHAR_UUID)

总结

bleak库能够跨平台使用,Linux(树莓派)、Windows平台均可以正常使用。当用于扫描蓝牙服务、作为Client连接操作较为方便,基于Python,开发相对也比较简单。但是其缺陷在于不支持作为GATT Server,不支持一些广播服务,对于一些应用场景,如实现蓝牙串口服务来说无法支持,导致应用场景限制,但整体还算一个不错的跨平台的项目。

相关推荐
一点 内容15 小时前
智汇前沿,印创未来:2026中国五大专业印刷展会全景洞察与战略导航
大数据·人工智能·物联网
errorPage15 小时前
Python空值判断避坑指南 + 图片定点缩放逻辑优化实战
python
郝学胜-神的一滴15 小时前
Python方法类型详解:类方法、静态方法与实例方法
开发语言·python·程序人生
百***243716 小时前
Grok-4.1 API进阶实战:Python项目集成、性能优化与异常处理全攻略
python·spring·性能优化
Trust yourself24316 小时前
魔塔社区下载的大模型如何通过ollama部署到本地
python
码农胖虎-java16 小时前
【java并发编程】从源码角度彻底理解 ForkJoinPool.commonPool
java·开发语言·python
毕设源码-朱学姐16 小时前
【开题答辩全过程】以 基于Python淘宝电脑销售数据可视化系为例,包含答辩的问题和答案
python·信息可视化·电脑
三木彤16 小时前
Scikit-learn 零基础,从安装到实战机器学习模型
python
Ulyanov16 小时前
高级可视化技术——让PyVista数据展示更专业
开发语言·前端·人工智能·python·tkinter·gui开发
Sagittarius_A*16 小时前
图像滤波:手撕五大经典滤波(均值 / 高斯 / 中值 / 双边 / 导向)【计算机视觉】
图像处理·python·opencv·算法·计算机视觉·均值算法