【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))
该例子里可以看到:
- 调用该脚本可以输入参数,参数为蓝牙设备地址,如果未填写参数,则用默认的 ADDRESS
- 主函数中先扫描指定的蓝牙设备,如果找到了对它连接并发现其服务
- 将发现的所有服务显示出来
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. 写在最后
从运行结果里面可以看到,打印出来的结果里面有:
- 服务的UUID
- Handle 的值
- 服务名字
后续项目实战的时候,服务的操作都是通过Handle值来完成的,通常Handle需要记录下来。