如何在树莓派或ESP32上克隆BLE原始广播数据?
精准克隆BLE广播原始数据的实现方法(ESP32/树莓派)
ESP32 Arduino 实现
常规的BLEBeacon等封装类会自动生成广告结构,要精准克隆原始数据,需要直接操作BLE广告的原始字节序列,绕开库的自动生成逻辑:
抓取目标遥控器的完整原始广播数据
用nRF Connect等工具扫描遥控器,复制其广播包的完整Hex字节序列(包括所有AD结构的长度、类型、数据)。编写直接发送原始数据的代码
调用BLE库的setData方法,直接传入原始字节数组,示例代码如下:#include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h> void setup() { Serial.begin(115200); BLEDevice::init(""); // 无需设置设备名,直接复用原始数据中的内容 BLEServer* pServer = BLEDevice::createServer(); BLEAdvertising* pAdvertising = pServer->getAdvertising(); // 替换为你抓取到的遥控器原始广播Hex字节 uint8_t rawAdvData[] = {0x18, 0xF9, 0x01, 0x02, 0x03, 0x04, 0x05}; BLEAdvertisementData advData; // 将字节数组转为string传入setData,直接覆盖自动生成的广告内容 advData.setData(std::string((char*)rawAdvData, sizeof(rawAdvData))); pAdvertising->setAdvertisementData(advData); // 如果遥控器有扫描响应数据,同样用此方式设置 // uint8_t rawScanRespData[] = {0x0A, 0x09, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x52, 0x63}; // BLEAdvertisementData scanRespData; // scanRespData.setData(std::string((char*)rawScanRespData, sizeof(rawScanRespData))); // pAdvertising->setScanResponseData(scanRespData); pAdvertising->start(); Serial.println("已启动BLE广播,发送原始克隆数据"); } void loop() { delay(1000); }
树莓派 实现
利用BlueZ工具直接发送原始广告数据,有两种常用方式:
方式1:使用hcitool(适合旧版BlueZ)
- 先停止蓝牙服务避免冲突:
sudo systemctl stop bluetooth - 启用蓝牙适配器:
sudo hciconfig hci0 up - 设置原始广告数据(替换为你抓取的Hex字节,注意空格分隔):
其中sudo hcitool -i hci0 cmd 0x08 0x0008 18 F9 01 02 03 04 050x08 0x0008是HCI设置广告数据的命令,后面的字节为原始广播内容。 - 启动广播:
(参数sudo hcitool -i hci0 cmd 0x08 0x000A 0000表示开启广播,01为关闭)
方式2:使用bluetoothctl(推荐,新版BlueZ支持)
进入bluetoothctl交互模式操作:
sudo bluetoothctl power on advertise off # 传入原始Hex字节,用冒号分隔 advertise raw 18:F9:01:02:03:04:05 advertise on
关键注意事项
- 确保抓取的原始数据是完整的BLE广告包,包含所有AD结构(长度+类型+数据),否则广播会无效。
- ESP32需使用较新版本的Arduino BLE库,避免
setData方法兼容性问题。 - 树莓派若遇到权限问题,需确保操作时使用
sudo,或配置蓝牙适配器的权限。
内容的提问来源于stack exchange,提问作者Rman
相关产品推荐
相关产品推荐

