ESP32 now publishes on broker

This commit is contained in:
2025-12-27 17:45:08 +01:00
parent 0ec10f765d
commit 19ad13843c
217 changed files with 5166 additions and 26 deletions

View File

@@ -39,6 +39,7 @@
#include "openthread/logging.h"
#include "openthread/tasklet.h"
#include "esp_http_client.h"
#include "mqtt_client.h"
#if CONFIG_OPENTHREAD_STATE_INDICATOR_ENABLE
#include "ot_led_strip.h"
@@ -151,11 +152,78 @@ static void ot_task_worker(void *aContext)
vTaskDelete(NULL);
}
static bool mqtt_connected = false;
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
esp_mqtt_event_handle_t event = event_data;
switch (event->event_id) {
case MQTT_EVENT_CONNECTED:
ESP_LOGI(TAG, "MQTT Connected");
mqtt_connected = true;
break;
case MQTT_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "MQTT Disconnected");
mqtt_connected = false;
break;
case MQTT_EVENT_PUBLISHED:
ESP_LOGI(TAG, "Message published, msg_id=%d", event->msg_id);
break;
case MQTT_EVENT_ERROR:
ESP_LOGE(TAG, "MQTT Error");
mqtt_connected = false;
break;
default:
break;
}
}
static esp_mqtt_client_handle_t client = NULL;
void mqtt_init(void)
{
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = "mqtt://192.168.15.119:1883",
.credentials = {
.username = NULL,
.client_id = NULL,
.set_null_client_id = true
},
.session.keepalive = 30,
.session.disable_clean_session = false,
};
client = esp_mqtt_client_init(&mqtt_cfg);
if (!client) {
ESP_LOGE(TAG, "Failed to init MQTT client");
return;
}
esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
ESP_LOGI(TAG, "Starting MQTT client...");
esp_mqtt_client_start(client);
}
void send_gps_data(const char *topic, const char *json)
{
if (!client || !json) return;
if (!mqtt_connected) {
ESP_LOGW(TAG, "MQTT not connected, skipping GPS publish");
return;
}
int msg_id = esp_mqtt_client_publish(client, topic, json, 0, 1, 0);
if (msg_id < 0) {
ESP_LOGE(TAG, "Failed to publish GPS");
} else {
ESP_LOGI(TAG, "Published GPS: msg_id=%d", msg_id);
}
}
#define GPS_UART_NUM UART_NUM_1
#define GPS_TX_PIN 4
#define GPS_RX_PIN 5
#define BUF_SIZE 1024
static uint8_t gps_buffer[BUF_SIZE];
void init_gps() {
const uart_config_t uart_config = {
@@ -206,14 +274,12 @@ char* gps_to_json(char* gps_data) {
}
}
// Créer le JSON avec des valeurs valides même si GPS pas fixé
snprintf(json, sizeof(json), "{\"data\":{\"latitude\":%.6f,\"longitude\":%.6f}}",
latitude, longitude);
return json;
}
char* read_gps() {
int len = uart_read_bytes(GPS_UART_NUM, gps_buffer, BUF_SIZE - 1, 100 / portTICK_PERIOD_MS);
if (len > 0) {
@@ -223,32 +289,16 @@ char* read_gps() {
return NULL;
}
void send_gps_data(const char* server_url, const char* json)
{
if (!json) return;
ESP_LOGI(TAG, "Sending JSON: %s", json);
esp_http_client_config_t config = { .url = server_url };
esp_http_client_handle_t client = esp_http_client_init(&config);
esp_http_client_set_method(client, HTTP_METHOD_POST);
esp_http_client_set_post_field(client, json, strlen(json));
esp_http_client_set_header(client, "Content-Type", "application/json");
esp_http_client_perform(client);
esp_http_client_cleanup(client);
}
void send_position_task(void *pvParameters)
{
const char* position_endpoint = "http://192.168.15.117:5000/devices/notify-position";
const char* gps_topic = "/board-mate/gps/notify";
while (1) {
char* json;
char* raw_data = read_gps();
if (raw_data) {
char* json = gps_to_json(raw_data);
send_gps_data(position_endpoint, json);
send_gps_data(gps_topic, json);
} else {
ESP_LOGI(TAG, "NO GPS DATA");
}
@@ -271,7 +321,8 @@ void app_main(void)
ESP_ERROR_CHECK(esp_event_loop_create_default());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config));
mqtt_init();
init_gps();
xTaskCreate(ot_task_worker, "ot_cli_main", 10240, xTaskGetCurrentTaskHandle(), 5, NULL);