模拟蓝牙打卡,源码来自github项目dingBLE
只需要一个ESP32模块模拟蓝牙打卡机,即可通过蓝牙打卡 亲测有效arduino代码如下
打卡机的MAC和RAW数据可使用安卓app mRFconnect 扫描获取
#include "BLEDevice.h"
#include "BLEUtils.h"
#include "esp_sleep.h"BLEAdvertising *pAdvertising;
//MAC地址
uint8_t bleMac[6] = {0xFA, 0xA8, 0x9A, 0x2E, 0x6B, 0x13};
// 0-30 前31组
uint8_t bleRaw[] = {0x02,0x01,0x06,0x17,0xFF,0x00,0x01,0xB5,0x00,0x02,0x25,0xEC,0xD7,0x44,0x00,0x00,0x01,0xAA,0x91,0x77,0x67,0xAF,0x01,0x10,0x00,0x00,0x00,0x03,0x03,0x3C,0xFE};
// 如果复制出来的raw超过31组 那么把它改为true并维护下面的数组
boolean rawMoreThan31 = true;//false
// 31-end
uint8_t bleRaw32[] = {0x02, 0x01, 0x16, 0x17, 0xFF, 0x00, 0x01, 0xB5, 0x00, 0x02, 0x7D, 0x00, 0x8B, 0x6A, 0x00, 0x00, 0x00, 0x90, 0x4B, 0xB6, 0xB1, 0x38, 0x01, 0x10, 0x00, 0x00, 0x00, 0x03, 0x03, 0x3C, 0xFE};void setup() {Serial.begin(115200);// esp32没有提供设置蓝牙mac地址的api 通过查看esp32的源代码// 此操作将根据蓝牙mac算出base macif (UNIVERSAL_MAC_ADDR_NUM == FOUR_UNIVERSAL_MAC_ADDR) {bleMac[5] -= 2;} else if (UNIVERSAL_MAC_ADDR_NUM == TWO_UNIVERSAL_MAC_ADDR) {bleMac[5] -= 1;}esp_base_mac_addr_set(bleMac);// 初始化BLEDevice::init("");// Create the BLE Server// BLEServer *pServer = BLEDevice::createServer(); // <-- no longer required to instantiate BLEServer, less flash and ram usagepAdvertising = BLEDevice::getAdvertising();// 设备信息设置成空白的BLEAdvertisementData oScanResponseData = BLEAdvertisementData();pAdvertising->setScanResponseData(oScanResponseData);// 里面有个 m_customScanResponseData = true; 和 m_customScanResponseData = true; 所以只能先随便设置一下BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();pAdvertising->setAdvertisementData(oAdvertisementData);// 简单粗暴直接底层api重新设置一下抓到的rawesp_err_t errRc = ::esp_ble_gap_config_adv_data_raw(bleRaw, 31);if (errRc != ESP_OK) {Serial.printf("esp_ble_gap_config_adv_data_raw: %d\n", errRc);}// 超过31if (rawMoreThan31) {errRc = ::esp_ble_gap_config_scan_rsp_data_raw(bleRaw32, sizeof(bleRaw32)/sizeof(bleRaw32[0]));if (errRc != ESP_OK) {Serial.printf("esp_ble_gap_config_scan_rsp_data_raw: %d\n", errRc);}}pAdvertising->start();
}void loop() {// 闪灯灯 至于为什么是串口输出,因为并没有内置led,但拥有串口指示灯Serial.println("Sparkle");delay(1000);// 20分钟去待机避免忘了关if (millis() > 1200000) {esp_deep_sleep_start();}
}
如果有人感兴趣请留言点赞 我写一篇详细一点的教程