diff --git a/examples/arduino/w5500-mqtt/mongoose_custom.h b/examples/arduino/w5500-mqtt/mongoose_custom.h index 78b4ca57..46a59819 100644 --- a/examples/arduino/w5500-mqtt/mongoose_custom.h +++ b/examples/arduino/w5500-mqtt/mongoose_custom.h @@ -11,5 +11,5 @@ #define MG_ENABLE_SOCKET 0 #define MG_ENABLE_TCPIP 1 #define mkdir(a, b) (-1) -#define MG_IO_SIZE 128 +#define MG_IO_SIZE 512 //#define MG_ENABLE_LOG 0 diff --git a/examples/arduino/w5500-mqtt/net.c b/examples/arduino/w5500-mqtt/net.c new file mode 100644 index 00000000..07f90dd9 --- /dev/null +++ b/examples/arduino/w5500-mqtt/net.c @@ -0,0 +1,58 @@ +#include "net.h" + +#define MQTT_SERVER "mqtt://broker.hivemq.com:1883" +struct mg_connection *mqtt_connection; +const char *mqtt_subscribe_topic = "mg/rx"; +const char *mqtt_publish_topic = "mg/tx"; + +struct mg_mgr mgr; // Mongoose event manager +struct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}}; // network interface + +void mqtt_publish(const char *message) { + struct mg_mqtt_opts opts = {}; + opts.topic = mg_str(mqtt_publish_topic); + opts.message = mg_str(message); + if (mqtt_connection) mg_mqtt_pub(mqtt_connection, &opts); +} + +static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { + if (ev == MG_EV_MQTT_OPEN) { + MG_INFO(("%lu CONNECTED to %s", c->id, MQTT_SERVER)); + struct mg_mqtt_opts opts = {}; + opts.topic = mg_str(mqtt_subscribe_topic); + mg_mqtt_sub(c, &opts); + MG_INFO(("%lu SUBSCRIBED to %s", c->id, mqtt_subscribe_topic)); + } else if (ev == MG_EV_MQTT_MSG) { + // Received MQTT message + struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data; + MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len, + mm->data.ptr, (int) mm->topic.len, mm->topic.ptr)); + exec_command(mm->data.ptr, mm->data.len); + } else if (ev == MG_EV_CLOSE) { + MG_INFO(("%lu CLOSED", c->id)); + mqtt_connection = NULL; + } +} + +static void timer_fn(void *arg) { + struct mg_mgr *mgr = (struct mg_mgr *) arg; + struct mg_mqtt_opts opts; + memset(&opts, 0, sizeof(opts)); + opts.clean = true; + if (mif.state == MG_TCPIP_STATE_READY && mqtt_connection == NULL) { + mqtt_connection = mg_mqtt_connect(mgr, MQTT_SERVER, &opts, fn, NULL); + } + // MG_INFO(("Eth: %d, MQTT: %p", mif.state, mqtt_connection)); +} + +void net_init(void) { + // Set Mongoose logging function to a serial print + mg_mgr_init(&mgr); + + mif.driver = &mg_tcpip_driver_w5500; + mif.driver_data = &spi; + mg_tcpip_init(&mgr, &mif); + + // Start a timer that keeps MQTT connection alive + mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT, timer_fn, &mgr); +} diff --git a/examples/arduino/w5500-mqtt/net.h b/examples/arduino/w5500-mqtt/net.h new file mode 100644 index 00000000..3e6b696c --- /dev/null +++ b/examples/arduino/w5500-mqtt/net.h @@ -0,0 +1,16 @@ +#pragma once +#include "mongoose.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern struct mg_tcpip_spi spi; +extern struct mg_mgr mgr; +void mqtt_publish(const char *message); +void net_init(void); +void exec_command(const char *req, size_t req_len); + +#ifdef __cplusplus +} +#endif diff --git a/examples/arduino/w5500-mqtt/w5500-mqtt.ino b/examples/arduino/w5500-mqtt/w5500-mqtt.ino index 53feecd7..1b082ca8 100644 --- a/examples/arduino/w5500-mqtt/w5500-mqtt.ino +++ b/examples/arduino/w5500-mqtt/w5500-mqtt.ino @@ -1,29 +1,15 @@ #include -#include "mongoose.h" - -#define MQTT_SERVER "mqtt://broker.hivemq.com:1883" -struct mg_connection *mqtt_connection; -const char *mqtt_subscribe_topic = "mg/rx"; -const char *mqtt_publish_topic = "mg/tx"; +#include "net.h" #define SS_PIN 17 // Slave select pin -struct mg_mgr mgr; // Mongoose event manager struct mg_tcpip_spi spi = { NULL, // SPI data [](void *) { digitalWrite(SS_PIN, LOW); }, // Begin transaction [](void *) { digitalWrite(SS_PIN, HIGH); }, // End transaction [](void *, uint8_t c) { return SPI.transfer(c); }, // Execute transaction }; -struct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}}; // network interface -static void mqtt_publish(const char *message) { - struct mg_mqtt_opts opts = {}; - opts.topic = mg_str(mqtt_publish_topic); - opts.message = mg_str(message); - if (mqtt_connection) mg_mqtt_pub(mqtt_connection, &opts); -} - -static void exec_command(const char *req, size_t req_len) { +void exec_command(const char *req, size_t req_len) { char res[100]; if (req_len == 2 && strncmp(req, "on", req_len) == 0) { digitalWrite(LED_BUILTIN, true); @@ -50,52 +36,13 @@ static void process_input(char c) { } } -static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { - if (ev == MG_EV_MQTT_OPEN) { - MG_INFO(("%lu CONNECTED to %s", c->id, MQTT_SERVER)); - struct mg_mqtt_opts opts = {}; - opts.topic = mg_str(mqtt_subscribe_topic); - mg_mqtt_sub(c, &opts); - MG_INFO(("%lu SUBSCRIBED to %s", c->id, mqtt_subscribe_topic)); - } else if (ev == MG_EV_MQTT_MSG) { - // Received MQTT message - struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data; - MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len, - mm->data.ptr, (int) mm->topic.len, mm->topic.ptr)); - exec_command(mm->data.ptr, mm->data.len); - } else if (ev == MG_EV_CLOSE) { - MG_INFO(("%lu CLOSED", c->id)); - mqtt_connection = NULL; - } -} - -static void timer_fn(void *arg) { - struct mg_mgr *mgr = (struct mg_mgr *) arg; - struct mg_mqtt_opts opts; - memset(&opts, 0, sizeof(opts)); - opts.clean = true; - if (mif.state == MG_TCPIP_STATE_READY && mqtt_connection == NULL) { - mqtt_connection = mg_mqtt_connect(mgr, MQTT_SERVER, &opts, fn, NULL); - } - MG_INFO(("Eth: %d, MQTT: %p", mif.state, mqtt_connection)); -} - void setup() { Serial.begin(115200); SPI.begin(); pinMode(SS_PIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); - - // Set Mongoose logging function to a serial print mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL); - mg_mgr_init(&mgr); - - mif.driver = &mg_tcpip_driver_w5500; - mif.driver_data = &spi; - mg_tcpip_init(&mgr, &mif); - - // Start a timer that keeps MQTT connection alive - mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT, timer_fn, &mgr); + net_init(); } void loop() {