【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A 蓝牙BLE通信
[复制链接]
本帖最后由 六尘不改 于 2023-11-22 19:50 编辑
本篇文章使用Bleak库驱动开发板蓝牙BLE,实现开发板BLE主机和蓝牙板BLE从机的双向通信。
一.硬件部分
确认蓝牙主从机型号,确认是否可以实现BLE通信。
1.蓝牙主机
通过查找规格书,得知开发板使用的是搭载瑞昱RTL8723DS的BT4.2蓝牙模组。经过Linux桌面简单的连接测试,确定其是支持BLE协议的。
2.蓝牙从机
使用一款单模BLE5.0蓝牙模组,支持主从一体。
同时我为项目设计一块蓝牙报警板,蓝牙模块与STM32单片机通过UART连接,单片机接收蓝牙数据,控制灯与蜂鸣器状态。
二.蓝牙库选择与安装
项目需使用python控制BLE设备,能较好支持BLE的库很少,本项目选择了Bleak库,此库是驱动BLE比较推荐的:
Bleak 是蓝牙低功耗平台 Agnostic Klient 的缩写。Bleak拥有从 GATT 服务器读取、写入和获取通知,以及发现 BLE 设备的功能。
安装:
sudo apt-get python3-bleak
API和实例可以参考
三.代码编写
3.1 MAC地址确认
搜索并打印可连接的蓝牙设备:
import asyncio
from bleak import BleakScanner
async def main():
devices = await BleakScanner.discover()
for d in devices:
print(d)
asyncio.run(main())
搜索结果如下:
可知BLE从机MAC地址:E2:AB:AE:CB:F0:3C。
3.2 UUID确认
使用LightBlue连接查看
根据蓝牙联盟定义的Bluetooth_Base_UUID为:00000000-0000-1000-8000-00805f9b34fb,将16位属性UUID带入计算即可得到对应的功能UUID。本文使用0xFFF1进行数据监听,0xFFF2向从机发送数据。
3.3 测试代码
实现打印蓝牙接收信息,并每秒按协议向蓝牙从机发送报警状态
ble.py
import asyncio
from bleak import BleakClient, BleakScanner
from bleak.backends.characteristic import BleakGATTCharacteristic
# 设备的Characteristic UUID
par_notification_characteristic = "0000fff1-0000-1000-8000-00805f9b34fb"
# 设备的Characteristic UUID(具备写属性Write)
par_write_characteristic = "0000fff2-0000-1000-8000-00805f9b34fb"
# 设备的MAC地址
par_device_addr = "E2:AB:AE:CB:F0:3C"
# 监听回调函数,此处为打印消息
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, bytearray([0x12, 0x34, 0x00]))
await asyncio.sleep(1.0) # 每休眠1秒发送一次
await client.write_gatt_char(par_write_characteristic, bytearray([0x12, 0x34, 0x01]))
await asyncio.sleep(1.0) # 每休眠1秒发送一次
await client.write_gatt_char(par_write_characteristic, bytearray([0x12, 0x34, 0x02]))
await asyncio.sleep(1.0) # 每休眠1秒发送一次
await client.write_gatt_char(par_write_characteristic, bytearray([0x12, 0x34, 0x03]))
await asyncio.sleep(1.0) # 每休眠1秒发送一次
asyncio.run(main())
四.运行及视频演示
运行代码。注意:不可命名为bleak.py
sudo python3 ble.py
蓝牙报警板收到命令后会将状态发回蓝牙主机
蓝灯为蓝牙连接指示灯,红灯和绿灯二进制显示上位机发送的状态。
蓝牙演示
|