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

目录:

  • 1. 前言
  • 2. 手机模拟BLE设备
  • 3. 源码解析
  • 4. 运行结果
  • 5. 写在最后

1. 前言

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

本文通过官方例子 connect_by_bledevice.py 来给大家介绍。
【Bleak】五、连接及发现服务_第1张图片

2. 手机模拟BLE设备

首先我们在手机上模拟一个名为"dabai"的心率带设备,然后运行例子看看能不能扫描到,方法请看nRF Connect。
在这里插入图片描述
配置 GATT 服务为心率服务:
【Bleak】五、连接及发现服务_第2张图片

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()
)

运行结果:
【Bleak】五、连接及发现服务_第3张图片

5. 写在最后

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

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

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

看完觉得有收获点个赞吧 ❤️ 或者关注Bleak专栏查看更多Bleak相关使用⏩

你可能感兴趣的:(Bleak,python,BLE,低功耗蓝牙,Bleak)