esp32学习笔记2:将esp32作为BLE服务端,开启透传模式

原文链接

esp32学习笔记2:将esp32作为BLE服务端,开启透传模式 - 程序员大本营 (pianshen.com)

先说下蓝牙客户端和服务端的区别。

例如:手机1做客户端,手机2服务端

手机1要连手机2,就要自己发起搜索,搜索到手机2,然后发起连接

而手机2什么都不要做,只要开启广播,让手机1连就可以。

所以,如果我们想让esp32处于别人随时可以搜索和连接的状态,就要将esp32设置成BLE服务端,买来的芯片所带程序并不能满足要求,在他的数据手册里有这样一段话,意思就是要想用蓝牙作为服务端,需要下载他所需的bin文件,才能正常使用。详细见下图。

需要下载原厂的bin程序,如何官网下载,可以翻阅我写的esp32学习笔记1,里面详细写了如何查找和下载。

下载到bin文件以后,打开文件夹,需要将at_customize.bin和目录customized_partitions下的ble_data.bin、server_ca.bin、server_cert.bin、server_key.bin下载到esp32中。

如何下载程序看上一篇笔记,这里,着重要注意他们的地址,曾经我因为不小心写错地址,捣鼓了很久重新下载原厂程序,才疏学浅踩坑不少,也因此整理了第一篇笔记。

不同版本地址不一样,我这篇的版本是ESP32-WROOM-32_AT_Bin_V2.0,打开下载工具,将bin导入,记得打钩,电机START,将这些bin文件下载到esp32中。下载完之后,就可以设置成蓝牙服务端了。

完成这些步骤,就可以配置成服务端了。

这时我们可以发送一下命令,让esp32作为服务端并将数据透传给收

AT+BLEINIT=2 //将esp32设置成蓝牙服务端

AT+BLEGATTSSRVCRE //GATTS 创建服务

AT+BLEGATTSSRVSTART //GATTS 开启全部服务。

AT+BLEGATTSCHAR? //GATTS 发现服务特征

AT+BLEADVSTART //打开广播

AT+BLESPPCFG=1,1,6,1,5 //配置 BLE 透传模式

AT+BLESPP //打开透传模式

发送数据

在这里有好几个坑:

1.打开广播后,手机设置里面的蓝牙怎么都无法扫描到

原因:这是以为,BLE不支持手机蓝牙,他需要下载BLE蓝牙调试工具,只有在BLE蓝牙调试工具中才能查找到esp32的蓝牙。

其次,在BLE蓝牙调试工具中,esp32并不能显示蓝牙的名称,只能显示地址。

2.在配置透传模式后,再发送AT+BLESPP回复ERROR,无法打开数据透传

原因,这是在配置AT+BLESPPCFG就已经错误。我们来看下收据手册:

在esp32现有的例程里,将1号服务的第7号设置为写通道,经过我的测试,我的板子设置成这样无法开启透传,而1号服务的第6号可以,具体机制还不是很清楚,仅供参考。

3.在打开透传模式之后,esp32无法同时接收手机发送过来的数据,只有退出透传模式才可以

这个主要是设置蓝牙透传模式AT+BLESPPCFG所决定的,这里经过我的验证,esp32有两种模式:

只能发送:AT+BLESPPCFG=1,1,6,1,5或AT+BLESPPCFG=1,1,6,1,3

可以接收和发送(双向透传):AT+BLESPPCFG=1,1,6,1,4

可能还有只接收的模式,我没有去验证。

4.如何才能在手机端的BLE调试助手中显示esp32的蓝牙名称

要将esp32作为蓝牙服务端,无法用AT+BLENAME设置名字,根据手册提示,如下:

可知,要设置名称需要用AT+BLEADVDATA指令,根据例程:

这样可以将蓝牙的名称设置成Espressif,这是因为457370726573736966是Espressif的hex码,打开http://stool.chinaz.com/hex,由下面解码工具可以得出:

如果想要设置蓝牙名字,只要将要设的名字输入上图框中,然后点击Hex编码,就会生成对应的hex码:

AT+BLEADVDATA=“0201060A09457370726573736966030302A0”

/* The adv data is

  • 02 01 06 //,,

  • 0A 09 457370726573736966 //,,

  • 03 03 02A0 //,,
    */
    其中,第一列表示长度,第二列表示命令,要将0A改成设置后的长度;
    将加黑部分替换成生成的hex码,其他不变,接着分成以下两步:
    1、AT+BLEADVPARAM=32,64,0,0,7
    2、AT+BLEADVDATA=“0201060A09457370726573736966030302A0”
    这样名字设置就完成了。
    这时候,打开广播之后,名字就设置成自己想要的了。
    AT+BLEINIT=2 //将esp32设置成蓝牙服务端
    AT+BLEGATTSSRVCRE //GATTS 创建服务
    AT+BLEGATTSSRVSTART //GATTS 开启全部服务。
    AT+BLEADVSTART //打开广播

ESP32是一款由Espressif Systems开发的低功耗、高性能的物联网开发板,它支持蓝牙功能,常用于无线传感器网络和设备间通信。蓝牙透传通常指的是通过ESP32作为蓝牙模块,将串口(如WiFi模块或传感器)的数据透明地传输到蓝牙设备上,或者接收蓝牙数据并转发到其他接口。 一个简单的ESP32蓝牙透传例程可能会包括以下几个步骤: 1. **初始化蓝牙模块**:使用ESP32的Bluetooth Low Energy (BLE) API,如`esp_bt_controller_config_t` 和 `esp_bluedroid_init()` 函数来初始化蓝牙控制器。 2. **配对与连接**:如果需要,创建一个服务和 characteristic,等待其他设备连接,并进行配对。 3. **创建虚拟串口**:在ESP32中设置一个内部的串口,用于接收和发送数据。当接收到蓝牙设备的数据时,将其写入串口,反之亦然。 4. **数据透传**:设置一个回调函数,当串口接收到数据时,将其打包并通过蓝牙发送出去;当蓝牙设备发送数据过来时,从蓝牙解析并写入串口。 5. **异常处理**:确保对蓝牙连接断开、数据包接收错误等情况有适当的处理。 以下是一个简化的伪代码示例: ```c #include "esp_bt.h" #include "freertos/event_groups.h" // 蓝牙回调函数 static esp_err_t ble_evt_handler(esp_ble_event_t *event) { switch (event->event) { // 处理蓝牙事件... } } void app_main() { esp_bluedroid_init(); esp_bluedroid_register_events(ble_evt_handler); xTaskCreate(&ble_task, "BLE Task", ...); // 创建蓝牙任务处理数据透传 // 设置串口透传相关的任务和中断处理 setup_uart_tx(ble_data_received); // 透传函数 setup_uart_rx(ble_data_to_send); // 发送函数 // 进入主循环 vTaskStartScheduler(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值