💡 ESP32 Mini打印机蓝牙模块
基于ESP32的蓝牙通信实现
将手机需要打印的图像通过蓝牙发送到打印机
一、蓝牙技术选型
核心作用
为Mini打印机选择最合适的蓝牙方案,实现手机与设备的无线图像传输。
两种蓝牙技术对比
| 类型 | 经典蓝牙 (BT) | 低功耗蓝牙 (BLE) |
|---|---|---|
| 数据量 | 较大,适合语音、音乐等高数据量传输 | 较小,适合控制指令、传感器数据等 |
| 功耗 | 较高 | 极低 |
| 实时性 | 一般 | 较高 |
| 应用场景 | 蓝牙耳机、音箱、文件传输 | 智能家居(蓝牙锁、蓝牙灯)、传感设备(血压计、温度传感器) |
选择BLE的理由
- ✅ 功耗极低:适合电池供电的便携打印机
- ✅ 实时性高:满足打印指令的快速响应
- ✅ 成本优势:模块价格更低
- ✅ 手机兼容性好:现代手机对BLE支持完善
直观理解:
经典蓝牙像卡车——能拉很多货但耗油;BLE像电动车——轻便省电,送货上门刚好。
二、代码实现:BLE初始化与广播
核心作用
初始化ESP32的BLE功能,创建服务器、服务和特征,使设备可被手机扫描并连接。
完整代码段(带详细注释)
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <BLE2902.h>
// 定义服务的UUID(需保证唯一性,可使用在线生成器)
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
// 定义特征的UUID
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
// 全局特征指针,用于后续发送通知等操作
BLECharacteristic *pCharacteristic;
// 蓝牙连接状态标志(供外部程序使用)
bool bleCallback = false;
void setup() {
Serial.begin(115200);
Serial.println("开始初始化BLE...");
// 1. 初始化BLE设备,设置广播名称
BLEDevice::init("Mini_Printer");
// 2. 创建BLE服务器
BLEServer *pServer = BLEDevice::createServer();
// 3. 设置服务器回调(连接/断开事件)
pServer->setCallbacks(new bleServerCallbacks());
// 4. 创建BLE服务
BLEService *pService = pServer->createService(SERVICE_UUID);
// 5. 创建BLE特征(属性:可读、可写、可通知)
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
// 检查特征是否创建成功
if (pCharacteristic == nullptr) {
Serial.println("错误:创建特征失败!");
return;
}
// 6. 设置特征回调(读写事件)
pCharacteristic->setCallbacks(new bleCharacteristicCallbacks());
// 7. 添加描述符(用于启用通知功能)
pCharacteristic->addDescriptor(new BLE2902());
// 8. 启动服务
pService->start();
// 9. 开始广播,让手机可以扫描到
BLEDevice::startAdvertising();
Serial.println("BLE已启动,等待连接...");
}
直观理解:
这一系列操作就像开一家蓝牙“便利店”——起店名(设备名)、装修(创建服务)、上架商品(创建特征)、开门营业(开始广播)。
三、回调函数设计
1. 服务器回调:监听连接与断开
class bleServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) override {
bleCallback = true; // 更新连接状态标志
Serial.println("设备连接");
}
void onDisconnect(BLEServer* pServer) override {
bleCallback = false; // 更新连接状态标志
Serial.println("设备断开");
// 重新开始广播,等待下一个设备连接
pServer->startAdvertising();
}
};
核心作用:
onConnect:连接成功时设置标志,可触发打印机待机状态指示onDisconnect:断开时重启广播,允许新设备连接,并清除标志
直观理解:
就像便利店店员——有顾客进店(onConnect)就打招呼,顾客离开(onDisconnect)就继续迎宾。
2. 特征回调:处理数据读写
class bleCharacteristicCallbacks : public BLECharacteristicCallbacks {
void onRead(BLECharacteristic *pCharacteristic) override {
Serial.println("触发读取");
// 可以在此返回打印机状态(如电量、是否在线)
}
void onWrite(BLECharacteristic *pCharacteristic) override {
size_t length = pCharacteristic->getLength(); // 获取写入数据长度
uint8_t *pdata = pCharacteristic->getData(); // 获取数据指针
Serial.printf("触发写入 length=%d \n", length);
// TODO: 根据写入数据解析图像或指令,启动打印任务
}
};
核心作用:
onRead:手机主动读取特征值时触发,可用于获取打印机状态onWrite:手机发送数据时触发,核心数据处理入口,收到的数据即为需要打印的图像或控制指令
直观理解:
就像便利店收银台——手机来问价(onRead)就回答,手机付款扫码(onWrite)就收钱干活。
四、使用总结
| 关键词/技巧 | 一句话记忆 |
|---|---|
BLEDevice::init() | 起个蓝牙名,设备有了身份 |
BLEServer | 蓝牙总服务器,负责接待连接 |
BLEService | 服务就像部门,按功能划分 |
BLECharacteristic | 特征是数据通道,读/写/通知全靠它 |
BLE2902 | 描述符必须加,否则通知发不出去 |
onConnect/onDisconnect | 连接断开的回调,状态更新在此 |
onWrite | 数据接收入口,打印任务由此开始 |
startAdvertising() | 开启广播,让手机能发现 |
五、写在最后
通过BLE模块,ESP32 Mini打印机成功变身“无线设备”,手机可随时发送图像进行打印。本文从蓝牙选型到代码实现再到回调机制,完整展示了基于ESP32的BLE通信开发流程。
希望这篇文章能帮助你:
- ✅ 理解经典蓝牙与BLE的区别,正确选型
- ✅ 掌握ESP32 BLE初始化和广播的标准步骤
- ✅ 学会使用回调函数处理连接与数据接收
- ✅ 将蓝牙模块无缝集成到打印机项目中