Arduinoの基礎 - MQTT

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2024年11月16日 (土) 06:07時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == 必要な構成 == * ハードウェア ** Arduino UNO R4 WiFi *: <br> * ソフトウェア ** Arduino IDE 2.0以降 ** Arduino_ConnectionHandlerライブラリ ** ArduinoMqttClientライブラリ ** WiFiS3ライブラリ <br><br> == MQTT通信 == Arduino R4 WiFiを使用して、MQTT通信でトピックの送受信を行っている。<br> <br> * Wi-Fiへの接続 *: SSIDとパスワードを使用して、Wi-Fiネットワークに接…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要



必要な構成

  • ハードウェア
    • Arduino UNO R4 WiFi

  • ソフトウェア
    • Arduino IDE 2.0以降
    • Arduino_ConnectionHandlerライブラリ
    • ArduinoMqttClientライブラリ
    • WiFiS3ライブラリ



MQTT通信

Arduino R4 WiFiを使用して、MQTT通信でトピックの送受信を行っている。

  • Wi-Fiへの接続
    SSIDとパスワードを使用して、Wi-Fiネットワークに接続する。
    接続状態をシリアルモニタに表示する。
  • MQTTブローカーへの接続
    指定されたMQTTブローカーとポートに接続する。
  • トピックの送信
    5秒ごとにカウンター値をMQTTトピックに送信する。
    送信内容はシリアルモニタにも表示する。
  • トピックの受信
    購読しているトピックからメッセージを受信した場合に表示する。
    また、メッセージの内容をシリアルモニタに出力する。


送信 (MQTTパブリッシャー側)

以下の例では、5秒ごとにカウンタの値を送信 (パブリッシュ) している。

 #include <WiFiS3.h>
 #include <ArduinoMqttClient.h>
 
 // Wi-Fi設定
 const char ssid[] = "<Wi-FiのSSID>"
 const char pass[] = "<WiFiのパスワード>"
 
 // MQTTブローカーの設定
 const char mqtt_broker[] = "<MQTTブローカーのアドレス  例: test.mosquitto.org>";
 const int  mqtt_port     = 1883;              // MQTTのポート番号
 const char mqtt_topic[]  = "arduino/sensor";  // 投稿するトピック
 
 WiFiClient wifiClient;
 MqttClient mqttClient(wifiClient);
 
 void setup()
 {
    Serial.begin(9600);
    while (!Serial);  // シリアルポートの準備待ち
 
    // Wi-Fi接続
    Serial.print("Connecting to WiFi");
    WiFi.begin(ssid, pass);
 
    while (WiFi.status() != WL_CONNECTED) {
       Serial.print(".");
       delay(500);
    }
 
    Serial.println("\nConnected to WiFi");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
 
    // MQTTブローカーへの接続
    Serial.print("Connecting to MQTT broker...");
    if (!mqttClient.connect(mqtt_broker, mqtt_port)) {
       Serial.print("MQTT connection failed! Error code = ");
       Serial.println(mqttClient.connectError());
 
       while (1);
    }
 
    Serial.println("Connected to MQTT broker!");
 }
 
 void loop()
 {
    // MQTT接続の維持
    mqttClient.poll();
 
    // 5秒ごとにメッセージを送信
    static unsigned long previousMillis = 0;
    unsigned long currentMillis = millis();
 
    if (currentMillis - previousMillis >= 5000) {
       previousMillis = currentMillis;
 
       // サンプルデータの作成(ここでは単純なカウンター)
       static int counter = 0;
       String message = "Count: " + String(counter++);
 
       // メッセージの送信
       Serial.print("Sending message: ");
       Serial.println(message);
       mqttClient.beginMessage(mqtt_topic);
       mqttClient.print(message);
       mqttClient.endMessage();
    }
 }


受信 (サブスクライバ側)

以下の例では、受信したトピックの購読 (サブスクライブ) している。

 #include <WiFiS3.h>
 #include <ArduinoMqttClient.h>
 
 // Wi-Fi設定
 const char ssid[] = "<Wi-FiのSSID>"
 const char pass[] = "<WiFiのパスワード>"
 
 // MQTTブローカーの設定
 const char mqtt_broker[] = "<MQTTブローカーのアドレス  例: test.mosquitto.org>";
 const int  mqtt_port     = 1883;              // MQTTのポート番号
 const char mqtt_topic[]  = "arduino/sensor";  // 投稿するトピック
 
 WiFiClient wifiClient;
 MqttClient mqttClient(wifiClient);
 
 void setup()
 {
    Serial.begin(9600);
    while (!Serial);  // シリアルポートの準備待ち
 
    // Wi-Fi接続
    Serial.print("Connecting to WiFi");
    WiFi.begin(ssid, pass);
 
    while (WiFi.status() != WL_CONNECTED) {
       Serial.print(".");
       delay(500);
    }
 
    Serial.println("\nConnected to WiFi");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
 
    // MQTTブローカーへの接続
    Serial.print("Connecting to MQTT broker...");
    if (!mqttClient.connect(mqtt_broker, mqtt_port)) {
       Serial.print("MQTT connection failed! Error code = ");
       Serial.println(mqttClient.connectError());
 
       while (1);
    }
 
    Serial.println("Connected to MQTT broker!");
 
    // トピックの購読 (サブスクライブ)
    Serial.print("Subscribing to topic: ");
    Serial.println(mqtt_topic);
 
    mqttClient.subscribe(mqtt_topic);
 }
 
 void loop()
 {
    // MQTT接続の維持
    mqttClient.poll();
 
    // 受信したメッセージの処理
    int messageSize = mqttClient.parseMessage();
    if (messageSize) {
       Serial.print("Received a message with topic '");
       Serial.print(mqttClient.messageTopic());
       Serial.print("', length ");
       Serial.print(messageSize);
       Serial.println(" bytes:");
 
       // メッセージの内容を読み取って表示
       while (mqttClient.available()) {
          Serial.print((char)mqttClient.read());
       }
 
       Serial.println();
    }
 }