ESP32-idf学习(二)esp32C3作服务端与电脑蓝牙数据交互
一、当前需求
目前是想利用蓝牙来传输命令,或者一些数据,包括电脑、手机与板子的数据传输,板子与板子之间的数据传输。构思是一个板子是数据接收终端,在电脑或手机下发指令后,再给其他板子相应指令,也需要接收其他板子的状态信息。
之前做过类似的,但主机和PC端是通过http或者串口进行数据交互。都用蓝牙的话以我目前查到的信息来说是可以实现的,先试试看,需要分时复用蓝牙协议栈,分离服务端与客户端任务。
二、例程
1、选择例程
官方的例程有很多个,说实话我之前对蓝牙没什么了解,也没怎么应用过。
然后我问了一下AI,大概了解了一下
我现在应用需求是先透传看看,因为是电脑主动去连接esp32C3,所以选择服务端的例程
其他的我也百度了一下,gatt是低功耗蓝牙,spp是经典蓝牙的协议,还有其他例程是ios的、安卓、鼠标键盘的等等,这些用到的时候再了解吧,有点太多了
打开例程,很直观的先初始化
然后开中断
2、电脑连接
例程烧录之后,我用电脑连接发现连接失败,但是我手机nRF Connect是可以连接并且能收到数据的。
串口打印这里event10,然后就没有信息了
查看程序
是没有处理这个安全认证的
所以连接不上的原因应该是电脑发起了安全认证,但是我们的设备没有回复
我只能再次百度,找到了这个API
后来又来来回回改了安全参数:
最后是可以连接了,但是会在已配对和已连接2个状态一直跳。我再查了一下,是因为ESP32C3只支持ble,不能跟电脑直接连接(这里我是百度得出来的结论,有待查证)
3、用pc端工具连接
找了一个调试工具,附上连接,感谢大佬
PC端BLE调试工具——BLEDebug实现蓝牙/串口透传调试_pc蓝牙调试工具-CSDN博客
所以我在电脑下载个蓝牙助手先试试
这里跟手机nRF Connect的界面差不多,我给41这里发了cmd1,程序也收到了,但程序这里的值是2,还不太懂蓝牙,这里要研究一下uuid和handle,我只知道这里是可读可写
三、修改例程
1、led初始化
跟上一章一样
2、回调函数处修改
接收数据在这个gatts_profile_event_handler回调函数下
现在写入指令实现开关led灯,是执行的写入指令2,所以收到的event是ESP_GATTS_WRITE_EVT
然后在这里判断指令,我复制了一下上边caseSPP_IDX_SPP_COMMAND_VAL的创建数组
编译,烧录程序
四、演示
下边是拍了个视频,没有多余的手了,只能这样放板子拍
ESP32C3蓝牙点灯演示视频-CSDN直播
五、总结
1、esp32C3是否能跟电脑直连及低功耗蓝牙和经典蓝牙概念
先说概念:
①. 经典蓝牙(Bluetooth Classic)
- 设计目标:
针对持续、高带宽数据传输(如音频流、文件传输)。 - 典型应用:
- 无线耳机、音箱(音频传输)
- 车载蓝牙(电话/音乐)
- 传统外设(键盘、鼠标)
- 关键特性:
- 传输速率高:经典蓝牙 3.0 支持最高 24 Mbps(EDR 增强模式)。
- 持续连接:适合长时间数据流传输,但功耗较高。
- 协议架构:基于 RFCOMM(串口模拟)、SPP(串口协议)、A2DP(音频传输)等协议。
②. 低功耗蓝牙(BLE)
- 设计目标:
专为间歇性、低功耗数据传输优化,适合电池供电设备。 - 典型应用:
- 健康传感器(心率、温度)
- 智能家居设备(低功耗传感器)
- 物联网设备(如信标、追踪器)
- 关键特性:
- 超低功耗:BLE 设备在睡眠模式下电流可低至 μA 级。
- 短时通信:数据通过短脉冲传输,连接后快速进入休眠。
- 协议架构:基于 GATT(通用属性协议)和 ATT(属性协议),通过“服务”和“特征值”定义数据交互。
然后这是esp32C3的数据手册,上边只对低功耗蓝牙进行了描述,并没有说明支持经典蓝牙
esp32-c3_datasheet_en.pdf
但我查了很久,得到这样的信息“”基于 BLE GATT 协议自定义服务,创建特征值用于发送和接收数据(如 FFE1
特征),并启用读写/通知属性 ,将串口数据(UART)与 BLE 特征值绑定,实现双向数据传输 ”这种方法是可以实现。这个我要再研究研究
2、uuid
UUID 是蓝牙设备中用于唯一标识服务(Service)或功能(Characteristic)的“身份证号”。比如:心率服务用 0000180D-...
,电量用 00002A19-...
,类似身份证上的姓名和用途。开发者可自创UUID(如 ABCD1234-...
),避免和其他服务重复
3、handle
Handle 是蓝牙协议栈中用于唯一标识资源的临时句柄,主要用于协议内部快速访问和管理属性(Attribute)、服务(Service)或特征值(Characteristic)
至于为什么我读到的handle和软件上显示的handle不同,可能是因为调试工具显示的 Handle=41
可能是特征值声明的起始位置
有可能会发生以下偏移:
[特征值声明Handle=41] → [读属性Handle=42] → [写属性Handle=43]
还是勉强完成了蓝牙和电脑通讯,还需要更多的去学习蓝牙相关的知识以及进一步的改进!