BleakClient建议使用“async with”,但如何获取超出代码块的句柄?

0 投票
1 回答
66 浏览
提问于 2025-04-14 15:43

我写了一个使用bleak蓝牙低能耗客户端的Python脚本,这个脚本可以在命令行中运行。现在我想把这个脚本拆分成REST接口。

为此,我想把async with BleakClient(d, timeout=10) as client:这行代码换成别的方式,这样我就可以把client设为全局变量,这样我就能在其他REST接口中使用它。换句话说,我希望client在连接设备的调用之后还能继续存在。有没有什么好主意?

我试过用client = await BleakClient(d, timeout=10),但是这行代码报错了:object BleakClient can't be used in 'await' expression

编辑

我附上了整个(简化版的)Python脚本。调用ConnectAndReadChar()是有效的,但调用ConnectUUT()就不行了。在'client = await BleakClient(d, timeout=10)'这一行出现了异常,类型是

import asyncio
import traceback
from bleak import BleakScanner, BleakClient
import sys
import time

global client
        
async def ConnectAndReadChar(MAC_ID):
    d = await BleakScanner.find_device_by_address(MAC_ID, timeout=20)            
    time.sleep(0.5)
    while True:
        try:
            if d.address == MAC_ID:
                async with BleakClient(d, timeout=10) as client:
                    time.sleep(0.5)
                    res = await client.pair(protection_level=None)
                    print(res)

                    x = client.is_connected
                    print("Connected: {0}".format(x))

                    svc = client.services.get_service("Service ID")

                    thisCharacteristic = svc.get_characteristic("Char ID")
                    value = bytes(await client.read_gatt_char(thisCharacteristic))
                    print("\tValue: {0} ".format(value))

                    await client.disconnect()
                    await client.unpair()
            return
        except:
            e = sys.exc_info()[0]
            print(e)


async def ConnectUUT(MAC_ID):
    global client
    d = await BleakScanner.find_device_by_address(MAC_ID, timeout=20)            
    while True:
        try:
            if d.address == MAC_ID:
                # async with BleakClient(d, timeout=10) as client:
                client = await BleakClient(d, timeout=10)
                if client is not None:
                    time.sleep(0.5)
                    res = await client.pair(protection_level=None)
                    print(res)

                    x = client.is_connected
                    print("Connected: {0}".format(x))
            return
        except:
            e = sys.exc_info()[0]
            print(e)

async def ReadFrames():
    global client

    try:
        svc = client.services.get_service("Service ID")
        thisCharacteristic = svc.get_characteristic("Char ID")
        return
    except:
        e = sys.exc_info()[0]
        print(e)

async def DisconnectUUT():
    global client

    try:
        await client.disconnect()
        await client.unpair()
    except:
        e = sys.exc_info()[0]
        print(e)
    return

async def main():
    await ConnectAndReadChar("MAC ID goes here")

    await ConnectUUT("MAC ID goes here")
    await ReadFrames()
    await DisconnectUUT()
        
if __name__ == "__main__":
    asyncio.run(main())

1 个回答

1

如果你把BleakClient当作异步上下文管理器来使用,它会自动帮你连接设备。你也可以选择手动连接,方法如下:

client = BleakClient(d, timeout=10)
await client.connect()

撰写回答