【嵌入式开发】探讨下PC端的BLE开发

news/2025/3/12 23:35:44/文章来源:https://www.cnblogs.com/o-O-oO/p/18622034

目前在嵌入式设备端,实现了不少ble的功能。比如音频传输,图片传输。一般要方便演示,需要开发个对应的手机app。但是我又是很偷懒的人。想着,python这个工具这么强大,在PC端可以用python几行代码就实现掉吧?
说干就干!
根据同事的推荐,用了python的bleak蓝牙库。
我是在windows10上实现的,先安装:

pip install bleak


先打开蓝牙。
然后写了个简单的扫描代码:

import asyncio
from bleak import BleakScannerasync 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就会很便捷了。

原创 阎阿福 阿福的技术小窝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856759.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter 修改Sampler result 结果信息

首先说一下,jmeter的Sampler result是什么? Jmeter 的Samplers result 是jmeter在向服务器发送请求后,接收到服务器响应的基本信息的展示,如 sample 的开始请求时间、发送的内容大小、基于协议的响应状态码和响应消息等信息。 什么是基于协议的响应状态码和响应消息。比如h…

Shell Script

Shell Script 赋值操作 foo=bar echo $foo注意: 不要使用空格分开shell 将会把foo当作一个程序 转义 Bash通过使用和""来定义字符串 ""会将字符串中的变量转义 echo "String is $foo"会将字符串中的变量原样输出 echo String is $foo函数 函数内…

聊一聊 C#前台线程 如何阻塞程序退出

一:背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题:后台线程的内部是如何运转的 ? ,犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug,最后发现是有一个 Backgrond=false 的线程导致的。恰巧在我分析的350+dum…

聊一聊 C#后台线程 如何阻塞程序退出

一:背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题:后台线程的内部是如何运转的 ? ,犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug,最后发现是有一个 Backgrond=false 的线程导致的。恰巧在我分析的350+dum…

offset explorer如何安装?附获取方式

前言 大家好,我是小徐啊。我们在Java开发的时候,有时候需要进行大数据的开发,或者需要使用消息队列,这个时候,就需要用到kafka这个组件了。而对于我们平常运维来说,最好有一个可视化的连接kafka的工具。今天小徐就来介绍一款连接Kafka的工具,是offset explorer,介绍下w…

NUMA的取舍与优化设置

NUMA的取舍与优化设置在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能。 安装numactl: #yum install numactl -y #numastat 等同于 cat /sys/devices/system/node/node0/numa…

2024-2025-1(20241321)《计算机基础与程序设计》第十三周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十三周作业)这个作业的目标 <深刻学习C语言,反思一周学习,温故知新>作业正文 ... 本博客链接https://www.…

解决 PbootCMS 附件上传报错

根据你提供的信息,PbootCMS 附件上传时报错: 上传失败:UNKNOW: Code: 8192; Desc: stripos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior; File: /www/wwwroot/aaa.xxxx.com/core/fu…

如何修改网站的错误,网站错误排查与修复

网站错误可能由多种原因引起,以下是一些常见的排查和修复步骤:查看错误日志:在服务器上查看错误日志文件,通常位于 logs 文件夹中。 分析日志中的错误信息,确定问题原因。浏览器开发者工具:使用浏览器的开发者工具(F12),查看控制台中的错误信息。 检查网络请求,查看是…

如何在PbootCMS中增加对WebP和MOV文件类型的上传支持?

在PbootCMS中,默认情况下支持的上传文件类型可能不包括WebP和MOV。为了允许上传这些文件类型,你需要修改PbootCMS的配置文件和Ueditor编辑器的配置文件。以下是详细的步骤和说明: 1. 修改PbootCMS的配置文件 PbootCMS的上传配置位于 /config/config.php 文件中。你需要在这个…

易优CMS中的adv标签如何使用?

在易优CMS中,adv标签主要用于获取广告列表内容。这个标签非常灵活,可以通过设置不同的属性来控制广告的展示方式。基本的用法如下:html{eyou:adv pid=1 loop=3}<a href="{$field.links}"><img alt="{$field.title}" src="{$field.litpic}…

如何在易优CMS中输出单条广告的数据?

在易优CMS中,如果你希望输出单条广告的数据,可以使用ad标签。以下是一个具体的示例:{eyou:ad aid=37}<a href="{$field.links}" {$field.target}><img alt="{$field.title}" src="{$field.litpic}" /></a> {/eyou:ad}在这个…