#include #include #include #include "identifiants.h" #include "ModbusMaster.h" ModbusMaster node; //identifiants const char* ssid = MY_SSID; const char* password = MY_PASS; //adresse du broker MQTT cloud et son port (8883 car protocole SSL) const char* mqttServer = "f63f940361134f62957ef137f9d2e29f.s1.eu.hivemq.cloud"; const int mqttPort = 8883; //identifiants du broker MQTT cloud pour s'authentifier const char* mqttUser = MQTT_USER; const char* mqttPassword = MQTT_PASSWORD; unsigned long previousMillis = 0; const long interval = 5000; uint8_t result; int messageMQTT; uint8_t coil_value; WiFiClientSecure wifiClient; PubSubClient mqttClient(wifiClient); String messageToPublish; // Certificat CA du serveur MQTT obligatoire pour authentifier l'appareil qui se connecte const char* caCert = \ "-----BEGIN CERTIFICATE-----\n" \ "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\n" \ "-----END CERTIFICATE-----\n"; void setup() { Serial.begin(115200); //port série activé WiFi.begin(ssid, password); //connexion au WiFi while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); //connexion au broker MQTT mqttClient.setServer(mqttServer, mqttPort); mqttClient.setCallback(callback); // Chargement du certificat CA du serveur MQTT wifiClient.setCACert(caCert); while (!mqttClient.connected()) { Serial.println("Connecting to MQTT server..."); if (mqttClient.connect("ESP32Client", mqttUser, mqttPassword)) { Serial.println("Connected to MQTT server"); mqttClient.subscribe("topic/hello"); } else { Serial.print("Failed to connect to MQTT server, rc="); Serial.print(mqttClient.state()); Serial.println(" Retrying in 5 seconds..."); delay(5000); } } Serial.print("\r\n*****************PRET!*******************"); Serial2.begin(9600, SERIAL_8N1); //communication modbus à 9600 bauds node.begin(1, Serial2); //ID node 1 } void loop() { mqttClient.loop(); if (!mqttClient.connected()) { reconnect(); } //Le port série permet de publier des messages sur le topic "topic/hello" if (Serial.available()){ Serial.println(); messageToPublish = Serial.readString(); mqttClient.publish("topic/hello",messageToPublish.c_str()); } } // Fonction pour se reconnecter au serveur MQTT en cas de problème void reconnect() { while (!mqttClient.connected()) { Serial.println("Connecting to MQTT server..."); if (mqttClient.connect("ESP32Client", mqttUser, mqttPassword)) { Serial.println("Connected to MQTT server"); } else { Serial.print("Failed to connect to MQTT server, rc="); Serial.print(mqttClient.state()); Serial.println(" Retrying in 5 seconds..."); delay(5000); } } } void callback(char* topic, byte* payload, unsigned int length) { // Fonction de rappel pour la réception des messages MQTT Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } char messageBuffer[length + 1]; memcpy(messageBuffer, payload, length); messageBuffer[length] = '\0'; // Ajouter le caractère de fin de chaîne //messageMQTT = 0; //Clear messsage messageMQTT = atoi((char*)messageBuffer); //convertir le Serial.print("message MQTT:"); Serial.println(messageMQTT); if(messageMQTT < 32767){ static uint16_t coil_values[10] = {0b0000000100100011, 0b0001001010000011, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,0x0001,0x0001}; for (int i = 0; i < 10; i++) { node.setTransmitBuffer(i, coil_values[i]); } //for(int j = 0; j < 20; j++){ result = node.writeMultipleCoils(0,40); // write coil registers to true if (result == node.ku8MBSuccess) { Serial.printf("\r\nSucces"); } else { Serial.printf("\r\nFail"); } //} } else Serial.println("number is too big"); //Serial.println(); }