发布时间:2023-12-31 17:30
因为需要使用ESP32的蓝牙功能,就看了下ESP32的BluetoothSerial蓝牙库,例程里是ESP32作为从机,使用手机或者其他设备连接ESP32进行数据传输。但我又需要使用ESP32互连,一个作为主机,一个作为从机,就根据库敲了一下ESP32做主机主动连接从机的代码,就像HC05或06蓝牙似的,实现两个蓝牙进行配对,上电自动连接,很方便。
使用的是BluetoothSerial这个蓝牙库,函数少且简单,看相关函数名字也能知道是实现什么功能,与低功耗蓝牙相比功能少一些,但是基本的功能都有,能搜索从机设备,实现点对点连接,使用起来还是很方便的。
我看网上没有这个库的相关介绍,弄好了就记录一下,万一以后需要用却找不到了,就不太好,就在这记录分享一下。
#include
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
#define Master 1 //主从机模式选择 1主机 0从机
void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param); //蓝牙事件回调函数
uint8_t address[6]={0x30,0x83,0x98,0xC3,0x50,0xDA}; //从机MAC地址 不同的蓝牙地址不同 需要自己修改
void setup() {
Serial.begin(115200);
SerialBT.register_callback(Bluetooth_Event); //设置事件回调函数 连接 断开 发送 接收
if(Master)
{
SerialBT.begin("ESP32_MASTER",true); //开启蓝牙 名称为:"ESP32_MASTER" 主机
Serial.printf("Init Complete - Master\r\n");
SerialBT.connect(address);
}
else
{
SerialBT.begin("ESP32_SLAVE"); //开启蓝牙 名称为:"ESP32_SLAVE" 从机
Serial.printf("Init Complete - Slave\r\n");
}
}
void loop()
{
if(Master)
SerialBT.write('A');
delay(300);
}
void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) //蓝牙事件回调函数
{
if(event == ESP_SPP_OPEN_EVT || event == ESP_SPP_SRV_OPEN_EVT) //蓝牙连接成功标志
{ //蓝牙主机和从机模式对应的标志不同,前面的是主机模式的,后面是从机模式
Serial.write("connection successful!\r\n");
}
else if(event == ESP_SPP_CLOSE_EVT) //蓝牙断开连接标志
{
Serial.write("disconnect successful!\r\n");
}
else if(event == ESP_SPP_DATA_IND_EVT) //数据接收标志
{
while(SerialBT.available())
{
Serial.write(SerialBT.read());
}
Serial.write(" receive complete! \r\n");
}
else if(event == ESP_SPP_WRITE_EVT) //数据发送标志
{
Serial.write(" send complete! \r\n");
}
}
上面就是基本的代码了,可以修改Master宏定义来选择主从机模式,使用register_callback()函数为蓝牙事件添加了回调函数,当连接成功、断开连接、接收数据和发送数据等事件发生时,会触发自定义的Bluetooth_Event()函数,根据事件枚举标志位来判断当前是哪种事件,使用串口打印出相关字符。
代码里没有写连接失败后重复连接的代码,因为我发现,每次连接时间好像不太固定,差的有点多,后面再改进。所以目前这代码最好先给从机通电,再给主机通电,避免连接失败。
有一点要注意,一定要先使用register_callback()函数注册回调函数,再调用begin()初始化函数,不然不会触发"连接成功"这个事件,也不知道为啥,后来多次修改试出来的。主机和从机模式的"连接成功"事件对应的标志不一样,所以在上面代码中使用了逻辑或,这样不管你是主机还是从机都会成功触发"连接成功"这个事件(感谢网友,不然我也没注意到这个问题)。
连接成功后,主机模块会发送字符"A",从机模块会接收到并使用串口打印。
需要这个库需要包含"BluetoothSerial.h"这个头文件。Vscode+Platformio基于Arduino开发。
连接从机需要从机的MAC地址,这个可以使用手机上的蓝牙串口软件查看。
开始的时候发现这个库里面竟然没有关于蓝牙主动搜索功能的相关函数,那会也不需要搜索功能也就没太在意。后来在platformio中将支撑包从3.1更新到最新的4.4之后,特地看了一下这个经典蓝牙库,发现里面有蓝牙搜索的API了,试了一下没问题的,有搜索功能还是方便的呀。