Retry on send errors
This commit is contained in:
parent
de4c461081
commit
550bc03f1d
|
@ -196,7 +196,7 @@ float BleFingerprint::getDistance()
|
||||||
return output.value.position;
|
return output.value.position;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BleFingerprint::report(JsonDocument *doc)
|
bool BleFingerprint::report(JsonDocument *doc, int maxDistance)
|
||||||
{
|
{
|
||||||
if (id == nullptr && name == nullptr)
|
if (id == nullptr && name == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
@ -204,6 +204,9 @@ bool BleFingerprint::report(JsonDocument *doc)
|
||||||
if (!hasValue)
|
if (!hasValue)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (maxDistance > 0 && output.value.position > maxDistance)
|
||||||
|
return false;
|
||||||
|
|
||||||
String mac = SMacf(address);
|
String mac = SMacf(address);
|
||||||
if (output.value.position < 0.5)
|
if (output.value.position < 0.5)
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
~BleFingerprint();
|
~BleFingerprint();
|
||||||
|
|
||||||
void seen(BLEAdvertisedDevice *advertisedDevice);
|
void seen(BLEAdvertisedDevice *advertisedDevice);
|
||||||
bool report(JsonDocument *doc);
|
bool report(JsonDocument *doc, int maxDistance);
|
||||||
|
|
||||||
String getId() { return id; }
|
String getId() { return id; }
|
||||||
|
|
||||||
|
|
|
@ -72,8 +72,8 @@
|
||||||
// Define bluetooth scan parameters
|
// Define bluetooth scan parameters
|
||||||
#define BLE_ACTIVE_SCAN false // Active scan uses more power, but get results faster
|
#define BLE_ACTIVE_SCAN false // Active scan uses more power, but get results faster
|
||||||
|
|
||||||
#define BLE_SCAN_INTERVAL 150 // Used to determine antenna sharing between Bluetooth and WiFi. Do not modify unless you are confident you know what you're doing
|
#define BLE_SCAN_INTERVAL 40 // Used to determine antenna sharing between Bluetooth and WiFi. Do not modify unless you are confident you know what you're doing
|
||||||
#define BLE_SCAN_WINDOW 150 // Used to determine antenna sharing between Bluetooth and WiFi. Do not modify unless you are confident you know what you're doing
|
#define BLE_SCAN_WINDOW 30 // Used to determine antenna sharing between Bluetooth and WiFi. Do not modify unless you are confident you know what you're doing
|
||||||
|
|
||||||
// Maximum distance (in meters) to report. Devices that are calculated to be further than this distance in meters will not be reported
|
// Maximum distance (in meters) to report. Devices that are calculated to be further than this distance in meters will not be reported
|
||||||
#define MAX_DISTANCE 16
|
#define MAX_DISTANCE 16
|
||||||
|
|
91
src/main.cpp
91
src/main.cpp
|
@ -1,6 +1,6 @@
|
||||||
#include <main.h>
|
#include <main.h>
|
||||||
|
|
||||||
BleFingerprint *getFingerprint(BLEAdvertisedDevice *advertisedDevice)
|
BleFingerprint *getFingerprintInternal(BLEAdvertisedDevice *advertisedDevice)
|
||||||
{
|
{
|
||||||
auto mac = advertisedDevice->getAddress();
|
auto mac = advertisedDevice->getAddress();
|
||||||
|
|
||||||
|
@ -28,6 +28,16 @@ BleFingerprint *getFingerprint(BLEAdvertisedDevice *advertisedDevice)
|
||||||
return created;
|
return created;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BleFingerprint *getFingerprint(BLEAdvertisedDevice *advertisedDevice)
|
||||||
|
{
|
||||||
|
if (xSemaphoreTake(fingerprintSemaphore, 1000) != pdTRUE)
|
||||||
|
log_e("Couldn't take semaphore!");
|
||||||
|
auto f = getFingerprintInternal(advertisedDevice);
|
||||||
|
if (xSemaphoreGive(fingerprintSemaphore) != pdTRUE)
|
||||||
|
log_e("Couldn't give semaphore!");
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts = -1)
|
bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts = -1)
|
||||||
{
|
{
|
||||||
StaticJsonDocument<512> tele;
|
StaticJsonDocument<512> tele;
|
||||||
|
@ -48,6 +58,8 @@ bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts
|
||||||
tele["adverts"] = totalAdverts;
|
tele["adverts"] = totalAdverts;
|
||||||
if (sendFailures > 0)
|
if (sendFailures > 0)
|
||||||
tele["sendFails"] = sendFailures;
|
tele["sendFails"] = sendFailures;
|
||||||
|
if (reconnectAttempts > 0)
|
||||||
|
tele["reconnectAttempts"] = reconnectAttempts;
|
||||||
|
|
||||||
tele["resetCore0"] = resetReason(rtc_get_reset_reason(0));
|
tele["resetCore0"] = resetReason(rtc_get_reset_reason(0));
|
||||||
tele["resetCore1"] = resetReason(rtc_get_reset_reason(1));
|
tele["resetCore1"] = resetReason(rtc_get_reset_reason(1));
|
||||||
|
@ -60,16 +72,16 @@ bool sendTelemetry(int totalSeen = -1, int totalReported = -1, int totalAdverts
|
||||||
char teleMessageBuffer[512];
|
char teleMessageBuffer[512];
|
||||||
serializeJson(tele, teleMessageBuffer);
|
serializeJson(tele, teleMessageBuffer);
|
||||||
|
|
||||||
if (mqttClient.publish((TELEMETRY_TOPIC).c_str(), 0, 0, teleMessageBuffer) == true)
|
for (int i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
return true;
|
if (mqttClient.publish((TELEMETRY_TOPIC).c_str(), 0, 0, teleMessageBuffer) == true)
|
||||||
}
|
return true;
|
||||||
else
|
delay(20);
|
||||||
{
|
|
||||||
sendFailures++;
|
|
||||||
log_e("Error sending telemetry");
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendFailures++;
|
||||||
|
log_e("Error sending telemetry");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void connectToWifi()
|
void connectToWifi()
|
||||||
|
@ -121,7 +133,7 @@ void connectToWifi()
|
||||||
void onMqttConnect(bool sessionPresent)
|
void onMqttConnect(bool sessionPresent)
|
||||||
{
|
{
|
||||||
Serial.println("Connected to MQTT");
|
Serial.println("Connected to MQTT");
|
||||||
retryAttempts = 0;
|
reconnectAttempts = 0;
|
||||||
|
|
||||||
if (mqttClient.publish(availabilityTopic.c_str(), 0, 1, "CONNECTED") == true)
|
if (mqttClient.publish(availabilityTopic.c_str(), 0, 1, "CONNECTED") == true)
|
||||||
{
|
{
|
||||||
|
@ -149,15 +161,12 @@ void reconnect(TimerHandle_t xTimer)
|
||||||
if (WiFi.isConnected() && mqttClient.connected())
|
if (WiFi.isConnected() && mqttClient.connected())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (retryAttempts > 10)
|
if (reconnectAttempts++ > 10)
|
||||||
{
|
{
|
||||||
log_e("Too many retries. Restarting");
|
log_e("Too many reconnect attempts; Restarting");
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
retryAttempts++;
|
|
||||||
}
|
|
||||||
if (!WiFi.isConnected())
|
if (!WiFi.isConnected())
|
||||||
if (!WiFiSettings.connect(true, 60))
|
if (!WiFiSettings.connect(true, 60))
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
|
@ -190,6 +199,8 @@ private:
|
||||||
|
|
||||||
void onResult(BLEAdvertisedDevice *advertisedDevice)
|
void onResult(BLEAdvertisedDevice *advertisedDevice)
|
||||||
{
|
{
|
||||||
|
if (updateInProgress)
|
||||||
|
return;
|
||||||
totalSeen++;
|
totalSeen++;
|
||||||
digitalWrite(LED_BUILTIN, LED_BUILTIN_ON);
|
digitalWrite(LED_BUILTIN, LED_BUILTIN_ON);
|
||||||
BleFingerprint *f = getFingerprint(advertisedDevice);
|
BleFingerprint *f = getFingerprint(advertisedDevice);
|
||||||
|
@ -202,48 +213,38 @@ private:
|
||||||
bool reportDevice(BleFingerprint *f)
|
bool reportDevice(BleFingerprint *f)
|
||||||
{
|
{
|
||||||
StaticJsonDocument<512> doc;
|
StaticJsonDocument<512> doc;
|
||||||
|
if (!f->report(&doc, MAX_DISTANCE))
|
||||||
if (!f->report(&doc))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char JSONmessageBuffer[512];
|
char JSONmessageBuffer[512];
|
||||||
serializeJson(doc, JSONmessageBuffer);
|
serializeJson(doc, JSONmessageBuffer);
|
||||||
String id = doc["id"];
|
|
||||||
String publishTopic = CHANNEL + "/" + room;
|
|
||||||
String publishTopic2 = CHANNEL + "/" + room + "/" + id;
|
|
||||||
|
|
||||||
if (mqttClient.connected())
|
String publishTopic = CHANNEL + "/" + room;
|
||||||
|
String publishTopic2 = CHANNEL + "/" + room + "/" + f->getId();
|
||||||
|
|
||||||
|
bool p1 = false, p2 = false;
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
if (MAX_DISTANCE == 0 || doc["distance"] < MAX_DISTANCE)
|
if (!mqttClient.connected())
|
||||||
{
|
|
||||||
if (mqttClient.publish((char *)publishTopic.c_str(), 0, 0, JSONmessageBuffer) && mqttClient.publish((char *)publishTopic2.c_str(), 0, 0, JSONmessageBuffer))
|
|
||||||
{
|
|
||||||
#if VERBOSE
|
|
||||||
// Serial.println(JSONmessageBuffer);
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sendFailures++;
|
|
||||||
Serial.print("Error sending message: ");
|
|
||||||
Serial.println(publishTopic);
|
|
||||||
Serial.print("Message: ");
|
|
||||||
Serial.println(JSONmessageBuffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Serial.printf("%s exceeded distance threshold %.2f\n\r", mac_address.c_str(), distance);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
if (!p1 && mqttClient.publish((char *)publishTopic.c_str(), 0, 0, JSONmessageBuffer))
|
||||||
|
p1 = true;
|
||||||
|
|
||||||
|
if (!p2 && mqttClient.publish((char *)publishTopic2.c_str(), 0, 0, JSONmessageBuffer))
|
||||||
|
p2 = true;
|
||||||
|
|
||||||
|
if (p1 && p2)
|
||||||
|
return true;
|
||||||
|
delay(20);
|
||||||
}
|
}
|
||||||
|
sendFailures++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void scanForDevices(void *parameter)
|
void scanForDevices(void *parameter)
|
||||||
{
|
{
|
||||||
|
fingerprintSemaphore = xSemaphoreCreateBinary();
|
||||||
auto scan = MyAdvertisedDeviceCallbacks();
|
auto scan = MyAdvertisedDeviceCallbacks();
|
||||||
BLEDevice::init("");
|
BLEDevice::init("");
|
||||||
auto pBLEScan = BLEDevice::getScan();
|
auto pBLEScan = BLEDevice::getScan();
|
||||||
|
|
|
@ -49,7 +49,7 @@ TaskHandle_t scannerTask;
|
||||||
|
|
||||||
bool updateInProgress = false;
|
bool updateInProgress = false;
|
||||||
String localIp;
|
String localIp;
|
||||||
int retryAttempts = 0;
|
int reconnectAttempts = 0;
|
||||||
int sendFailures = 0;
|
int sendFailures = 0;
|
||||||
|
|
||||||
String mqttHost;
|
String mqttHost;
|
||||||
|
@ -59,6 +59,7 @@ String mqttPass;
|
||||||
String availabilityTopic;
|
String availabilityTopic;
|
||||||
String room;
|
String room;
|
||||||
|
|
||||||
|
static SemaphoreHandle_t fingerprintSemaphore;
|
||||||
static std::list<BleFingerprint *> fingerprints;
|
static std::list<BleFingerprint *> fingerprints;
|
||||||
|
|
||||||
String resetReason(RESET_REASON reason)
|
String resetReason(RESET_REASON reason)
|
||||||
|
@ -152,7 +153,7 @@ void configureOTA()
|
||||||
Serial.println("Receive Failed");
|
Serial.println("Receive Failed");
|
||||||
else if (error == OTA_END_ERROR)
|
else if (error == OTA_END_ERROR)
|
||||||
Serial.println("End Failed");
|
Serial.println("End Failed");
|
||||||
ESP.restart();
|
updateInProgress = false;
|
||||||
});
|
});
|
||||||
ArduinoOTA.setHostname(WiFi.getHostname());
|
ArduinoOTA.setHostname(WiFi.getHostname());
|
||||||
ArduinoOTA.setPort(3232);
|
ArduinoOTA.setPort(3232);
|
||||||
|
|
Loading…
Reference in New Issue