インターネット経由でマイコンやPC等と連携したい場合、Blynkサービスを利用する事が多いが、MQTTも利用できる。
インターネット上にフリーで使えるMQTTサーバーがあるのでこれらを利用すれば遠く離れたマイコン同士を簡単に通信させる事も可能だ。
利用できるサーバーは下記サイトの情報が参考になる。
ESP32からMQTTを利用するには、PubSubClientライブラリが簡単に使える。今回はライブラリの使い方説明は省略。下記サイトを参考に。
https://www.denshi.club/cookbook/arduino/esp32/esp321-esp327mqtt.html
フリーの test.mosquitto.org を使う場合、最小構成のスケッチは下記の通り。
//参考
//https://www.denshi.club/cookbook/arduino/esp32/esp321-esp327mqtt.html
#include <PubSubClient.h>
#include <WiFi.h>
char ssid[] = "YourNetworkName"; //WiFiのSSID
char pass[] = "YourPassword"; //WiFiのパスワード
const char* mqtt_server = "test.mosquitto.org";
const char* mqtt_topic = "ESP32/TEST/TOPIC";
WiFiClient mqttClient;
PubSubClient client(mqttClient);
char mqtt_clientid[32];
void callback(char* topic, byte* payload, unsigned int length) {
char payload_ch[32];
int chlen = min(31, (int)length);
memcpy(payload_ch, payload, chlen);
payload_ch[chlen] = 0;
Serial.println(payload_ch);
}
void wait_mqtt() {
if (!client.connected()) {
Serial.print("Waiting MQTT connection...");
while (!client.connected()) { // 非接続のあいだ繰り返す
if (client.connect(mqtt_clientid)) {
client.subscribe(mqtt_topic);
} else {
delay(2000);
}
}
Serial.println("connected");
}
}
void setup() {
Serial.begin(115200);
Serial.print("connecting wifi");
WiFi.mode(WIFI_STA);
if (String(WiFi.SSID()) != String(ssid)) {
WiFi.begin(ssid, pass);
}
WiFi.setSleep(false);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("connected");
byte mac_addr[6];
WiFi.macAddress(mac_addr);
sprintf(mqtt_clientid, "ESP32CLI_%02x%02x%02x%02x%02x%02x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
wait_mqtt();
client.loop();
//client.publish(mqtt_topic, "test publish"); //送信はこう
}
Client IDはユニークである必要があるので、MACアドレスを元に生成する様にしている。
当初複数のESP32で同じクライアントIDにしていたため、2台目を接続しようとした際にMQTTの接続と切断を延々と繰り返し、原因が分かるまでしばらくかかってしまった。