ESP32-CAM 连接低功耗蓝牙的步骤

1.第一步,设定蓝牙的UUID 共三个,代码如下:

#define SERVICE_UUID "43F4B114-CA67-48E8-A46F-9A8FFEB7146A"
#define CHARACTERISTIC_WRITE_NO_RESPONSE_UUID "BF83F3F1-399A-414D-9035-CE64CEB3FF67"
#define CHARACTERISTIC_NOTIFY_UUID "BF83F3F2-399A-414D-9035-CE64CEB3FF67"
#define BLE_SERVER_NAME "HEA2100010N000019N" 

SERVICE_UUID 服务uuid

CHARACTERISTIC_WRITE_NO_RESPONSE_UUID 写入的uuid

CHARACTERISTIC_NOTIFY_UUID 读的UUID

BLE_SERVER_NAME 蓝牙名称

2.第二步,连接低功耗蓝牙,并接收返回数据。

// 搜索到设备时回调功能
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      // if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(BLEUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"))) {
      if (advertisedDevice.haveName() && (advertisedDevice.getName() == BLE_SERVER_NAME)) {
          advertisedDevice.getScan()->stop(); // 停止当前扫描
          pServer = new BLEAdvertisedDevice(advertisedDevice); // 暂存设备
          doSacn = false;
          doConnect = true;
          Serial.println(" - 发现连接设备");
      }
    }
};

// 客户端与服务器连接与断开回调功能
class MyClientCallback : public BLEClientCallbacks {
  void onConnect(BLEClient* pclient) {}
  void onDisconnect(BLEClient* pclient) {
    doSacn = true;
    connected = false;
    Serial.println(" - 失去与设备的连接");
  }
};

// 收到服务推送的数据时的回调函数
void NotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) {
    char buf[length + 1];
    for (size_t i = 0; i < length; i++) {
      buf[i] = pData[i];
    }
    buf[length] = 0;
    Serial.printf("[%d]: %s\n", length, buf);
}

// 用来连接设备获取其中的服务与特征
bool ConnectToServer(void) {
    BLEClient* pClient  = BLEDevice::createClient(); // 创建客户端
    pClient->setClientCallbacks(new MyClientCallback()); // 添加客户端与服务器连接与断开回调功能
   
    if (!pClient->connect(pServer)) { //尝试连接设备
      return false;
    }else{
      Serial.println(" - [server]: 连接设备成功");
    }
    
    BLERemoteService* pRemoteService = pClient->getService(SERVICE_UUID); // 尝试获取设备中的服务
    if (pRemoteService == nullptr) {
      Serial.println(" - 获取服务失败");
      pClient->disconnect();
      return false;
    }else{
      Serial.println(" - [server]: 获取服务成功");
    }
    
    pRemoteCharacteristicWrite = pRemoteService->getCharacteristic(CHARACTERISTIC_WRITE_NO_RESPONSE_UUID); // 尝试获取服务中的特征
    if (pRemoteCharacteristicWrite == nullptr) {
      Serial.println(" - [Write]:获取特性失败");
      pClient->disconnect();
      return false;
    }else{
      Serial.println(" - [Write]: 获取特征成功..");
    }
    
    if(pRemoteCharacteristicWrite->canRead()) { // 如果特征值可以读取则读取数据
      Serial.printf(" - 该特征值可以读取并且当前值为[Write]: %s\r\n", pRemoteCharacteristicWrite->readValue().c_str());
    }else{
      Serial.println(" - [Write]: CHARACTERISTIC_WRITE_NO_RESPONSE_UUID canRead ERROR!");
    }
    
    if(pRemoteCharacteristicWrite->canNotify()) { // 如果特征值启用了推送则添加推送接收处理
      pRemoteCharacteristicWrite->registerForNotify(NotifyCallback);
    }else{
      Serial.println(" - [Write]: CHARACTERISTIC_WRITE_NO_RESPONSE_UUID canNotify ERROR!");      
    }

    pRemoteCharacteristicNotify = pRemoteService->getCharacteristic(CHARACTERISTIC_NOTIFY_UUID); // 尝试获取服务中的特征
    if (pRemoteCharacteristicWrite == nullptr) {
      Serial.println(" - [Notify]:获取特性失败");
      pClient->disconnect();
      return false;
    }else{
      Serial.println(" - [Notify]: 获取特征成功..");
    }
  
    if(pRemoteCharacteristicNotify->canRead()) { // 如果特征值可以读取则读取数据
      Serial.printf(" - 该特征值可以读取并且当前值为[Write]: %s\r\n", pRemoteCharacteristicNotify->readValue().c_str());
    }else{
      Serial.println(" - [Notify]: CHARACTERISTIC_NOTIFY_UUID canRead ERROR!");
    }
    if(pRemoteCharacteristicNotify->canNotify()) { // 如果特征值启用了推送则添加推送接收处理
      pRemoteCharacteristicNotify->registerForNotify(NotifyCallback);     
    }else{
      Serial.println(" - [Notify]: CHARACTERISTIC_NOTIFY_UUID canNotify ERROR!");      
    }

}

3.第三步,写入特征值,获取返回的数据。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是用ESP32-CAM实现监控的示例代码: ```c #include <esp_camera.h> #include <BluetoothSerial.h> BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin("ESP32-CAM"); // 初始化摄像头 camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = 5; config.pin_d1 = 18; config.pin_d2 = 19; config.pin_d3 = 21; config.pin_d4 = 36; config.pin_d5 = 39; config.pin_d6 = 34; config.pin_d7 = 35; config.pin_xclk = 0; config.pin_pclk = 22; config.pin_vsync = 25; config.pin_href = 23; config.pin_sscb_sda = 26; config.pin_sscb_scl = 27; config.pin_pwdn = 32; config.pin_reset = -1; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; if (psramFound()) { config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; } esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } } void loop() { // 获取图像 camera_fb_t * fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); return; } // 将图像压缩为JPEG格式 SerialBT.write((uint8_t*)fb->buf, fb->len); // 释放帧缓冲区 esp_camera_fb_return(fb); // 等待1秒 delay(1000); } ``` 这段代码的能是:初始化ESP32-CAM摄像头,然后不停地获取图像,将图像压缩为JPEG格式,通过传输给连接ESP32-CAM的设备。你可以将这段代码上传到ESP32-CAM上,连接ESP32-CAM的设备可以使用接收图像数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值