btclock_v3/src/lib/block_notify.cpp

105 lines
3.1 KiB
C++
Raw Normal View History

2023-11-07 00:11:12 +00:00
#include "block_notify.hpp"
const char *wsServer = "wss://mempool.space/api/v1/ws";
// WebsocketsClient client;
esp_websocket_client_handle_t client;
unsigned long int currentBlockHeight;
void setupBlockNotify()
{
2023-11-07 20:26:15 +00:00
IPAddress result;
int dnsErr = -1;
String mempoolInstance = preferences.getString("mempoolInstance", DEFAULT_MEMPOOL_INSTANCE);
while (dnsErr != 1) {
dnsErr = WiFi.hostByName(mempoolInstance.c_str(), result);
if (dnsErr != 1) {
Serial.print(mempoolInstance);
Serial.println("mempool DNS could not be resolved");
WiFi.reconnect();
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
Serial.println("mempool DNS can be resolved");
2023-11-07 00:11:12 +00:00
// Get current block height through regular API
HTTPClient *http = new HTTPClient();
2023-11-07 20:26:15 +00:00
http->begin("https://" + mempoolInstance + "/api/blocks/tip/height");
2023-11-07 00:11:12 +00:00
int httpCode = http->GET();
if (httpCode > 0 && httpCode == HTTP_CODE_OK)
{
String blockHeightStr = http->getString();
currentBlockHeight = blockHeightStr.toInt();
2023-11-07 20:26:15 +00:00
xTaskNotifyGive(blockUpdateTaskHandle);
2023-11-07 00:11:12 +00:00
}
esp_websocket_client_config_t config = {
2023-11-07 20:26:15 +00:00
.uri = "wss://mempool.bitcoin.nl/api/v1/ws",
2023-11-07 00:11:12 +00:00
};
2023-11-07 20:26:15 +00:00
Serial.printf("Connecting to %s\r\n", config.uri);
2023-11-07 00:11:12 +00:00
client = esp_websocket_client_init(&config);
esp_websocket_register_events(client, WEBSOCKET_EVENT_ANY, onWebsocketEvent, client);
esp_websocket_client_start(client);
}
void onWebsocketEvent(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;
String init;
String sub;
switch (event_id)
{
case WEBSOCKET_EVENT_CONNECTED:
Serial.println("Connected to Mempool.space WebSocket");
2023-11-07 20:26:15 +00:00
2023-11-07 00:11:12 +00:00
sub = "{\"action\": \"want\", \"data\":[\"blocks\"]}";
if (esp_websocket_client_send_text(client, sub.c_str(), sub.length(), portMAX_DELAY) == -1)
{
2023-11-07 20:26:15 +00:00
Serial.println("Mempool.space WS Block Subscribe Error");
2023-11-07 00:11:12 +00:00
}
break;
case WEBSOCKET_EVENT_DATA:
onWebsocketMessage(data);
// Handle the received WebSocket message (block notifications) here
break;
case WEBSOCKET_EVENT_ERROR:
2023-11-07 20:26:15 +00:00
Serial.println("Mempool.space WS Connnection error");
2023-11-07 00:11:12 +00:00
break;
case WEBSOCKET_EVENT_DISCONNECTED:
2023-11-07 20:26:15 +00:00
Serial.println("Mempool.space WS Connnection Closed");
2023-11-07 00:11:12 +00:00
break;
}
}
void onWebsocketMessage(esp_websocket_event_data_t *event_data)
{
2023-11-07 20:26:15 +00:00
SpiRamJsonDocument doc(event_data->data_len);
2023-11-07 00:11:12 +00:00
deserializeJson(doc, (char *)event_data->data_ptr);
// serializeJsonPretty(doc, Serial);
if (doc.containsKey("block"))
{
JsonObject block = doc["block"];
currentBlockHeight = block["height"].as<long>();
Serial.print("New block found: ");
Serial.println(block["height"].as<long>());
if (blockUpdateTaskHandle != nullptr)
xTaskNotifyGive(blockUpdateTaskHandle);
}
doc.clear();
}
unsigned long getBlockHeight()
{
return currentBlockHeight;
}