diff --git a/cube/Makefile b/cube/Makefile index d4bc746..675657a 100644 --- a/cube/Makefile +++ b/cube/Makefile @@ -37,7 +37,7 @@ BUILD_DIR = build ###################################### # C sources C_SOURCES = \ -User/Src/eeprom.c User/Src/frontend.c User/Src/logger.c User/Src/loopCtrl.c User/Src/main2.c User/Src/mbusComm.c User/Src/ringbuffer.c User/Src/show.c User/Src/utils.c User/Src/wizHelper.c hottislib/PontCoopScheduler.c \ +User/Src/mqttComm.c User/Src/ports.c User/Src/eeprom.c User/Src/frontend.c User/Src/logger.c User/Src/loopCtrl.c User/Src/main2.c User/Src/mbusComm.c User/Src/ringbuffer.c User/Src/show.c User/Src/utils.c User/Src/wizHelper.c hottislib/PontCoopScheduler.c \ libmbus/mbus/mbus-protocol.c \ Core/Src/main.c \ Core/Src/gpio.c \ @@ -125,6 +125,7 @@ C_INCLUDES = \ -IUser/Inc \ -IioLibrary_Driver/Ethernet \ -IioLibrary_Driver/Internet/DHCP \ +-IioLibrary_Driver/Internet/MQTT \ -ICore/Inc \ -IDrivers/STM32F1xx_HAL_Driver/Inc \ -IDrivers/STM32F1xx_HAL_Driver/Inc/Legacy \ diff --git a/cube/User/Inc/mqttComm.h b/cube/User/Inc/mqttComm.h new file mode 100644 index 0000000..39fee45 --- /dev/null +++ b/cube/User/Inc/mqttComm.h @@ -0,0 +1,9 @@ +#ifndef _MQTT_COMM_H_ +#define _MQTT_COMM_H_ + + +// do not call it periodically, just call it with a NULL handle +void mqttCommInit(void *handle); + + +#endif /* _MQTT_COMM_H_ */ diff --git a/cube/User/Src/main2.c b/cube/User/Src/main2.c index 8dfe19a..19de58a 100644 --- a/cube/User/Src/main2.c +++ b/cube/User/Src/main2.c @@ -18,6 +18,9 @@ #include #include +#include +#include + void my_setup_1() { schInit(); logInit(); @@ -190,6 +193,8 @@ void my_setup_2() { wizInit(); + mqttCommInit(NULL); + // frontendInit(); // frontendSetThreshold(240); @@ -205,7 +210,11 @@ void my_loop() { } void SYSTICK_Callback() { + // Pont Scheduler schUpdate(); + + // MQTT Interface + MilliTimer_Handler() } void HAL_GPIO_EXTI_Callback(uint16_t pin) { diff --git a/cube/User/Src/mqttComm.c b/cube/User/Src/mqttComm.c new file mode 100644 index 0000000..2f663f0 --- /dev/null +++ b/cube/User/Src/mqttComm.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include + +#include + +#include +#include + + + +#define RX_BUFFER_SIZE 2048 +static uint8_t rxBuffer[RX_BUFFER_SIZE]; + +#define TX_BUFFER_SIZE 128 +static uint8_t txBuffer[TX_BUFFER_SIZE]; + +extern const uint8_t MQTT_SOCK; + + + +static uint8_t targetIP[4] = { 172, 16, 2, 16 }; +static uint16_t targetPort = 1883; + +struct opts_struct +{ + char* clientid; + int nodelimiter; + char* delimiter; + enum QoS qos; + char* username; + char* password; + char* host; + int port; + int showtopics; +} opts ={ (char*)"stdout-subscriber", 0, (char*)"\n", QOS0, NULL, NULL, targetIP, targetPort, 0 }; + +MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + +MQTTClient mqttClient; + + +static void messageArrived(MessageData* md) +{ + unsigned char testbuffer[100]; + MQTTMessage* message = md->message; + + if (opts.showtopics) + { + memcpy(testbuffer,(char*)message->payload,(int)message->payloadlen); + *(testbuffer + (int)message->payloadlen + 1) = "\n"; + logMsg("%s\r\n",testbuffer); + } + + if (opts.nodelimiter) + logMsg("%.*s", (int)message->payloadlen, (char*)message->payload); + else + logMsg("%.*s%s", (int)message->payloadlen, (char*)message->payload, opts.delimiter); +} + +static void mqttHandler(void *handle) { + MQTTYield(&mqttClient, data.keepAliveInterval); +} + +void mqttCommInit(void *handle) { + if (! isNetworkAvailable()) { + coloredMsg(LOG_RED, "mqci, can not start mqtt yet, network unavailable, try again in a second"); + schAdd(mqttCommInit, NULL, 1000, 0); + } else { + coloredMsg(LOG_RED, "mqci, starting mqtt"); + + Network n; + + NewNetwork(&n, MQTT_SOCK); + ConnectNetwork(&n, targetIP, targetPort); + MQTTClientInit(&mqttClient, &n, 1000, txBuffer, TX_BUFFER_SIZE, rxBuffer, RX_BUFFER_SIZE); + + data.willFlag = 0; + data.MQTTVersion = 3; + data.clientID.cstring = opts.clientid; + data.username.cstring = opts.username; + data.password.cstring = opts.password; + + data.keepAliveInterval = 60; + data.cleansession = 1; + + int rc = MQTTConnect(&mqttClient, &data); + printf("Connected %d\r\n", rc); + + opts.showtopics = 1; + + printf("Subscribing to %s\r\n", "hello/wiznet"); + rc = MQTTSubscribe(&mqttClient, "hello/wiznet", opts.qos, messageArrived); + printf("Subscribed %d\r\n", rc); + + schAdd(mqttHandler, NULL, 0, 10); + } +} \ No newline at end of file diff --git a/cube/User/Src/ports.c b/cube/User/Src/ports.c new file mode 100644 index 0000000..7787c4a --- /dev/null +++ b/cube/User/Src/ports.c @@ -0,0 +1,8 @@ +#include + + + +// on the W5500 there are eight ports available + +const uint8_t DHCP_SOCK = 0; +const uint8_t MQTT_SOCK = 1; \ No newline at end of file diff --git a/cube/User/Src/wizHelper.c b/cube/User/Src/wizHelper.c index 02c2999..11b8fa6 100644 --- a/cube/User/Src/wizHelper.c +++ b/cube/User/Src/wizHelper.c @@ -20,7 +20,7 @@ wiz_NetInfo netInfo = { #define DHCP_BUFFER_SIZE 2048 static uint8_t dhcpBuffer[DHCP_BUFFER_SIZE]; -const uint8_t DHCP_SOCK = 0; +extern const uint8_t DHCP_SOCK; static bool networkAvailable = false; @@ -75,7 +75,7 @@ static void wizDHCPAssign() { coloredMsg(LOG_GREEN, "wizda, DNS: %d.%d.%d.%d", netInfo.dns[0], netInfo.dns[1], netInfo.dns[2], netInfo.dns[3]); wizchip_setnetinfo(&netInfo); - coloredMsg(LOG_RED, "wizda, set netinfo again"); + coloredMsg(LOG_GREEN, "wizda, set netinfo again"); networkAvailable = true; coloredMsg(LOG_GREEN, "wizda, network is available");