Bonjour, j'ai un petit problème qui dure depuis un gros moment et cela est un peu pesant depuis. Je suis entrain de réaliser une connexion avec un serveur MQTT entre une carte ESP8266 ainsi qu'une machine virtuelle sur Oracle Virtualbox dont la connexion Mosquitto fonctionne. Ce qui ne marche pas, c'est le code Arduino qui me sort l'erreur suivante :
-> Attempting MQTT broker connection...Failed, rc=-2. Trying again in 5 seconds...
J'ai vérifié les pare-feu, ils sont désactivés. J'ai vérifié si le certificat auto-signé que j'ai généré par la machine virtuelle fonctionne, aussi. C'est au lancement du programme que j'obtiens l'erreur suivante sur Arduino mais le message d'erreur "Protocol Error" sur la machine virtuelle.
Voici le code en question :
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#define ESP8266_LED (5)
#define RELAY_SIGNAL_PIN (16)
#define SERIAL_DEBUG
#define TLS_DEBUG
#define MQTT_HOST "172.16.8.75"
/* Certificate Authority info */
/* CA Cert in PEM format */
const char caCert[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIEJzCCAw+gAwIBAgIUWx+9w9kdY7yvz9+ZyN2ck4166EQwDQYJKoZIhvcNAQEL
BQAwgaExCzAJBgNVBAYTAkZSMRIwEAYDVQQIDAlPY2NpdGFuaWUxETAPBgNVBAcM
CE7Dg8KubWVzMRMwEQYDVQQKDApMR1QgREhVT0RBMQ4wDAYDVQQLDAVTTklSMjEY
MBYGA1UEAwwPQ29yZW50aW4gRVlET1VYMSwwKgYJKoZIhvcNAQkBFh1jZS4wMzAw
MDI2ckBhYy1tb250cGVsbGllci5mcjAgFw0yNDAzMjExNDU5MzNaGA8yMTIxMTIy
NzE0NTkzM1owgaExCzAJBgNVBAYTAkZSMRIwEAYDVQQIDAlPY2NpdGFuaWUxETAP
BgNVBAcMCE7Dg8KubWVzMRMwEQYDVQQKDApMR1QgREhVT0RBMQ4wDAYDVQQLDAVT
TklSMjEYMBYGA1UEAwwPQ29yZW50aW4gRVlET1VYMSwwKgYJKoZIhvcNAQkBFh1j
ZS4wMzAwMDI2ckBhYy1tb250cGVsbGllci5mcjCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAM74Yd9nbsidvTXVS45aGxoHNEnvEdFNeq2tm1pb1EQM7u3B
IjfbyCS8An5A8plAk7QOtbvjkgEjJkOKp2ptnNBh+zvosMReKPk2aksMTNKZ9hw8
GurVfpHScIVQO+4aADp9Wy1GS9nqASQGECFt5KA2cy5yf0BugrmIGezGMMqFNcMn
nm9bDRHLRQ7q1NJ45QWAqoPExDtb1K509coQT8rxbCUEoT3NnEM4h8hLzqPAV/pN
hbJzFfhRl6+NeKU0mnRF7aSPhidB+ZJl2JpM+RcXaewkhJ/48w6UvpBlW3PlF2oG
qjy3BhO05gRpNYhYsw9PvOLsfOV2R/qIlggFi7ECAwEAAaNTMFEwHQYDVR0OBBYE
FFqHx85uzig239j9gn60Eyy/uOpTMB8GA1UdIwQYMBaAFFqHx85uzig239j9gn60
Eyy/uOpTMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBADVhWhd9
/4KdDyzwDHiqVtnZDfFVg/47PBR6Ty/UOjnJEdkT7EwOx9UKPHsPxxJ3u7rIm8+6
rvDZWgWC15qXpRf+OrQ/oaUDIHGh4MFeuaXmtTItgwyVeDKNBzmUiT1uz5NpR42s
va4VIwObIBE/fNp+8/wkG8HaWG9nE2RaGlvBeqW8h2IHWjvwIiEGPbMKT3cPZKyp
5e5HICyBTau3bYmqZQSFOQvJnIh8OhzUSvk7akSQ38VKz3NrDs6oxRDGNzvd87Ch
9x24MspI7gl4W77OckwzHm+CDc4n2C2APdN5K8LyFMbNhS1JyzzkfeeukEtn6hjx
iZPwzneejdyB7+o=
-----END CERTIFICATE-----
)EOF";
/* MQTT broker cert SHA1 fingerprint, used to validate connection to right server D9:58:E2:20:BC:12:C4:4D:ED:0F:9E:CC:73:83:8B:31:1B:0B:47:9A*/
const uint8_t mqttCertFingerprint[] = {0x5D, 0x1E, 0x0C, 0xED, 0xA7, 0x6B, 0x51, 0x59, 0x5D, 0x0B, 0x79, 0x7A, 0xD6, 0x02, 0x1F, 0xC0, 0x88, 0x4E, 0xE5, 0x60};
X509List caCertX509(caCert);
WiFiClientSecure espClient;
PubSubClient mqttClient(espClient);
Adafruit_MQTT_Client mqtt(&espClient, "172.16.8.75", 8918, "pi", "raspberry");
char clientId[32] = "ESP8266Client-";
int compteur = 0;
#ifdef TLS_DEBUG
bool verifytls() {
bool success = false;
#ifdef SERIAL_DEBUG
// WiFi.ping();
Serial.print("Verifying TLS connection to ");
Serial.println("172.16.8.75");
#endif
success = espClient.connect("172.16.8.75", 8918);
#ifdef SERIAL_DEBUG
if (success) {
Serial.println("Connection complete, valid cert, valid fingerprint.");
} else {
Serial.println("Connection failed!");
}
#endif
return success;
}
#endif
void reconnect() {
while (!mqttClient.connected()) {
#ifdef SERIAL_DEBUG
Serial.print("Attempting MQTT broker connection...");
#endif
if (mqttClient.connect(clientId)) {
#ifdef SERIAL_DEBUG
Serial.println("connected");
#endif
mqttClient.subscribe("Commande");
} else {
#ifdef SERIAL_DEBUG
Serial.print("Failed, rc=");
Serial.print(mqttClient.state());
Serial.println(". Trying again in 5 seconds...");
#endif
delay(5000);
}
}
}
void setup() {
pinMode(RELAY_SIGNAL_PIN, OUTPUT);
pinMode(ESP8266_LED, OUTPUT);
#ifdef SERIAL_DEBUG
Serial.setDebugOutput(true);
Serial.begin(115200);
Serial.println();
#endif
WiFi.mode(WIFI_STA);
WiFi.begin("projetCC", "ProjetConciergeConnecte2024");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
#ifdef SERIAL_DEBUG
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
#endif
espClient.setTrustAnchors(&caCertX509);
espClient.allowSelfSignedCerts();
espClient.setFingerprint(mqttCertFingerprint);
#ifdef TLS_DEBUG
verifytls();
#endif
mqttClient.setServer("172.16.8.75", 8918);
mqttClient.setCallback(subCallback);
sprintf(clientId + strlen(clientId), "%X", random(0xffff));
}
void loop() {
if (!mqttClient.connected()) {
reconnect();
}
if (compteur > 100000) {
mqttClient.publish("Test", "OK");
compteur = 0;
}
compteur++;
mqttClient.loop();
}
void subCallback(char *topic, byte *payload, unsigned int length) {
static int pinStatus = LOW;
StaticJsonDocument<256> doc;
deserializeJson(doc, (char *)payload);
JsonObject root = doc.as<JsonObject>();
#ifdef SERIAL_DEBUG
serializeJson(root, Serial);
Serial.println();
#endif
Serial.printf("Topic:%s,%s\n", topic, (char *)payload);
if (!root["set"].isNull()) {
if (root["set"] == "toggle") {
pinStatus = !pinStatus;
} else if (root["set"] == "on") {
pinStatus = HIGH;
} else if (root["set"] == "off") {
pinStatus = LOW;
} else {
return;
}
digitalWrite(RELAY_SIGNAL_PIN, pinStatus);
mqttClient.publish("Test", pinStatus == LOW ? "off" : "on");
} else if (!root["get"].isNull()) {
if (root["get"] == "status") {
mqttClient.publish("Test", pinStatus == LOW ? "off" : "on");
}
}
}
Je ne vois pas vraiment l'erreur que ça peut être car j'ai recherché énormément sur Internet et cela ne corrige pas mon problème. Cela serait à cause du certificat auto-signé en lui même ? (Qui après vérification fonctionne).