目录

工欲善其事

实践出真知

活跃标签: linux java mysql 待分类 js springboot win10 电路 vue macOS nginx esp32 windows git docker idea maven esp8266 python Arduino

存档:

esp32s 蓝牙探针

1、蓝牙探针有效距离为10米,决定了近场场景,且采集的mac地址也会出现假的,iphone xr是这样的,可以采集到小米手环,其它机型测试并不灵敏,没发现采集到

2、开发环境

配置“开发板管理器地址”:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

#define SCAN_TIME 60     // seconds


#include <Arduino.h>
#include <sstream>

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

std::stringstream ss;


class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
{
    void onResult(BLEAdvertisedDevice advertisedDevice)
    {
      Serial.println("Advertised Device:  \n");
      Serial.print(advertisedDevice.toString().c_str());
      Serial.println("\n");
    }
};
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  Serial.println("ESP32 BLE Scanner");

  // disable brownout detector to maximize battery life
  Serial.println("disable brownout detector");
  // WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);

  Serial.println("BLEDevice::init()");
  BLEDevice::init("");

  // put your main code here, to run repeatedly:
  BLEScan *pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(0x50);
  pBLEScan->setWindow(0x30);

  Serial.println("Start BLE scan for 30 seconds...\n");

  BLEScanResults foundDevices = pBLEScan->start(SCAN_TIME);
  int count = foundDevices.getCount();
  ss << "[";
  for (int i = 0; i < count; i++)
  {
    if (i > 0)
    {
      ss << ",";
    }
    BLEAdvertisedDevice d = foundDevices.getDevice(i);
    ss << "{\"Address\":\"" << d.getAddress().toString() << "\",\"Rssi\":" << d.getRSSI();

    if (d.haveName())
    {
      ss << ",\"Name\":\"" << d.getName() << "\"";
    }

    if (d.haveAppearance())
    {
      ss << ",\"Appearance\":" << d.getAppearance();
    }

    if (d.haveManufacturerData())
    {
      std::string md = d.getManufacturerData();
      uint8_t *mdp = (uint8_t *)d.getManufacturerData().data();
      char *pHex = BLEUtils::buildHexData(nullptr, mdp, md.length());
      ss << ",\"ManufacturerData\":\"" << pHex << "\"";
      free(pHex);
    }

    if (d.haveServiceUUID())
    {
      ss << ",\"ServiceUUID\":\"" << d.getServiceUUID().toString() << "\"";
    }

    if (d.haveTXPower())
    {
      ss << ",\"TxPower\":" << (int)d.getTXPower();
    }

    ss << "}";
  }
  ss << "]";
  //Serial.println(String(ss));
  Serial.println("Scan done!");

}

void loop() {
  // put your main code here, to run repeatedly:
  //Serial.println("loop");
}

标题:esp32s 蓝牙探针
作者:llilei
地址:http://solo.llilei.work/articles/2022/09/27/1664283604822.html