From 8f18c13ab0699725b33d23abf23b099eaddee8d8 Mon Sep 17 00:00:00 2001 From: LailaTheElf Date: Tue, 2 Dec 2025 22:48:24 +0100 Subject: [PATCH] add MQTT --- libs/wiznet/CMakeLists.txt | 12 +++++- src/config.h | 9 +++++ src/main.cpp | 43 ++++++++++++++++++--- src/w5500_rp.cpp | 76 +++++++++++++++++++++++++++++++++++++- src/w5500_rp.h | 6 +++ 5 files changed, 138 insertions(+), 8 deletions(-) diff --git a/libs/wiznet/CMakeLists.txt b/libs/wiznet/CMakeLists.txt index 66e2c30..173f422 100644 --- a/libs/wiznet/CMakeLists.txt +++ b/libs/wiznet/CMakeLists.txt @@ -16,6 +16,16 @@ target_include_directories(wiznet_dhcp PUBLIC ./ioLibrary_Driver/Internet/DHCP) add_library(wiznet_mqtt ioLibrary_Driver/Internet/MQTT/MQTTClient.c ioLibrary_Driver/Internet/MQTT/mqtt_interface.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTConnectClient.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTConnectServer.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTDeserializePublish.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTFormat.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTPacket.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTSerializePublish.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTSubscribeClient.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTSubscribeServer.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTUnsubscribeClient.c + ioLibrary_Driver/Internet/MQTT/MQTTPacket/src/MQTTUnsubscribeServer.c ) target_link_libraries(wiznet_mqtt w5500_driver) -target_include_directories(wiznet_mqtt PUBLIC ./ioLibrary_Driver/Internet/DHCP) +target_include_directories(wiznet_mqtt PUBLIC ./ioLibrary_Driver/Internet/MQTT) diff --git a/src/config.h b/src/config.h index 4c1088d..0ff97c6 100644 --- a/src/config.h +++ b/src/config.h @@ -19,4 +19,13 @@ #define PIN_W5500_CS 29 #define W5500_SPI_DRIVER SPI_DRIVER +#define DHCP_SOCKET_ID 1 + +#define MQTT_SOCKET_ID 2 +#define MQTT_BROKER_IP {10, 1, 2, 2} // broker.hivemq.com +#define MQTT_BROKER_PORT 1883 +#define MQTT_CLIENT_ID "ELFTemp" +#define MQTT_USERNAME "tempsens" +#define MQTT_PASSWORD "" + #endif diff --git a/src/main.cpp b/src/main.cpp index 0d1858a..f7b7880 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "config.h" #include "max31856.h" @@ -88,19 +90,20 @@ int main() { .dhcp=NETINFO_DHCP }; wizchip_setnetinfo(&netinfo); - rgb_rainbow(); w5500_rp_dhcp(); - - rgb_rainbow(); + w5500_rp_mqtt_start(); absolute_time_t time_read_temp = make_timeout_time_ms(0); absolute_time_t time_read_ip = make_timeout_time_ms(10); absolute_time_t time_update_display = make_timeout_time_ms(20); absolute_time_t time_second = make_timeout_time_ms(0); + absolute_time_t time_msecond = make_timeout_time_ms(0); + absolute_time_t time_mqtt = make_timeout_time_ms(0); char cj_str[8] = {0, }; char tc_str[8] = {0, }; char ip[16] = {0, }; + char mqtt_status[20] = {0, }; while (true) { @@ -117,6 +120,19 @@ int main() { max31856_temp_t tc = max31856_get_tc_temp_c(&temp[0]); snprintf(&tc_str[0], 8, "%i.%02uC", tc.i, tc.f); + MQTTMessage msg = { + .qos = QOS2, + .retained = 0, + .dup = 0, + .id = 0, + .payload = &tc_str[0], + .payloadlen = strlen(&tc_str[0]) + }; + w5500_rp_mqtt_publish("/kees/tempprobe/tc", &msg); + msg.payload = &cj_str[0]; + msg.payloadlen = strlen(&cj_str[0]); + w5500_rp_mqtt_publish("/kees/tempprobe/cj", &msg); + // printf("CJ temp: %s\n", &cj_str[0]); // printf("TC temp: %s\n", &tc_str[0]); } @@ -152,6 +168,8 @@ int main() { display.println(&cj_str[0]); display.print("TC "); display.println(&tc_str[0]); + display.setTextSize(1); + display.println(&mqtt_status[0]); display.display(); } @@ -163,9 +181,22 @@ int main() { DHCP_time_handler(); } - if (time_max < -1000) { - sleep_us(-time_max); - } else if (time_max > 100) { + time = absolute_time_diff_us(time_msecond, get_absolute_time()); + time_max = MAX(time, time_max); + if (time >= 0) { + time_msecond = delayed_by_ms(time_msecond, 1); + MilliTimer_Handler(); + } + + time = absolute_time_diff_us(time_mqtt, get_absolute_time()); + time_max = MAX(time, time_max); + if (time >= 0) { + time_mqtt = delayed_by_ms(time_mqtt, 100); + w5500_rp_mqtt_run(); + snprintf(&mqtt_status[0], 20, "MQTT: %s", w5500_rp_mqtt_get_status()); + } + + if (time_max > 100) { printf("%llius\n", time_max); } } diff --git a/src/w5500_rp.cpp b/src/w5500_rp.cpp index 8681f74..639a36c 100644 --- a/src/w5500_rp.cpp +++ b/src/w5500_rp.cpp @@ -6,7 +6,9 @@ #include "hardware/spi.h" #include #include +#include #include +#include #include "config.h" #include "w5500_rp.h" @@ -62,6 +64,78 @@ void w5500_rp_dhcp_assigned() { } void w5500_rp_dhcp() { - DHCP_init(1, &dhcp_buffer[0]); + DHCP_init(DHCP_SOCKET_ID, &dhcp_buffer[0]); reg_dhcp_cbfunc(NULL, NULL, NULL); } + + +enum mqtt_state { + MQTT_INACTIVE, + MQTT_CONNECTING, + MQTT_CONNECTED, +} mqtt_state = MQTT_INACTIVE; +char mqtt_state_str_inactive[] = "inactive"; +char mqtt_state_str_connecting[] = "connecting"; +char mqtt_state_str_connected[] = "connected"; +char mqtt_state_str_invalid[] = "invlid"; +MQTTClient mqtt; +Network mqtt_net; +unsigned char mqtt_buff_send[1024]; +unsigned char mqtt_buff_read[1024]; + +void w5500_rp_mqtt_start() { + mqtt_state = MQTT_CONNECTING; +} +void w5500_rp_mqtt_init() { + mqtt_state = MQTT_CONNECTING; + NewNetwork(&mqtt_net, MQTT_SOCKET_ID); + unsigned char mqtt_broker_ip[] = MQTT_BROKER_IP; + int err = ConnectNetwork(&mqtt_net, &mqtt_broker_ip[0], MQTT_BROKER_PORT); + if (err == SOCK_ERROR) { + return; + } + MQTTClientInit(&mqtt, &mqtt_net, 300, &mqtt_buff_send[0], 1024, &mqtt_buff_read[0], 1024); + + + MQTTPacket_connectData mqtt_conndata = MQTTPacket_connectData_initializer; + mqtt_conndata.willFlag = 0; + mqtt_conndata.MQTTVersion = 3; + mqtt_conndata.clientID.cstring = MQTT_CLIENT_ID; + mqtt_conndata.username.cstring = MQTT_USERNAME; + mqtt_conndata.password.cstring = MQTT_PASSWORD; + mqtt_conndata.keepAliveInterval = 60; + mqtt_conndata.cleansession = 1; + if (MQTTConnect(&mqtt, &mqtt_conndata) == 0) { + mqtt_state = MQTT_CONNECTED; + } +} + +void w5500_rp_mqtt_run() { + switch (mqtt_state) { + case MQTT_INACTIVE: + return; + case MQTT_CONNECTING: + w5500_rp_mqtt_init(); + break; + case MQTT_CONNECTED: + MQTTYield(&mqtt, 5); + break; + } +} + +char* w5500_rp_mqtt_get_status() { + switch (mqtt_state) { + case MQTT_INACTIVE: + return &mqtt_state_str_inactive[0]; + case MQTT_CONNECTING: + return &mqtt_state_str_connecting[0]; + case MQTT_CONNECTED: + return &mqtt_state_str_connected[0]; + } + return &mqtt_state_str_invalid[0]; +} + +void w5500_rp_mqtt_publish(const char *topic, MQTTMessage *msg) { + MQTTPublish(&mqtt, topic, msg); +} + diff --git a/src/w5500_rp.h b/src/w5500_rp.h index 335504d..7af10c3 100644 --- a/src/w5500_rp.h +++ b/src/w5500_rp.h @@ -2,9 +2,15 @@ #define W5500_RP_H #include +#include void w5500_rp_init(); void w5500_rp_print_netinfo(wiz_NetInfo netinfo); void w5500_rp_dhcp(); +void w5500_rp_mqtt_run(); +char* w5500_rp_mqtt_get_status(); +void w5500_rp_mqtt_start(); +void w5500_rp_mqtt_publish(const char *topic, MQTTMessage *msg); + #endif