Description
Hardware:
Board: M5Stick-C
Core Installation version: 1.0.4
IDE name: Arduino IDE
Flash Frequency: 40Mhz
PSRAM enabled: no
Upload Speed: 1500000
Computer OS: Win 10
Description:
I have an initialized BLE Server and BLE Client on the same device.
BLE Client connects and disconnects repeatedly to another device e.g. my android phone.
When the Client fails to connect, a ESP_GATTS_DISCONNECT_EVT is somehow triggered, decrementing m_connectedCount. This should not happen, as m_connectedCount was not incremented.
Symptom is that m_connectedCount is now 1 less than expected, and potentially underflowing to 65535.
Reproducibility happens rarely, probably only during the boundary where the phone changes its MAC address and the ESP32 is just about to read it. We can increase the chance of this happening by turning off the radio at the right time, during the connecting phase.
Sketch: (leave the backquotes for code formatting)
Related code:
uint16_t _OT_ProtocolV2::get_connected_count()
{
return this->bleServer->getConnectedCount();
}
bool _OT_ProtocolV2::connect_and_exchange(BLEAddress address, int8_t rssi)
{
// Connect to the BLE Server
// - we need BLE_ADDR_TYPE_RANDOM as phones are using random addressing which changes over time
this->bleClient->connect(address, BLE_ADDR_TYPE_RANDOM);
BLERemoteService* pRemoteService;
BLERemoteCharacteristic* pRemoteCharacteristic;
if(!this->bleClient->isConnected())
{
Serial.println(F("Client connection failed"));
return false;
}
pRemoteService = this->bleClient->getService(this->serviceUUID);
if (pRemoteService == NULL)
{
if(this->bleClient->isConnected()) this->bleClient->disconnect();
Serial.println(F("Failed to find our service UUID"));
return false;
}
pRemoteCharacteristic = pRemoteService->getCharacteristic(this->characteristicUUID);
if (pRemoteCharacteristic == NULL)
{
if(this->bleClient->isConnected()) this->bleClient->disconnect();
Serial.println(F("Failed to find our characteristic UUID"));
return false;
}
if(!pRemoteCharacteristic->canRead() || !pRemoteCharacteristic->canWrite())
{
if(this->bleClient->isConnected()) this->bleClient->disconnect();
Serial.println(F("Unable to read or write"));
return false;
}
std::string buf;
this->prepare_central_write_request(buf, rssi);
pRemoteCharacteristic->writeValue(buf, false);
Serial.print("BLE central Send: ");
Serial.println(buf.c_str());
OT_ConnectionRecord connectionRecord;
buf = pRemoteCharacteristic->readValue();
// no need for ble client after this point
if(this->bleClient->isConnected()) this->bleClient->disconnect();
if(!this->process_central_read_request(buf, connectionRecord))
{
Serial.println(F("Json parse error or read failed"));
return false;
}
Serial.print("BLE central Recv: ");
Serial.println(buf.c_str());
// TODO: store data read into connectionRecord somewhere
return true;
}
/**
**/
Debug Messages:
Enable Core debug level: Debug on tools menu of Arduino IDE, then put the serial output here
Recompiled with debug level: Debug, but I don't see any debug messages.
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
;�⸮⸮U⸮⸮⸮2-hal-cpu.c:178] setCpuFrequencyMhz(): PLL: 320 / 4 = 80 Mhz, APB: 80000000 Hz
M5StickC initializing...OK
Devices connected: 0
Devices connected: 0
Devices connected: 0
...
Devices connected: 0
Devices connected: 0
Devices connected: 0
5a:62:51:40:dd:99 rssi: -65
Device connected to BLE
BLE central Send: {"id":"8Vej+n4NAutyZlS1ItKDL//RcfqWP/Tq/T/BBBUOsmAF0U+TGBqd2xcMhpfcSOyN1cSGN3znSGguodP+NQ==","v":2,"o":"SG_MOH","mc":"TraceStick V0.1","rs":-65}
BLE central Recv: {"mp":"Pixel 3a XL","v":2,"id":"SElnQHsPCfc/TGSQ6kR0sdTRS07g1KABGxRwcBzAjB6C884CIVB89SIdiwiDMBCbL9wCEKMaDaXOQQKMvg==","o":"SG_MOH"}
Device disconnected from BLE
Devices connected: 0
Devices connected: 0
...
Devices connected: 0
Devices connected: 0
Devices connected: 0
47:aa:ac:6c:32:ce rssi: -55
Device disconnected from BLE
Client connection failed
Devices connected: 65535
Devices connected: 65535
...
Devices connected: 65535
Devices connected: 65535
Devices connected: 65535
7f:46:54:44:b6:57 rssi: -71
Device disconnected from BLE
Client connection failed
Devices connected: 65534
Devices connected: 65534
Devices connected: 65534