目前在嵌入式设备端,实现了不少ble的功能。比如音频传输,图片传输。一般要方便演示,需要开发个对应的手机app。但是我又是很偷懒的人。想着,python这个工具这么强大,在PC端可以用python几行代码就实现掉吧?
说干就干!
根据同事的推荐,用了python的bleak蓝牙库。
我是在windows10上实现的,先安装:
pip install bleak
先打开蓝牙。
然后写了个简单的扫描代码:
import asyncio
from bleak import BleakScanner
async def main():
devices = await BleakScanner.discover()
for d in devices: #d为类,其属性有:d.name为设备名称,d.address为设备地址
print(d)
asyncio.run(main())
运行结果如下:
# -*- coding: utf-8 -*-
import asyncio
from bleak import BleakClient, BleakScanner
from bleak.backends.characteristic import BleakGATTCharacteristic
#设备的Characteristic UUID
par_notification_characteristic="00002A4F-0000-1000-8000-00805F9B34FB"
#设备的Characteristic UUID(具备写属性Write)
par_write_characteristic="6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#设备的MAC地址
#par_device_addr="AB:89:67:A0:34:26"
par_device_addr="AB:8B:67:45:23:09"
#准备发送的消息,为“hi world\n”的HEX形式(包括回车符0x0A 0x0D)
send_str=bytearray([0x68,0x69,0x20,0x77,0x6F,0x72,0x6C,0x64,0x0A,0x0D])
#监听回调函数,此处为打印消息
def notification_handler(characteristic: BleakGATTCharacteristic, data: bytearray):
print("rev data:",data)
async def main():
print("starting scan...")
#基于MAC地址查找设备
device = await BleakScanner.find_device_by_address(
par_device_addr, cb=dict(use_bdaddr=False) #use_bdaddr判断是否是MOC系统
)
if device is None:
print("could not find device with address '%s'", par_device_addr)
return``
#事件定义
disconnected_event = asyncio.Event()
#断开连接事件回调
def disconnected_callback(client):
print("Disconnected callback called!")
disconnected_event.set()
print("connecting to device...")
async with BleakClient(device,disconnected_callback=disconnected_callback) as client:
print("Connected")
await client.start_notify(par_notification_characteristic, notification_handler)
while True:
#await client.write_gatt_char(par_write_characteristic, send_str)
await asyncio.sleep(0.1) #每休眠1秒发送一次
asyncio.run(main())
音频是通过notify的方式传输的。按照这个代码的预期,遥控器发送音频的数据,会被动的接收到(看监听回调函数)。
执行后,发现连接上遥控器后,过了一会,就断开了连接。但是用PC系统的蓝牙扫描工具,扫描和连接是正常的。
这样看,break这个库,使用上是有限制的。或者它有什么功能要开启,比如支持加密配对和绑定。但是我还没有找到。
我猜测和配对与绑定有关系,因此我关闭了遥控器的绑定功能(宏配置了关闭了绑定)。在遥控器的代码端,发现连接成功后,会调用:ble_gap_security_initiate 这个接口,主动要求主机发起配对请求。我也把这个代码屏蔽掉。
然后再重新执行python代码,就可以正常连接,并与指定的特征接收对方的数据了。
手机端每次连接都会弹下面这个配对提示:
其实,也是和对方调用了 ble_gap_security_initiate 有关系。但是在PC端连接,没有这个提示,我认为和主机的处理行为有关。因为,这个配对使用的加密机制是最简单的just work,密码就是默认的“0000”。我猜测PC主机就内部默认处理掉了,不给提示了。
不管怎么说,至少后面需要快速验证下某些ble传输的数据效果,某些idea的验证,用python就会很便捷了。
标签:par,characteristic,print,嵌入式,PC,device,BLE,asyncio From: https://www.cnblogs.com/o-O-oO/p/18622034原创 阎阿福 阿福的技术小窝