/* 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アドレスとポート番号
client.setCallback(callback); // コールバック=受信後に実行する処理
// LED用ピンの設定(0001_blinkのコードを参照してください)
pinMode(32, OUTPUT); // 32番ピンを出力に設定
}
void loop() {
// Wi-Fiの接続が切れている場合は何もせずに1秒待機します
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi Disconnected");
delay(1000);
return;
}
//------------------//
// --- MQTT通信 --- //
//------------------//
const char* topic = "iopworkshop/test";
const char* device_id = "PromptK-Nakahira-button";
mqtt_subscribe_test(topic, device_id); // トピック名を指定
}
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());
}
void mqtt_subscribe_test(const char* topic, const char* client_id) {
// MQTT ブローカーとの接続が切れている場合は5秒ごとに再接続を試みます
if (!client.connected()) {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// クライアントIDを決めて接続します
if (client.connect(client_id)) {
Serial.println("connected");
// トピックを指定してサブスクライブします
client.subscribe(topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
client.loop(); // MQTT通信の維持
// HTTPが非持続的な通信プロトコルであるのに対し
// MQTTは持続的な通信プロトコルです。
}
/** MQTT通信でメッセージ受信後の処理 */
void callback(char* topic, byte* payload, unsigned int length) {
// トピックと受信したメッセージをシリアルモニタに表示します
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// 0.1秒間LEDを点滅させます(デモ)
digitalWrite(32, HIGH); // LEDを点灯
delay(100); // 0.1秒待機
digitalWrite(32, LOW); // LEDを消灯
}