【Bleak】五、连接及发现服务

1. 前言

通过之前章节,我们学会了通过Bleak来扫描周边的低功耗蓝牙设备,现在我们来看看如何通过它来连接以及发现服务。

本文通过官方例子 connect_by_bledevice.py 来给大家介绍。

2. 手机模拟BLE设备

首先我们在手机上模拟一个名为"dabai"的心率带设备,然后运行例子看看能不能扫描到,方法请看。 配置 GATT 服务为心率服务:

3. 源码解析

"""
Connect by BLEDevice
"""
import asyncio
import platform
import sys

from bleak import BleakClient, BleakScanner
from bleak.exc import BleakError

ADDRESS = (
    "E6:F8:E8:8D:D7:68"
    if platform.system() != "Darwin"
    else "B9EA5233-37EF-4DD6-87A8-2A875E821C46"
)

async def main(ble_address: str):
    device = await BleakScanner.find_device_by_address(ble_address, timeout=20.0)
    if not device:
        raise BleakError(f"A device with address {
            
     ble_address} could not be found.")
    async with BleakClient(device) as client:
        svcs = await client.get_services()
        print("Services:")
        for service in svcs:
            print(service)

if __name__ == "__main__":
    asyncio.run(main(sys.argv[1] if len(sys.argv) == 2 else ADDRESS))

该例子里可以看到:

  1. 调用该脚本可以输入参数,参数为蓝牙设备地址,如果未填写参数,则用默认的 ADDRESS
  2. 主函数中先扫描指定的蓝牙设备,如果找到了对它连接并发现其服务
  3. 将发现的所有服务显示出来

4. 运行结果

因为通过 nRF Connect模拟的服务端设备的地址的随机的(地址会变),所以我们最好是通过名字去扫描好一些。 修改扫描部分的代码:

指定事先模拟的心率设备名字 “dabai”。

DEVICE_NAME = "dabai"

然后将

device = await BleakScanner.find_device_by_address(ble_address, timeout=20.0)

修改为

device = await BleakScanner.find_device_by_filter(
    lambda d, ad: d.name and d.name.lower() == DEVICE_NAME.lower()
)

运行结果:

5. 写在最后

从运行结果里面可以看到,打印出来的结果里面有:

  1. 服务的UUID
  2. Handle 的值
  3. 服务名字

后续项目实战的时候,服务的操作都是通过Handle值来完成的,通常Handle需要记录下来。

经验分享 程序员 微信小程序 职场和发展