#include "MyMQTT.h" #include #include "hardware.h" #include "shelf.h" #include "wifi.h" using namespace std; extern Shelf* shelf; extern Wifi wifi; MyMQTT::MyMQTT(void) : host {mqtt_server}, port {mqtt_port}, username {mqtt_username}, password {mqtt_password} {} extern "C" { static void onMqttMessageWrapper(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { // static_cast(parm)->onMqttMessage(NULL); Serial.println("test"); mqtt_ptr->onMqttMessage(topic, payload, properties, len, index, total); } static void onMqttSubscribe(uint16_t packetId, uint8_t qos) { Serial.println("subscribe ack"); } } void MyMQTT::onMqttConnectWrapper(bool sessionPresent) { // static_cast(parm)->onMqttConnect(NULL); mqtt_ptr->onMqttConnect(sessionPresent); } void MyMQTT::onMqttDisconnectWrapper(AsyncMqttClientDisconnectReason reason) { // static_cast(parm)->onMqttConnect(NULL); mqtt_ptr->onMqttDisconnect(reason); } void MyMQTT::reconnectTask(void* parameters) { while (!wifi.connected()) { Serial.print("."); vTaskDelay(1000 / portTICK_PERIOD_MS); } Serial.println("MQTT reconnecting!"); this->connect(); vTaskDelete(NULL); } void MyMQTT::cTaskWrapper(void* parameters) { static_cast(parameters)->reconnectTask(NULL); } void MyMQTT::onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { Serial.print("incoming: "); Serial.println(topic); Serial.println(payload); if (String(payload).equals("{'num':'0'}")) { shelf->dispense(0); } else if (String(payload).equals("{'num':'1'}")) { shelf->dispense(1); } else if (String(payload).equals("{'num':'2'}")) { shelf->dispense(2); } else if (String(payload).equals("{'num':'3'}")) { shelf->dispense(3); } else if (String(payload).equals("{'num':'4'}")) { shelf->dispense(4); } else if (String(payload).equals("{'num':'5'}")) { shelf->dispense(5); } else if (String(payload).equals("{'num':'6'}")) { shelf->dispense(6); } } void MyMQTT::onMqttConnect(bool sessionPresent) { Serial.println("CONNECTED! callback works"); subscribe(); } void MyMQTT::onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { Serial.println("Disconnected from MQTT."); xTaskCreate( &cTaskWrapper, /* Task function. */ "mqttReconnectTask", /* String with name of task. */ 1024, /* Stack size in words. */ this, /* Parameter passed as input of the task */ 1, /* Priority of the task. */ &mqttTaskHandle); /* Task handle. */ } void MyMQTT::connect(void) { mqtt_ptr = this; Serial.print("MQTT connecting"); mqttClient.onConnect(&onMqttConnectWrapper); mqttClient.onDisconnect(&onMqttDisconnectWrapper); mqttClient.onSubscribe(&onMqttSubscribe); mqttClient.onMessage(&onMqttMessageWrapper); mqttClient.setServer(host, port); mqttClient.setCredentials(username, password); mqttClient.setKeepAlive(60); //#if ASYNC_TCP_SSL_ENABLED // mqttClient.setSecure(true); //#endif mqttClient.connect(); while(!mqttClient.connected()) { Serial.print("."); delay(500); } Serial.println("MQTT connected"); } bool MyMQTT::connected(void) { return mqttClient.connected(); } void MyMQTT::subscribe(void) { uint16_t dispenseIdSub = mqttClient.subscribe("sensor/vendingmachine/dispense", 0); mqttClient.publish("sensor/vendingmachine/alive", 0, true, "test"); } void MyMQTT::publish(char* topic, char* payload) { } void MyMQTT::publish(char* topic, String payload) { }