7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32でのMQTT入門ガイド

Posted at

ESP32でのMQTT入門ガイド

目次

はじめに

MQTTは、パブリッシュ/サブスクライブモデルに基づくIoT向けの軽量メッセージングプロトコルであり、最小限のコードと帯域幅のオーバーヘッドで信頼性の高いリアルタイム通信を実現します。 リソースが制限されたデバイスと低帯域幅ネットワークに最適化されているため、IoT、モバイルインターネット、IoV、電力業界で広く採用されています。

ESP32は、ESP8266のアップグレードバージョンで、低コストかつ低消費電力のSoCマイコンです。 Wi-Fiモジュールに加えて、ESP32にはBluetooth 4.0モジュールも含まれます。 デュアルコアCPUの動作周波数は80~240MHzです。 2つのWi-FiとBluetoothモジュール、およびさまざまな入力と出力ピンが含まれています。 ESP32はIoTプロジェクトに理想的です。

ESP32でMQTTを使用すると、次のようなメリットがあります。

  • 第一に、MQTTはESP32やWi-Fiのような制約のあるデバイスとネットワークに最適化された軽量メッセージングプロトコルなので、消費電力と帯域幅への影響が最小限です。
  • 第二に、MQTTはESP32の機能に合わせて、さまざまな信頼性とサービス品質のレベルをサポートしています。 このフレキシビリティにより、ネットワークが不安定な場合でも使用できます。
  • 第三に、ESP32とMQTTはIoTアプリケーションで広く使用されているため、IoTソリューションにうまく統合できます。 MQTTプロトコルは、ネットワーク全体でのデバイス制御とデータモニタリングを可能にするために、クラウドプラットフォームとの統合を簡素化するように設計されています。

全体として、ESP32とMQTTの組み合わせは、無線接続と多数のデバイス間での効率的なメッセージングを必要とするIoTアプリケーションに最適です。 この記事では、Arduino IDEを使用した簡単なデモを通じて、ESP32でのMQTTメッセージのパブリッシュとトピック購読のプロセスを示します。

MQTTブローカーの準備

始める前に、通信とテストを行うMQTTブローカーがあることを確認してください。 EMQX Cloudを使用することをお勧めします。

EMQX Cloudは、大量のIoTデバイスに接続し、さまざまなデータベースとビジネスシステムを統合できる、完全マネージドなクラウドネイティブMQTTサービスです。 EMQX Cloudを使用すると、わずか数分で開始でき、AWS、Google Cloud、Microsoft Azureの20か所以上のリージョンでMQTTサービスを実行できるため、グローバルな可用性と高速な接続が実現します。

EMQX Cloud Serverlessを無料で試す

1ヶ月あたり100万セッションミニット以下で永久に無料。

試してみる→

この記事では、プロセスを簡素化するために無料のパブリックMQTTブローカーを使用します。

  • サーバー: broker.emqx.io
  • TCPポート: 1883
  • WebSocketポート: 8083
  • SSL/TLSポート: 8883
  • セキュアWebSocketポート: 8084

ESP32でのMQTT入門

Arduinoの設定

Arduinoは、使いやすいハードウェアとソフトウェアに基づくオープンソースのエレクトロニクスプラットフォームです。 インタラクティブプロジェクトを作成するすべての人を対象としています。 Arduinoボードは、入力(センサーのライト、ボタンの押下、Twitterメッセージなど)を読み取り、出力(モーターの起動、LEDの点灯、オンラインの何かの公開など)に変換できます。

このプロジェクトでは、Arduinoボードを使用してESP32モジュールをコンピュータに接続します。 ArduinoがESP32へのコードのアップロードと、ESP32とラップトップ間のシリアル接続を処理します。

Arduinoのインストールの詳細な手順については、公式Arduinoドキュメントにご参照ください。

ESP32開発ボードのインストール

ESP32開発ボードは、ESP32プラットフォームでのMQTTを使用するうえで不可欠です。 これにより、ESP32上でのMQTTベースのプロジェクトの開発とデプロイのためのハードウェアとソフトウェアのサポートが提供されます。 統合されたWi-FiおよびBluetooth機能、外部コンポーネントとのインターフェース用のGPIOピン、Arduino IDEとの互換性により、ESP32開発ボードを使用すると、シームレスな接続、プロトタイピング、MQTTベースのIoTアプリケーションのテストが可能になります。

次のステップに従って、Arduino IDEにESP32開発ボードをインストールします。

  1. Arduino IDEメニューの「ツール」をクリックします。
  2. 「開発ボード」を選択し、次に「開発ボードマネージャ」を選択します。
  3. ボードマネージャで「ESP32」と入力します。
  4. 見つかったらそれをクリックして、「インストール」ボタンをクリックします。

ESP32開発ボードのインストール

PubSubClientのインストール

次に、MQTTクライアントライブラリPubSubClientをインストールします。 PubSubClientは、Arduinoベースのプロジェクト向けに設計された軽量なMQTTクライアントライブラリ で、Nick O'Learyによって開発されました。 MQTTをサポートするサーバーとのシンプルなパブリッシュ/サブスクライブメッセージングのためのクライアントを提供します。 このライブラリは、ArduinoベースのIoTアプリケーションでの効率的なデータ交換を可能にするMQTT通信を簡素化します。

PubSubClientライブラリをインストールするには、次の手順に従ってください。

  1. Arduino IDEを開き、メニューバーの「プロジェクト」に移動します。
  2. 「ライブラリをロード」を選択し、次に「ライブラリマネージャ」を選択します。
  3. ライブラリマネージャで、検索バーに「PubSubClient」と入力します。
  4. Nick O'Learyによる「PubSubClient」ライブラリを見つけ、「インストール」ボタンをクリックします。

PubSubClientのインストール

これらの手順に従うことで、Arduino IDEにPubSubClientライブラリを正常にインストールできます。

MQTT接続の作成

TCP接続

  1. まず、WiFiPubSubClientライブラリをインポートする必要があります。 WiFiライブラリにより、ESP32はWi-Fiネットワークへの接続が可能になり、PubSubClientライブラリにより、ESP32はメッセージのパブリッシュとトピックへのサブスクライブのためにMQTTブローカーに接続できます。

    #include <WiFi.h>
    #include <PubSubClient.h>
    
  2. 次のパラメータを設定してください: Wi-Fiネットワーク名とパスワード、MQTTブローカーのアドレスとポート、トピックを emqx/esp32 に設定。

    // WiFi
    const char *ssid = "xxxxx"; // WiFi名を入力   
    const char *password = "xxxxx";  // WiFiのパスワード
    
    // MQTTブローカー  
    const char *mqtt_broker = "broker.emqx.io";
    const char *topic = "emqx/esp32";
    const char *mqtt_username = "emqx";
    const char *mqtt_password = "public";
    const int mqtt_port = 1883;
    
  3. シリアル接続を開き、プログラム結果を表示し、Wi-Fiネットワークへの接続を確立します。

    // ソフトウェアシリアルボー速度を115200に設定;
    Serial.begin(115200);
    // Wi-Fiネットワークへの接続
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("WiFiへ接続中...");
    }
    
  4. PubSubClientを利用して、MQTTブローカーへの接続を確立します。

    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        String client_id = "esp32-client-";
        client_id += String(WiFi.macAddress());
        Serial.printf("クライアント %s がパブリックMQTTブローカーに接続します\n", client_id.c_str());
        if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("EMQXのパブリックMQTTブローカーに接続しました");
        } else {
            Serial.print("状態で失敗しました ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    

TLS/SSL

MQTTでTLSを使用すると、情報の機密性と完全性を確保し、情報漏洩と改ざんを防ぐことができます。

このESP32コードは、サーバのルートCA証明書を使用して、セキュアなWi-Fi接続を確立します。 ca_cert変数には、PEM形式のルートCA証明書が含まれています。 espClientオブジェクトは、setCACert()関数を使用してサーバのルートCA証明書で構成されています。 この設定により、ESP32クライアントは、TLSハンドシェイク中にサーバーの身元を確認できるため、セキュアなWi-Fi接続が確立され、送信されるデータの機密性と完全性が確保されます。

はい、翻訳を続けます。

#include <WiFiClientSecure.h>

const char* ca_cert= \
"-----BEGIN CERTIFICATE-----\n" \  
"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n" \
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" \
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n" \  
"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n" \
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" \  
"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n" \
"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n" \
"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n" \
"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n" \  
"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n" \
"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n" \  
"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n" \
"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n" \
"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n" \
"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n" \
"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n" \
"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n" \
"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n" \
"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n" \
"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=" \
"-----END CERTIFICATE-----\n";

// WiFiクライアントの初期化
WiFiClientSecure espClient;

espClient.setCACert(ca_cert);

完全なTLS接続コードは、GitHubで入手できます。

メッセージのパブリッシュとサブスクライブ

MQTTブローカーへの接続が正常に確立されると、ESP32はemqx/esp32トピックにメッセージをパブリッシュし、そのトピックをサブスクライブします。

// パブリッシュとサブスクライブ
client.publish(topic, "こんにちは、ESP32です ^^"); 
client.subscribe(topic);

MQTTメッセージの受信

コールバック関数を設定して、トピック名をシリアルポートに出力し、emqx/esp32トピックから受信したメッセージを出力します。

void callback(char *topic, byte *payload, unsigned int length) {
  Serial.print("トピックにメッセージが届きました: ");
  Serial.println(topic);
  Serial.print("メッセージ:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  Serial.println("-----------------------");
}

全コード

全コードは次のとおりです。

#include <WiFi.h>
#include <PubSubClient.h>

// WiFi
const char *ssid = "xxxxx"; // WiFi名を入力   
const char *password = "xxxxx";  // WiFiのパスワード

// MQTTブローカー
const char *mqtt_broker = "broker.emqx.io";
const char *topic = "emqx/esp32";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  // ソフトウェアシリアルボー速度を115200に設定
  Serial.begin(115200);
  // WiFiネットワークへの接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("WiFiへ接続中...");
  }
  Serial.println("WiFiネットワークに接続しました");
  // MQTTブローカーへの接続
  client.setServer(mqtt_broker, mqtt_port);
  client.setCallback(callback);
  while (!client.connected()) {
    String client_id = "esp32-client-";
    client_id += String(WiFi.macAddress());
    Serial.printf("クライアント %s がパブリックMQTTブローカーに接続します\n", client_id.c_str());
    if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
      Serial.println("EMQXのパブリックMQTTブローカーに接続しました");
    } else {
      Serial.print("状態で失敗しました ");
      Serial.print(client.state());
      delay(2000);
    }
  }
  
  // パブリッシュとサブスクライブ
  client.publish(topic, "こんにちは、ESP32です ^^");
  client.subscribe(topic);  
}

void callback(char *topic, byte *payload, unsigned int length) {
  Serial.print("トピックにメッセージが届きました:");
  Serial.println(topic);
  Serial.print("メッセージ:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  Serial.println("-----------------------");
}

void loop() {
  client.loop();
}

実行とテスト

  1. 次の手順に従って、Arduinoを使用して完全なコードをアップロードし、ESP32に電源を入れてください。

    1. ESP32をUSBケーブルを使ってコンピュータに接続します。
    2. Arduino IDEを開き、「ツール」メニューから適切なボードとポートを選択します。
    3. 完全なコードをArduino IDEにコピー&ペーストします。
    4. 「アップロード」ボタン(またはショートカット Ctrl+U)をクリックして、コードをESP32にコンパイルとアップロードします。
    5. アップロードプロセスが終了するのを待ち、エラーがないことを確認します。
    6. コードがアップロードされたら、ESP32をコンピュータから切断します。
    7. 適切な電源に接続することにより、ESP32に電源を入れます。
  2. シリアルモニタを開き、ボー速度を115200に設定します。次に、シリアルモニタの出力を監視することにより、ESP32の接続ステータスを確認してください。

    ESP32シリアルモニター

  3. MQTTXクライアントを使用して、MQTTブローカーへの接続を確立し、Hi, I'm MQTTXなどのメッセージをESP32にパブリッシュします。

    MQTTXは、macOS、Linux、Windowsで実行されるエレガントなクロスプラットフォームMQTT 5.0デスクトップクライアントです。 チャットスタイルのインターフェースにより、ユーザーは簡単に複数のMQTT/MQTTS接続を作成し、MQTTメッセージをサブスクライブ/パブリッシュできます。

    MQTTXクライアント

  4. MQTTXによって公開されたメッセージが表示されます。

    MQTTXによって公開されたメッセージ

まとめ

この入門ガイドでは、ESP32でのMQTTの基本的な実装について説明しました。 必要なツールをインストールしました。これにはESP32開発ボードとPubSubClientライブラリが含まれます。 読者は、ステップバイステップの手順に従うことで、セキュアなWi-Fi接続を確立し、MQTTブローカーに接続し、メッセージを公開し、トピックを購読できます。 ESP32でMQTTを活用することで、ユーザーは信頼性と効率の高いIoTアプリケーションを作成できます。

次に、EMQXが提供するMQTTガイド: 初級者から上級者への記事シリーズをチェックして、MQTTプロトコルの機能を学び、MQTTのより高度なアプリケーションを探索し、MQTTアプリケーションとサービスの開発を開始してください。

リソース

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?