WHITE PAPER
The Most Trusted MQTT Platform for loV and Connected Cars →

Arduinoを使用したESP8266のMQTTブローカーへの接続

Dekun Tao
Mar 14, 2024
Arduinoを使用したESP8266のMQTTブローカーへの接続

MQTT は、IoTメッセージを交換し、データを配信するための軽量で柔軟なプロトコルです。IoT開発者のために、柔軟性とハードウェア/ネットワークリソースのバランスを実現することに専念しています。

ESP8266 は、高度に統合されたWi-Fi SoCソリューションを提供します。その低消費電力、コンパクトな設計、および高い安定性は、ユーザーの要件を満たすことができます。ESP8266には、独立して動作するか、または他のホストMCUのスレーブとして動作する完全かつ自己完結型のWi-Fiネットワーク機能があります。

このプロジェクトでは、Arduino IDEを使用してESP8266をプログラミングし、EMQX Cloudが運営・維持する無料の公開MQTTブローカーにESP8266を接続する方法を実装します。EMQX Cloudは、EMQが提供するセキュリティ付きMQTT IoTクラウドサービスプラットフォームです。一元化された運用保守代行と、ユニークな隔離環境を持つMQTT 5.0接続サービスを提供します。

必要なIoTコンポーネント

  • ESP8266
  • Arduino IDE
  • MQTTX: クロスプラットフォームMQTT 5.0クライアントツール
  • 無料の公開MQTTブローカー
    • ブローカー: broker.emqx.io
    • TCPポート: 1883
    • Websocketポート: 8083

ESP8266のPub/Sub

project.png

ソースコード

  1. まず、ライブラリESP8266WiFiPubSubClientをインポートします。ESP8266WiFiライブラリはESP8266をWi-Fiネットワークに接続し、PubSubClientライブラリはESP8266がMQTTブローカーにメッセージを公開し、トピックを購読することを可能にします。

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
  2. Wi-Fiの名前とパスワード、MQTTブローカーの接続アドレスとポートを設定します。

    // WiFi
    const char *ssid = "mousse"; // Enter your WiFi name
    const char *password = "qweqweqwe";  // Enter WiFi password
    
    // MQTT Broker
    const char *mqtt_broker = "broker.emqx.io";
    const char *topic = "esp8266/test";
    const char *mqtt_username = "emqx";
    const char *mqtt_password = "public";
    const int mqtt_port = 1883;
    
  3. プログラムの結果を出力し、Wi-Fiネットワークに接続するためのシリアル接続を開きます。

    // Set software serial baud to 115200;
    Serial.begin(115200);
    // connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi..");
    }
    
  4. MQTTブローカーを設定し、コールバック関数を書き、同時にシリアルモニターに接続情報を表示します。

    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp8266-client-";
        client_id += String(WiFi.macAddress());
        Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
        } else {
            Serial.print("failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    
    void callback(char *topic, byte *payload, unsigned int length) {
        Serial.print("Message arrived in topic: ");
        Serial.println(topic);
        Serial.print("Message:");
        for (int i = 0; i < length; i++) {
            Serial.print((char) payload[i]);
        }
        Serial.println();
        Serial.println("-----------------------");
    }
    
  5. MQTTブローカーに正常に接続した後、ESP8266はメッセージを公開し、MQTTブローカーを購読します。

    // Publish and subscribe
    client.publish(topic, "hello emqx");
    client.subscribe(topic);
    
  6. シリアルポートにトピック名を表示し、受信したメッセージの各バイトを出力します。

    void callback(char *topic, byte *payload, unsigned int length) {
        Serial.print("Message arrived in topic: ");
        Serial.println(topic);
        Serial.print("Message:");
        for (int i = 0; i < length; i++) {
            Serial.print((char) payload[i]);
        }
        Serial.println();
        Serial.println("-----------------------");
    }
    
  7. 完全なコード

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
    // WiFi
    const char *ssid = "mousse"; // Enter your WiFi name
    const char *password = "qweqweqwe";  // Enter WiFi password
    
    // MQTT Broker
    const char *mqtt_broker = "broker.emqx.io";
    const char *topic = "esp8266/test";
    const char *mqtt_username = "emqx";
    const char *mqtt_password = "public";
    const int mqtt_port = 1883;
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
    void setup() {
      // Set software serial baud to 115200;
      Serial.begin(115200);
      // connecting to a WiFi network
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
          delay(500);
          Serial.println("Connecting to WiFi..");
      }
      Serial.println("Connected to the WiFi network");
      //connecting to a mqtt broker
      client.setServer(mqtt_broker, mqtt_port);
      client.setCallback(callback);
      while (!client.connected()) {
          String client_id = "esp8266-client-";
          client_id += String(WiFi.macAddress());
          Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
          if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
              Serial.println("Public emqx mqtt broker connected");
          } else {
              Serial.print("failed with state ");
              Serial.print(client.state());
              delay(2000);
          }
      }
      // publish and subscribe
      client.publish(topic, "hello emqx");
      client.subscribe(topic);
    }
    
    void callback(char *topic, byte *payload, unsigned int length) {
      Serial.print("Message arrived in topic: ");
      Serial.println(topic);
      Serial.print("Message:");
      for (int i = 0; i < length; i++) {
          Serial.print((char) payload[i]);
      }
      Serial.println();
      Serial.println("-----------------------");
    }
    
    void loop() {
      client.loop();
    }
    

実行とテスト

  1. Arduino IDEを使用してESP8266に完全なコードをアップロードし、シリアルモニターを開いてください。

    esp_con.png

  2. MQTTXクライアントとMQTTブローカーとの接続を確立し、ESP8266にメッセージを送信します。

    mqttx_pub.png

  3. シリアルモニターでESP8266が受信したメッセージを確認します。

    esp_msg.png

まとめ

これまでに、EMQX Cloudが提供する無料の公開MQTTブローカーにESP8266を接続することに成功しました。このプロジェクトでは、ESP8266をMQTTブローカーに接続しましたが、ESP8266はさまざまなIoTセンサーに接続し、センサーデータをMQTTブローカーに報告することも可能です。

次に、EMQが提供するMQTTプロトコルに関する簡単なガイドシリーズの記事で、MQTTプロトコルの特徴について学び、MQTTのより高度なアプリケーションを探求し、MQTTアプリケーションおよびサービス開発を始めることができます。

無料トライアルEMQX Cloud
IoT向けフルマネージド型MQTTサービス
無料トライアル →

おすすめ閲読

Jun 30, 2023Dekun Tao
ESP32におけるMQTT活用入門ガイド

この記事はESP32をMQTTブローカーに接続し、メッセージをパブリッシュ/サブスクライブする手順について解説しています。また、TLSを利用した安全な接続についても説明しています。

Mar 15, 2024Dekun Tao
ESP8266とMQTTを使用してLEDを遠隔制御

このチュートリアルでは、ESP8266 Wi-FiモジュールとMQTTプロトコルを活用してLEDライトの遠隔制御を実現する方法について説明します。