ESP32Mini打印机:蓝牙模块

0 阅读4分钟

💡 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初始化和广播的标准步骤
  • ✅ 学会使用回调函数处理连接与数据接收
  • ✅ 将蓝牙模块无缝集成到打印机项目中