ESP32 BLE找不到小米工厂传感器的数据服务



我的目标是通过蓝牙低功耗(BLE)接收来自小米植物传感器(花卉护理)到ESP32 Devkit C v4的传感器数据。因为,我对ESP32相当陌生;BLE,我遵循github的示例。

不幸的是,第115行出现错误:

// the remote service we wish to connect to
static BLEUUID serviceUUID("00001204-0000-1000-8000-00805f9b34fb");
....    
try {
floraService = floraClient->getService(serviceUUID); // line 115: error here
}
catch (...) {
// something went wrong
}

这是一个已知的问题,已修复。有人指出serviceUUID没有被ESP32 BLE库正确处理。

现在我面临另一个问题,并从Serial获得以下输出:

Initialize BLE client...
Processing Flora device at c4:7c:8d:6d:31:2a (try 1)
- Connection successful
Guru Meditation Error: Core  0 panic'ed (Double exception). 
Core  0 register dump:
PC      : 0x400925d3  PS      : 0x00040d36  A0      : 0x8012254c  A1      : 0x3ffd1100  
A2      : 0x3ffb6388  A3      : 0x3ffdc600  A4      : 0x3ffcc310  A5      : 0x400f9294
A6      : 0x007b6c7c  A7      : 0x003fffff  A8      : 0x40080080  A9      : 0x3ffd11f0
A10     : 0x00060f36  A11     : 0x00040026  A12     : 0x00001004  A13     : 0x00000000  
A14     : 0x00000000  A15     : 0x3ffb6c68  SAR     : 0x0000001c  EXCCAUSE: 0x00000002
EXCVADDR: 0xffffffe0  LBEG    : 0x4008fd94  LEND    : 0x4008fdaa  LCOUNT  : 0xffffffff
Backtrace:<a lot of encoded stuff here>

解码后的堆栈结果如下:

Decoding stack results
0x40120be1: fixed_queue_enqueue at /home/runner/work/esp32-arduino-lib-builder/esp32/arduino-lib-builder/esp-idf/components/bt/common/osi/fixed_queue.c line 142
0x40097d19: multi_heap_malloc at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/heap/multi_heap_poisoning.c line 229

不幸的是,我上面提到的存储库已经存档了,我不能问作者。

谁知道为什么不能在ESP32和小米铂传感器之间建立数据服务?许多人说这是关于内存问题或内存耗尽,但我对微控制器的东西很陌生,不知道该怎么做。

提前感谢!

有同样的问题,奇怪。2022年5月底工作顺利。必须重新安装Arduino开发环境(从隐藏Windows安装移动到直接从Arduino.cc下载)并重新编译。使用小米flora设备。现在得到相同的异常,相同的回溯到fixed_queue.c和multi_heap_positioning。我已经尝试了几个版本的库,但都不成功。没有胶水什么都变了。

最后,我解决了这个问题。

由于bleClient在几乎每个示例和库中都是由指针(星号*)全局引用的,因此肯定存在一些内存问题。不幸的是,我真的不明白为什么这会产生问题。在运行时,指针必须由于覆盖其地址或类似的原因而损坏。

谁能解释一下为什么库中的外部指针会导致问题?实例化由新的构造函数完成。我猜,这是由方法createClient()上的指针引起的?

/**
* @brief Create a new instance of a client.
* @return A new instance of the client.
*/
/* STATIC */ BLEClient* BLEDevice::createClient() {
log_v(">> createClient");
#ifndef CONFIG_GATTC_ENABLE  // Check that BLE GATTC is enabled in make menuconfig
log_e("BLE GATTC is not enabled - CONFIG_GATTC_ENABLE not defined");
abort();
#endif  // CONFIG_GATTC_ENABLE
m_pClient = new BLEClient();
log_v("<< createClient");
return m_pClient;
} // createClient
一个解决方法是在本地使用BleClient实例一切都很好,没有任何问题。没有再出现此错误。

最新更新