上一章节介绍了服务的发现,现在来看看服务里面的特征及描述是怎么获取的。
本文是基于源码例子的 service_explorer.py 来展开的。
为了更好得介绍,我们用NORDIC模拟了一个心率带设备,现在通过nRF Connect来看看它的服务及其下面的特征和描述。
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))
从以上代码可以得知:
调用该脚本时可输入参数,参数为设备地址
连接成功后,遍历设备的服务,打印出来
遍历服务里面的特征,打印出来
遍历特征里面的描述,打印出来
打印的格式也体现了服务、特征、描述的关系
这次我们将地址当做参数输入,地址从第2节得知是 D7:18:EE:D9:E0:7A
在程序目录执行命令:
python service_explorer.py D7:18:EE:D9:E0:7A
运行结果:
从运行结果可以看到,我们成功得获取到了心率带设备的服务及特征和描述:
服务的 UUID、句柄、名字
特征的 UUID、句柄、属性(读、写、通知、指示等)、值
描述的 UUID、句柄、名字、值
通过官方例子 service_explorer.py,我们了解到如何去获取到蓝牙设备服务里面的特征及描述相关信息。
通常情况下,我们需要将这些信息保存下来,蓝牙通信搞来搞去其实就是去操作他们的句柄,对他们的句柄进行收发数据。
看完觉得有收获点个赞吧 ❤️ 或者关注Bleak专栏查看更多Bleak相关使用⏩