【Bleak】六、特征及描述的发现

目录:

  • 1. 前言
  • 2. 准备一个心率带设备
  • 3. 源码解析
  • 4. 运行结果
  • 5. 写在最后

1. 前言

上一章节介绍了服务的发现,现在来看看服务里面的特征及描述是怎么获取的。

本文是基于源码例子的 service_explorer.py 来展开的。
【Bleak】六、特征及描述的发现_第1张图片

2. 准备一个心率带设备

为了更好得介绍,我们用NORDIC模拟了一个心率带设备,现在通过nRF Connect来看看它的服务及其下面的特征和描述。

3. 源码解析

import sys
import platform
import asyncio
import logging

from bleak import BleakClient
logger = logging.getLogger(__name__)
ADDRESS = (
    "E6:F8:E8:8D:D7:68"
    if platform.system() != "Darwin"
    else "B9EA5233-37EF-4DD6-87A8-2A875E821C46"
)

async def main(address):
    async with BleakClient(address) as client:
        logger.info(f"Connected: {client.is_connected}")

        for service in client.services:
            logger.info(f"[Service] {service}")
            for char in service.characteristics:
                if "read" in char.properties:
                    try:
                        value = bytes(await client.read_gatt_char(char.uuid))
                        logger.info(
                            f"\t[Characteristic] {char} ({','.join(char.properties)}), Value: {value}"
                        )
                    except Exception as e:
                        logger.error(
                            f"\t[Characteristic] {char} ({','.join(char.properties)}), Value: {e}"
                        )

                else:
                    value = None
                    logger.info(
                        f"\t[Characteristic] {char} ({','.join(char.properties)}), Value: {value}"
                    )

                for descriptor in char.descriptors:
                    try:
                        value = bytes(
                            await client.read_gatt_descriptor(descriptor.handle)
                        )
                        logger.info(f"\t\t[Descriptor] {descriptor}) | Value: {value}")
                    except Exception as e:
                        logger.error(f"\t\t[Descriptor] {descriptor}) | Value: {e}")

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

从以上代码可以得知:
调用该脚本时可输入参数,参数为设备地址
连接成功后,遍历设备的服务,打印出来
遍历服务里面的特征,打印出来
遍历特征里面的描述,打印出来
打印的格式也体现了服务、特征、描述的关系

4. 运行结果

这次我们将地址当做参数输入,地址从第2节得知是 D7:18:EE:D9:E0:7A
在程序目录执行命令:

python service_explorer.py D7:18:EE:D9:E0:7A

运行结果:

从运行结果可以看到,我们成功得获取到了心率带设备的服务及特征和描述:
服务的 UUID、句柄、名字
特征的 UUID、句柄、属性(读、写、通知、指示等)、值
描述的 UUID、句柄、名字、值

5. 写在最后

通过官方例子 service_explorer.py,我们了解到如何去获取到蓝牙设备服务里面的特征及描述相关信息。

通常情况下,我们需要将这些信息保存下来,蓝牙通信搞来搞去其实就是去操作他们的句柄,对他们的句柄进行收发数据。

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

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