ESP32でのMQTT入門ガイド

![ESP32でのMQTT入門ガイド](https://assets.emqx.com/images/4d8f8b901f28e9c5a1944af5f08203e7.png?imageMogr2/thumbnail/1520x684)

**目次**

- [はじめに](https://www.emqx.com/en/blog/esp32-connects-to-the-free-public-mqtt-broker#introduction)
- [MQTTブローカーの準備](https://www.emqx.com/en/blog/esp32-connects-to-the-free-public-mqtt-broker#prepare-an-mqtt-broker)
- [ESP32でのMQTT入門](https://www.emqx.com/en/blog/esp32-connects-to-the-free-public-mqtt-broker#getting-started-with-mqtt-on-esp32)
- [実行とテスト](https://www.emqx.com/en/blog/esp32-connects-to-the-free-public-mqtt-broker#running-and-testing)
- [まとめ](https://www.emqx.com/en/blog/esp32-connects-to-the-free-public-mqtt-broker#summary)
- [リソース](https://www.emqx.com/en/blog/esp32-connects-to-the-free-public-mqtt-broker#resources)

## はじめに

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

[ESP32](https://www.espressif.com/en/products/socs/esp32)は、[ESP8266](https://www.emqx.com/en/blog/esp8266-public-mqtt-broker-setup)のアップグレードバージョンで、低コストかつ低消費電力の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](https://www.emqx.com/en/cloud)は、大量のIoTデバイスに接続し、さまざまなデータベースとビジネスシステムを統合できる、完全マネージドなクラウドネイティブMQTTサービスです。 EMQX Cloudを使用すると、わずか数分で開始でき、AWS、Google Cloud、Microsoft Azureの20か所以上のリージョンでMQTTサービスを実行できるため、グローバルな可用性と高速な接続が実現します。

EMQX Cloud Serverlessを無料で試す

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

[試してみる→](https://accounts.emqx.com/signup?continue=https://cloud-intl.emqx.com/console/deployments/0?oper=new)

この記事では、プロセスを簡素化するために[無料のパブリックMQTTブローカー](https://www.emqx.com/en/mqtt/public-mqtt5-broker)を使用します。

- サーバー: `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ドキュメント](https://docs.arduino.cc/software/ide-v2/tutorials/getting-started/ide-v2-downloading-and-installing/)にご参照ください。

#### 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開発ボードのインストール](https://assets.emqx.com/images/99c502b39ef7d21dc75632e42aa89708.png?imageMogr2/thumbnail/1520x)

#### PubSubClientのインストール

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

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

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

![PubSubClientのインストール](https://assets.emqx.com/images/cb7b0228aa91bf300eec5a725da159d3.png?imageMogr2/thumbnail/1520x)

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

### MQTT接続の作成

#### TCP接続 

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

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

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

   ```arduino
   // 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ネットワークへの接続を確立します。

   ```reasonml
   // ソフトウェアシリアルボー速度を115200に設定;
   Serial.begin(115200);
   // Wi-Fiネットワークへの接続
   WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) {
       delay(500);
       Serial.println("WiFiへ接続中...");
   }
   ```

4. PubSubClientを利用して、MQTTブローカーへの接続を確立します。

   ```arduino
   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接続が確立され、送信されるデータの機密性と完全性が確保されます。

はい、翻訳を続けます。

```livescript
#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](https://github.com/emqx/MQTT-Client-Examples/blob/master/mqtt-client-ESP32/esp32_connect_mqtt_via_tls.ino)で入手できます。


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

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

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

### MQTTメッセージの受信

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

```arduino
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("-----------------------");
}
```

### 全コード

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

```arduino
#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シリアルモニター](https://assets.emqx.com/images/b3092b5bc576e59e3d964020cd73598f.png?imageMogr2/thumbnail/1520x)

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

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

   ![MQTTXクライアント](https://assets.emqx.com/images/d6af5f33eb8f550cf22705859ed9d59b.png?imageMogr2/thumbnail/1520x)

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

   ![MQTTXによって公開されたメッセージ](https://assets.emqx.com/images/d192ba700151d83f7adc5376d5b4d374.png?imageMogr2/thumbnail/1520x)

## まとめ 

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

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

## リソース

- [Paho Pythonクライアントを使用したRaspberry PiでのMQTTの使用方法](https://www.emqx.com/en/blog/use-mqtt-with-raspberry-pi)
- [Raspberry PiベースのMicroPython MQTTチュートリアル](https://www.emqx.com/en/blog/micro-python-mqtt-tutorial-based-on-raspberry-pi)  
- [ESP8266とMQTTでLEDをリモート制御](https://www.emqx.com/en/blog/esp8266_mqtt_led)
- [ESP8266がArduinoでMQTTブローカーに接続](https://www.emqx.com/en/blog/esp8266-connects-to-the-public-mqtt-broker)
- [NodeMCU(ESP8266)を介したセンサーデータのMQTTクラウドサービスへのアップロード](https://www.emqx.com/en/blog/upload-sensor-data-to-mqtt-cloud-service-via-nodemcu-esp8266)