#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define TCP_TIMEOUT_SEC 5 #define MQTT_RECONNECT_INTERVAL 30000 // FRAM Address for ESPMegaPROIoT // Starts from 34 // Ends at 300 (inclusive) // Total of 267 bytes #define IOT_FRAM_ADDRESS 34 struct NetworkConfig { IPAddress ip; IPAddress gateway; IPAddress subnet; IPAddress dns1; IPAddress dns2; char hostname[32]; bool useStaticIp; bool useWifi; bool wifiUseAuth; char ssid[32]; char password[32]; }; struct MqttConfig { char mqtt_server[32]; uint16_t mqtt_port; char mqtt_user[32]; char mqtt_password[32]; bool mqtt_useauth; char base_topic[32]; }; class ESPMegaIoT { public: ESPMegaIoT(); ~ESPMegaIoT(); void intr_begin(ExpansionCard *cards[]); void loop(); void registerCard(uint8_t card_id); void unregisterCard(uint8_t card_id); void publishCard(uint8_t card_id); // Publish topic appended with base topic void publishRelative(char *topic, char *payload); // Subscribe topic appended with base topic void subscribeRelative(char *topic); void subscribeToTopic(char *topic); void unsubscribeFromTopic(char *topic); void connectToWifi(char *ssid, char *password); void connectToWifi(char *ssid); void disconnectFromWifi(); bool wifiConnected(); void ethernetBegin(); void loadNetworkConfig(); void saveNetworkConfig(); NetworkConfig* getNetworkConfig(); MqttConfig* getMqttConfig(); void setMqttConfig(MqttConfig mqtt_config); void saveMqttConfig(); void loadMqttConfig(); void connectNetwork(); void setNetworkConfig(NetworkConfig network_config); void connectToMqtt(); bool connectToMqtt(char *client_id, char *mqtt_server, uint16_t mqtt_port, char *mqtt_user, char *mqtt_password); bool connectToMqtt(char *client_id, char *mqtt_server, uint16_t mqtt_port); bool mqttConnected(); void disconnectFromMqtt(); void publish(const char *topic, const char *payload); uint8_t registerMqttCallback(std::function callback); void unregisterMqttCallback(uint8_t handler); uint8_t registerRelativeMqttCallback(std::function callback); void unregisterRelativeMqttCallback(uint8_t handler); uint8_t registerSubscribeCallback(std::function callback); void unregisterSubscribeCallback(uint8_t handler); void setBaseTopic(char *base_topic); void bindEthernetInterface(ETHClass *ethernetIface); bool networkConnected(); void bindFRAM(FRAM *fram); IoTComponent* getComponent(uint8_t card_id); IPAddress getETHIp(); private: FRAM *fram; bool useWifi; bool WifiUseAuth; char ssid[32]; char password[32]; WiFiClient tcpClient; void sessionKeepAlive(); bool mqttReconnect(); void wifiReconnect(); void mqttSubscribe(); void mqttCallback(char *topic, byte *payload, unsigned int length); uint8_t mqtt_callbacks_handler_index; uint8_t mqtt_relative_callbacks_handler_index; uint8_t subscribe_callbacks_handler_index; std::map> mqtt_callbacks; std::map> mqtt_relative_callbacks; std::map> subscribe_callbacks; void publishRelative(uint8_t card_id, char *topic, char *payload); bool active; PubSubClient mqtt; IoTComponent *components[255]; char payload_buffer[200]; uint8_t base_topic_length; ExpansionCard **cards; // Points to card array in ESPMegaPRO Core // MQTT Connection Parameters bool mqtt_connected; NetworkConfig network_config; MqttConfig mqtt_config; ETHClass *ethernetIface; };