我的目标是通过蓝牙低功耗(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实例一切都很好,没有任何问题。没有再出现此错误。