BleakClient建议使用“async with”,但如何获取超出代码块的句柄?
我写了一个使用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()