前言
1.为什么选bleak
参考这篇知乎:https://zhuanlan.zhihu.com/p/577687336
windows端使用python连接常规的BLE设备(蓝牙4.0),仅考虑bleak模块(排除pybluez、pybluez2、pygatt)。
2.本文主要参考
本文主要参考bleak的官方例程:https://github.com/hbldh/bleak/blob/develop/examples/enable_notifications.py
3.本文所用设备
应事先学习蓝牙连接的常规知识,并用例如LightBlue软件调试对应的蓝牙设备(获取MAC地址、特征值Characteristic UUID)。
本文选用CC2541模块,通过串口连接到电脑如所示。
正文
1.获取设备MAC地址
本文设备的MAC地址为:88:25:83:F3:86:C1
本文设备的特征值为:0000ffe1-0000-1000-8000-00805f9b34fb
(PS:这个特征值挺通用的,多数设备能直接用)
方法1:使用LightBlue连接可查看
方法2:使用如下程序,打印所有设备
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())
运行结果:
2.连接设备,并监听消息
发送端:电脑端通过串口调试助手(UartAssist)发送消息
接收端:电脑蓝牙连接设备,并监听打印(python程序)
完整程序如下:
# -*- coding: utf-8 -*-
import asyncio
from bleak import BleakClient, BleakScanner
from bleak.backends.characteristic import BleakGATTCharacteristic
#设备的Characteristic UUID
par_notification_characteristic="0000ffe1-0000-1000-8000-00805f9b34fb"
#设备的MAC地址
par_device_addr="88:25:83:F3:86:C1"
#监听回调函数,此处为打印消息
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
print("connecting to device...")
async with BleakClient(device) as client:
print("Connected")
await client.start_notify(par_notification_characteristic, notification_handler)
await asyncio.sleep(10.0) #程序监听的时间,此处为10秒
await client.stop_notify(par_notification_characteristic)
asyncio.run(main())
发送:在运行过程中(即打印出“Connected”之后),由串口调试助手发送消息"hello world"
运行结果:
3.连接设备,并发送消息
未完,有空后续再更新…
闲聊
在上位机开发、移动端开发中,BLE设备的教程都较少,入门门槛较高。
能连接蓝牙4.0的代码,一定能连接常规蓝牙。
能连接常规蓝牙的代码,不一定能连接蓝牙4.0。