/* MQTT通信をするための拡張機能 PubSubClientを使います。
下記URLからダウンロードして、Ardino IDEの
スケッチ -> ライブラリをインクルード -> ライブラリを管理
からpubsubclientをインストールしてください。
https://www.arduino.cc/reference/en/libraries/pubsubclient/
*/
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi settings
const char* ssid = "iopworkshop20240612";
const char* password = "iopworkshop";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// 通信状態を確認するためにシリアルモニタを使います
Serial.begin(115200);
// Wi-Fiに接続します(下に関数が定義されています)
setup_wifi();
// MQTT Brokerを設定します
client.setServer("192.168.254.254", 1883); //IPアドレスとポート番号
}
void loop() {
// Wi-Fiの接続が切れている場合は再接続を試みます
if (!is_wifi_connected()) {
delay(1000);
return;
}
//------------------//
// --- MQTT通信 --- //
//------------------//
mqtt_publish_test("iopworkshop/test", "PromptK-Nakahira", "ありがとう");// トピック名、クライアントID、メッセージ を指定します
// クライアントID、メッセージは自由に指定してください
// ただし、クライアントIDが重複すると接続できません
// クライアントIDは23文字以内の半角英数字で指定します
// 10秒待機
delay(10000);
}
void setup_wifi() {
delay(10); // 接続を安定させるための遅延
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// WiFi接続が完了するまで待機
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
bool is_wifi_connected() {
// WiFi接続が切れている場合は再接続を試みます
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi Disconnected");
setup_wifi();
return false;
}
return true;
}
void mqtt_publish_test(char* topic, char* client_id, char* message) {
// MQTT ブローカーとの接続が切れている場合は0.1秒ごとに再接続を試みます
if (!client.connected()) {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// クライアントIDを決めて接続します
if (client.connect(client_id)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 0.1 seconds");
delay(100);
}
}
}
// "client_id > message" の形式でメッセージを送信することとします
String payload = String(client_id) + " > " + String(message);
// メッセージをパブリッシュ
Serial.print("Publishing message: ");
Serial.println(payload);
client.publish(topic, payload.c_str());
// HTTPがリクエスト-レスポンス型の通信プロトコルであるのに対し
// MQTTはパブリッシュ-サブスクライブ型の通信プロトコルです。
// リアルタイムな通信を行う際に適しています。
}