ESP32によるMQTTクライアントの接続

テキストコピッド
導入事例

このガイドは、MQTTクライアントの実行をオンにするための包括的なチュートリアルを提供しています ESP32 デバイスMQTTブローカーまたはあなたの選択のブローカー。 確立などの重要なタスクをカバーしています。 接続、トピックへのサブスクライブ、 購読を解除し、メッセージを交換します。 これらの手順に従うことによって、効果的にすることができます ソリューションMQTTの特長IoTプロジェクトへのコミュニケーション

前提条件

始める前に、次のことを確実にします。

  • Arduino IDE セットアップによる ESP32 開発ボード
  • MQTTブローカーインスタンス(IPアドレスまたはドメイン名)へのアクセス
  • ESP32のWiFi接続資格情報

依存性インストール

Arduino IDEをインストール

公式サイトからArduino IDEをダウンロードしてインストールします。

ESP32ボードパッケージをインストールする

  • Arduino IDE を開く
  • ファイルに移動 > リファレンス
  • 追加ボードマネージャ URL フィールドに、次の URL を追加します。

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

このフィールドに既に URL がある場合、それらを分離できます commasを使って。

  • OKをクリックして設定を保存します
  • ツールに行く > ボード > 取締役会長
  • ボードマネージャで、ESP32を検索し、エスプレッフでesp32パッケージをインストールします システム

ESP32ボードを選択

  • ツールに行く > ボード
  • スクロールダウンして、特定のESP32ボード(例、ESP32 Dev Module)を選択します。

必要なライブラリをインストールする

  • スケッチに行く > ライブラリ > ライブラリの管理
  • ライブラリマネージャーでは、次のライブラリを検索し、次のようにインストールします。 必要条件
    • WiFi(WiFi接続用)
    • ESPAsyncWebServer(Webサーバーの作成)
    • パブサブクライアント(MQTT通信用)
    • Adafruitセンサー(Adafruitセンサーを使用した場合)
    • DHTセンサーライブラリ(DHTセンサー用)
    • ArduinoJson(JSON解析とシリアライズ用)

目的のライブラリをクリックし、インストールをクリックします ボタン。

インストールの検証

  • インストールを確認する例のスケッチを開きます。
  • ファイルに移動 > ESP32 やインストールされたライブラリで例を調べます。
  • スケッチを選択し、コンパイルし、 ESP32 ボードにアップロードして、 すべてが正しく設定されます。

定数を定義する

あなたの_wifi_ssid、あなたの_wifi_password、mqtt_server、およびmqtt_portを実際のものに置き換える WiFiとMQTTブローカーの詳細。

/ WiFi
文字列 char *ssid = "xxxxx"; // あなたのWiFiのssidを入力してください
const char *password = "xxxxx"; // WiFi パスワードを入力してください
// MQTT ブローカー
const char *mqtt_server = "public-mqtt-broker.bevywise.com";
const int mqtt_port = 1883;
const char *mqtt_username = "username"; (オプション)
const char *mqtt_password = "pwd"; (オプション)

MQTTブローカーに接続する

このセクションには、MQTT ブローカーに接続するさまざまな方法のコードスニペットがあります。 確認する MQTTブローカーは、使用する接続タイプをサポートしています。 また、取得 MQTTブローカー(アドレス、ポート、)の対応する接続パラメータ ユーザー名/パスワード、CA証明書

MQTTの特長 TCP で

クライアントを TCP に接続するために、次のコードを使用します。 MQTT Brokerの接続パラメータを使用してマクロADDRESSを定義します。

MQTT 3.1.1のため:

WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
お問い合わせ
遅延(500);
Serial.println(「WiFiに接続する」)。
お問い合わせ
const char *client_id = "esp_client";
client.setServer(mqtt_server、mqtt_port) 。

MQTT 5のため:

AsyncMqttClient mqttClient;
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
お問い合わせ
onMqttConnect(bool sessionPresent) を無効にします。
Serial.println(「MQTTに接続」)
// // // // トピックを購読できます
// mqttClient.subscribe("test/topic", 1); // mqttClient.subscribe("test/topic", 1"); // mqttClient.subscribe("test/topic", 1"); // mqttClient.subscribe("test/topic", 1"); // mqttClient.subscribe("test/topic", 1"); // mqttClient.subscribe("test/topic", 1"); ); // mqttClient.subscribe("test/topic", 1"); );
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
mqttClient.onConnect(onMqttConnect)。
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setClientId(クライアントID)
// // // // プロトコルバージョンをMQTT 5.0に設定する
mqttClient.setProtocolVersion(5); の
mqttClient.connect() は、
お問い合わせ

TLS/SSL上のMQTT

以下のコードを使用して、TLS 上で MQTT ブローカーに安全に接続します。 MQTT Brokerの接続パラメータを使用してマクロADDRESSを定義します。

#include <WiFiClientSecure.h>
// MQTTブローカーのルートCA証明書
文字列 char* root_ca = \
「-----BEGIN CERTIFICATE-----\n」 \
「YOUR_ROOT_CA_CERTIFICATE\n」\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
"-----エンド証明書-----\n";
// init wifi セキュアなクライアント
WiFiClientSecureのespClient;
PubSubClientクライアント(espClient)
espClient.setCACert(root_ca) は、
espClient.setCertificate(server_cert); // クライアント検証用
espClient.setPrivateKey(server_key); // クライアント検証用

MQTTClient_connect を呼び出す前に TLS パラメータを設定し、クライアントを接続します。 mQTT ブローカーは TLS を安全に管理します。

MQTT ブローカーが信頼できるサーバーでホストされている場合、サーバーの検証は TLSオプションを設定するには、次のコードを使用できます。

// MQTT ブローカーの設定
const char* mqtt_server = "your_mqtt_server";
const uint16_t mqtt_port = 8883; // 通常、ポート 8883 は TLS上のMQTT
const char* client_id = 生成ClientId(crystal_,length);
// WiFi と MQTT クライアントの初期化
WiFiClientSecureのespClient;
パブサブクライアント mqttClient(espClient)
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」); お問い合わせ
void connectToMqtt() ディレクティブ
// サーバ認証の無効化
espClient.setInsecure() ;
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setコールバック(mqttコールバック)
間 (!mqttClient.connected())) お問い合わせ
Serial.print("MQTTに接続...");
もし(mqttClient.connect(client_id)) お問い合わせ
Serial.println(「接続」);
// トピックを購読したり、メッセージを公開したりする
// mqttClient.subscribe("your/topic");
お問い合わせ
Serial.print("state" で参照)
Serial.print(mqttClient.state()); ;
遅延(2000);
お問い合わせ
お問い合わせ
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
connectToMqtt() ;
お問い合わせ
void loop() お問い合わせ
// // // // MQTT クライアントが接続されていることを確認します
もし(!mqttClient.connected()) お問い合わせ
connectToMqtt() ;
お問い合わせ
mqttClient.loop(); ;
お問い合わせ

MQTT ブローカーに Trusted CA から発行された Server 証明書がある場合、サーバー 証明書は、次の方法で検証できます。

/ MQTTブローカーのルートCA証明書
文字列 char* root_ca = \
「-----BEGIN CERTIFICATE-----\n」 \
「YOUR_ROOT_CA_CERTIFICATE\n」\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
"-----エンド証明書-----\n";
// WiFi と MQTT クライアントの初期化
WiFiClientSecureのespClient;
パブサブクライアント mqttClient(espClient)
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
お問い合わせ
void connectToMqtt() ディレクティブ
// // // // ルートCA証明書を設定する
espClient.setCACert(root_ca) は、
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setコールバック(mqttコールバック)
間 (!mqttClient.connected())) お問い合わせ
Serial.print("MQTTに接続...");
もし(mqttClient.connect(client_id)) お問い合わせ
Serial.println(「接続」);
// トピックを購読したり、メッセージを公開したりする
// mqttClient.subscribe("your/topic");
お問い合わせ
Serial.print("state" で参照)
Serial.print(mqttClient.state()); ;
遅延(2000);
お問い合わせ
お問い合わせ
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
connectToMqtt() ;
お問い合わせ
void loop() お問い合わせ
// // // // MQTT クライアントが接続されていることを確認します
もし(!mqttClient.connected()) お問い合わせ
connectToMqtt() ;
お問い合わせ
mqttClient.loop(); ;
お問い合わせ

MQTTブローカーに自己署名されたサーバー証明書がある場合 それからサーバー 証明書はから得られるルートの証明書を使用して確認することができます MQTTブローカー:

// MQTT ブローカーの自己署名されたルート証明書
文字列 char* root_ca = \
「-----BEGIN CERTIFICATE-----\n」 \
"YOUR_SELF_SIGNED_ROOT_CERTIFICATE\n"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
"-----エンド証明書-----\n";
// WiFi と MQTT クライアントの初期化
WiFiClientSecureのespClient;
パブサブクライアント mqttClient(espClient)
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
お問い合わせ
void connectToMqtt() ディレクティブ
// // // // 自己署名されたroot CA証明書を設定する
espClient.setCACert(root_ca) は、
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setコールバック(mqttコールバック)
間 (!mqttClient.connected())) お問い合わせ
Serial.print("MQTTに接続...");
もし(mqttClient.connect(client_id)) お問い合わせ
Serial.println(「接続」);
// トピックを購読したり、メッセージを公開したりする
// mqttClient.subscribe("your/topic");
お問い合わせ
Serial.print("state" で参照)
Serial.print(mqttClient.state()); ;
遅延(2000);
お問い合わせ
お問い合わせ
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
connectToMqtt() ;
お問い合わせ
void loop() お問い合わせ
// // // // MQTT クライアントが接続されていることを確認します
もし(!mqttClient.connected()) お問い合わせ
connectToMqtt() ;
お問い合わせ
mqttClient.loop(); ;
お問い合わせ

WebSocket 経由で MQTT

クライアントをWebSocketに接続するために、このようなMQTTブローカーアドレスを定義します。

#include <PubSubClient.h>
#include <WebSocketClient.h>
// MQTT ブローカーの設定
const char* mqtt_server = "public-mqtt-broker.bevywise.com";
const uint16_t mqtt_port = 10443; // TLS のない WebSocket は通常実行 ポート 80
const char* client_id = 生成ClientId(crystal_,length);
// WiFi と MQTT クライアントの初期化
WiFiClient espClient;
パブサブクライアント mqttClient(espClient)
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
お問い合わせ
void connectToMqtt() ディレクティブ
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setコールバック(mqttコールバック)
間 (!mqttClient.connected())) お問い合わせ
Serial.print("WebSocket上のMQTTに接続する...");
もし(mqttClient.connect(client_id)) お問い合わせ
Serial.println(「接続」);
// トピックを購読したり、メッセージを公開したりする
// mqttClient.subscribe("your/topic");
お問い合わせ
Serial.print("state" で参照)
Serial.print(mqttClient.state()); ;
遅延(2000);
お問い合わせ
お問い合わせ
お問い合わせ
mqttCallback(char* トピック、byte* ペイロード、符号なしの int の長さ) を無効にします。 お問い合わせ
// 受信メッセージの処理
Serial.print("メッセージは");
Serial.print(トピック)
Serial.print() の メッセージ: ");
で (unsigned int i = 0; i < length; i++) お問い合わせ
Serial.print((char)ペイロード[i]);
お問い合わせ
シリアル.println();
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
connectToMqtt() ;
お問い合わせ
void loop() お問い合わせ
// // // // MQTT クライアントが接続されていることを確認します
もし(!mqttClient.connected()) お問い合わせ
connectToMqtt() ;
お問い合わせ
mqttClient.loop(); ;
お問い合わせ

セキュアなWebSocket上MQTT

Secure WebSocket 上でクライアントを接続するには、以下のコードを使用します。 TLS オプションを TLS セクションに MQTT で指定するように設定します。 MQTT Brokerの接続パラメータを使用してマクロADDRESSを定義します。

// MQTT ブローカーの設定
const char* mqtt_server = "public-mqtt-broker.bevywise.com";
const uint16_t mqtt_port =11443; // TLS で WebSocket は通常実行されます ポート 443
const char* client_id = "esp_client";
// MQTTブローカーのルートCA証明書
文字列 char* root_ca = \
「-----BEGIN CERTIFICATE-----\n」 \
「YOUR_ROOT_CA_CERTIFICATE\n」\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
"-----エンド証明書-----\n";
// WiFi と MQTT クライアントの初期化
WiFiClientSecureのespClient;
パブサブクライアント mqttClient(espClient)
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
お問い合わせ
void connectToMqtt() ディレクティブ
// // // // TLS の root CA 証明書を設定する
espClient.setCACert(root_ca) は、
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setコールバック(mqttコールバック)
間 (!mqttClient.connected())) お問い合わせ
Serial.print(「TLSでWebSocket経由でMQTTに接続する...」);
もし(mqttClient.connect(client_id)) お問い合わせ
Serial.println(「接続」);
// トピックを購読したり、メッセージを公開したりする
// mqttClient.subscribe("your/topic");
お問い合わせ
Serial.print("state" で参照)
Serial.print(mqttClient.state()); ;
遅延(2000);
お問い合わせ
お問い合わせ
お問い合わせ
mqttCallback(char* トピック、byte* ペイロード、符号なしの int の長さ) を無効にします。 お問い合わせ
// 受信メッセージの処理
Serial.print("メッセージは");
Serial.print(トピック)
Serial.print() の メッセージ: ");
で (unsigned int i = 0; i < length; i++) お問い合わせ
Serial.print((char)ペイロード[i]);
お問い合わせ
シリアル.println();
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
connectToMqtt() ;
お問い合わせ
void loop() お問い合わせ
// // // // MQTT クライアントが接続されていることを確認します
もし(!mqttClient.connected()) お問い合わせ
connectToMqtt() ;
お問い合わせ
mqttClient.loop(); ;
お問い合わせ

MQTT の設定 認証

MQTT ユーザー名と MQTT パスワードが必要な MQTT ブローカーに接続するには 認証は、ユーザ名とパスワードで接続オプションに追加します。

#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
// MQTT ブローカーの設定
const char* mqtt_server = "public-mqtt-broker.bevywise.com";
const uint16_t mqtt_port = 1883; // ポートを使用しないTLS
const char* mqtt_user = "your_mqtt_username";
const char* mqtt_password = "your_mqtt_password";
const char* client_id_prefix = "esp_client_";
// WiFi と MQTT クライアントの初期化
WiFiClient espClient;
パブサブクライアント mqttClient(espClient)
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
お問い合わせ
文字列生成 ClientId(文字列プレフィックス、intlength) {
const char 文字[] パスワード 「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789」;
int charsLength = sizeof(chars) - 1;
文字列クライアント Id = プレフィックス;
// ランダムシードを初期化
ランダムSeed(analogRead(0));
(int i = 0; i <長さ; i++) お問い合わせ
clientId += chars[random(0, charsLength)];
お問い合わせ
クライアントを返す イド;
お問い合わせ
void connectToMqtt() ディレクティブ
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setコールバック(mqttコールバック)
文字列 client_id = 生成ClientId(client_id_prefix, 10);
間 (!mqttClient.connected())) お問い合わせ
Serial.print("MQTTに接続...");
もし (mqttClient.connect(client_id.c_str()、mqtt_user、mqtt_password)) の場合 お問い合わせ
Serial.println(「接続」);
// トピックを購読したり、メッセージを公開したりする
// mqttClient.subscribe("your/topic");
お問い合わせ
Serial.print("state" で参照)
Serial.print(mqttClient.state()); ;
遅延(2000);
お問い合わせ
お問い合わせ
お問い合わせ
mqttCallback(char* トピック、byte* ペイロード、符号なしの int の長さ) を無効にします。 お問い合わせ
// 受信メッセージの処理
Serial.print("メッセージは");
Serial.print(トピック)
Serial.print() の メッセージ: ");
で (unsigned int i = 0; i < length; i++) お問い合わせ
Serial.print((char)ペイロード[i]);
お問い合わせ
シリアル.println();
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
connectToMqtt() ;
お問い合わせ
void loop() お問い合わせ
// // // // MQTT クライアントが接続されていることを確認します
もし(!mqttClient.connected()) お問い合わせ
connectToMqtt() ;
お問い合わせ
mqttClient.loop(); ;
お問い合わせ

高度な機能

最終ウィル&テストの設定

設定する最近の投稿 ウィルとテストクライアントが予期しないとブローカーが公開するメッセージを指定する機能 切断。 これは、接続されていないクライアントの他の加入者に通知するのに役立ちます ステータス。

接続オプションでLast Willを設定するには、次のコードを使用します。

// LWTの設定
const char* lwt_topic = "test/lwt";
const char* lwt_message = "ESP32 切断";
const int lwt_qos = 1;
const bool lwt_retain = true;
//MQTTBrokerを再接続する関数
void reconnect()
お問い合わせ
間 (!mqttClient.connected()))
お問い合わせ
Serial.print(「MQTT接続を試みる...」);
// MQTT のユーザー名、パスワード、LWT との接続を試みる
if(mqttClient.connect("ESP32Client",mqtt_user,mqtt_password), lwt_topic,lwt_qos, lwt_retain, lwt_message ) {{{{{{{{{{{{{{{{{{}}}}}}{{{{{{{{{{{{{{{{{}}}}}}}}{{{{{{{{{{{{{{{{{{}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
Serial.println(「接続」); // トピックを購読する mqttClient.subscribe(「テスト/トピック」);
お問い合わせ
その他
お問い合わせ
Serial.print("failed, rc="); は、
Serial.print(mqttClient.state()); ;
Serial.println("5秒でもう一度試す"); // // // // 5秒前に待つ 再試行
お問い合わせ

調節は生きている保ちます

MQTT は、クライアント・ブローカー・コネクションを保ちながら、 調整する クライアントが PINGREQ メッセージを送信する頻度を制御するための、一貫した間隔を維持 ブローカー。

あなたの要件に合ったコードを変更します。

// MQTT は応答間隔 (秒)
const int mqtt_keep_alive = 60; // 必要に応じて調整する
void の設定()
お問い合わせ
mqttClient.setKeepAlive(mqtt_keep_alive)。
お問い合わせ

セッションの持続性の設定

セッションデータMQTTの特長 クライアントクライアントが作成したサブスクリプションとクライアントが望む任意のデータを含む QoS>0 で受け取る。

クライアントは、MQTT ブローカーがセッションデータを接続間で保存することができます。

MQTT 3.1.1 クライアントは、MQTT ブローカーを要求するために、クリーン セッション = 0 を設定することができます 接続間で保存されたセッション情報。

MQTT 3.1.1のため:

もし(mqttClient.connect("ESP32ClientClean"、mqtt_user、mqtt_password) nullptr, 0, false, nullptr, true)
お問い合わせ
Serial.println(「接続」);
お問い合わせ
もし (mqttClient.connect("ESP32ClientPersistent", mqtt_user, mqtt_password, nullptr, 0, false, nullptr, false)
お問い合わせ
Serial.println(「接続」);
お問い合わせ

MQTTの特長 5 クライアントは、クリーンスタート = 0 とセッション有効期限インターバル = 'N' をリクエストするように設定できます MQTT ブローカーは、'N' の接続に格納されているセッション情報を保持します。 秒数。

MQTT 5のため:

// MQTT クライアントの設定
const char* client_id = "ESP32Client";
const bool clean_start = 偽;
const uint32_t session_expiry_interval = 3600; // セッション expiry 秒間隔
AsyncMqttClient mqttClient;
void 接続
Serial.println(「WiFiに接続する」);
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
お問い合わせ
onMqttConnect(bool sessionPresent) を無効にします。
Serial.println(「MQTTに接続」)
Serial.print("セッションプレゼント");
Serial.println(セッションプレゼント)
// トピックを購読したり、メッセージを公開したりする
// mqttClient.subscribe("your/topic"、0); ;
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
mqttClient.onConnect(onMqttConnect)。
mqttClient.onDisconnect(onMqttDisconnect)
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setCredentials(mqtt_user、mqtt_password) は、
// MQTT 5 の設定
mqttClient.setCleanSession(clean_start) ;
mqttClient.setSessionExpiry(session_expiry_interval);
mqttClient.connect(client_id) は、
お問い合わせ
void loop() お問い合わせ
// // // // AsyncMqttClient は、すべてを扱う
お問い合わせ

設定最大 パケット サイズ

MQTT5 クライアントは、MQTT ブローカーをリクエストして、データパケットを以下に送信することができます。 このような設定で特定のサイズ:

MQTT 5のため:

const char* データ = “送信する最大のデータ”;
const int チャンクサイズ = 1024;
int dataLength = strlen(データ)
int numChunks = (データ長 + チャンクサイズ - 1) / チャンクサイズ;
// 必要なチャンクの数を計算する
用 (int i = 0; i < numChunks; i++)
お問い合わせ
char chunk[chunkSize + 1]; // チャンクのためのバッファ
// // // // データをバッファにコピーする
strncpy(チャンク、データ+ i *チャンクサイズ、チャンクサイズ)。
chunk[chunkSize] = '\0'; // 文字列をnull-terminate
// chunk を MQTT メッセージとして公開する
mqttClient.publish("large_data_topic", chunk, false); // QoS 0 の false Serial.print("公開チャンク");
お問い合わせ

出版情報

データの送信

複数の加入者にデータを効率的に配信し、指定する 次のコードスニペットのトピック:

MQTT 3.1.1用

mqttclient.publish("topic",message.c_str()); );

MQTT 5のため

// 出版例
文字列 メッセージ = "こんにちは、MQTT!";
mqttClient.publish("topic", 0, false, message.c_str()); );
お問い合わせ

保持メッセージの設定

ブローカーが保管することを確認するためにメッセージを公開するときに保持フラグを有効にします 各トピックの最後のメッセージ。 これは、新しい加入者が最も受け取ることを保証 接続時の最近のメッセージ

これを実行するには、次のコードスニペットを使用します。

// 例: 10秒ごとに保持メッセージを公開する
静的符号なしの長いLastPublish = 0;
if (millis() - 最後の公開 > 10000)
お問い合わせ
lastPublish = ミリシス();
もし(mqttClient.publish("topic", "Device Status = 1", true))
お問い合わせ
Serial.println("Retained message が正常に公開された");
お問い合わせ
その他
お問い合わせ
Serial.println("Retained message publish が失敗しました");
お問い合わせ
お問い合わせ

QoSレベルを指定する

MQTTは、サービスの品質(QoS)の3つのレベルを提供します メッセージ配達:

  • QoS 0 (一度に)
  • QoS 1 (少なくとも一度)
  • QoS 2 (一度だけ)
必要事項を指定するQoSレベルこのコードを使用してMQTTメッセージを公開するとき:

if (mqttClient.publish("topic", "DoS 0 のデバイスステータス", false, 0))
お問い合わせ
Serial.println("QoS 0のメッセージが正常に公開された");
お問い合わせ
その他
お問い合わせ
Serial.println(「QoS 0 公開失敗したメッセージ」);
お問い合わせ
// QoS 1 でメッセージを公開する
もし(mqttClient.publish("topic", "QoS 1 のデカンス状態", false, 1))
お問い合わせ
Serial.println("QoS 1のメッセージが正常に公開された");
お問い合わせ
その他
お問い合わせ
Serial.println(「QoS 1 公開失敗したメッセージ」);
お問い合わせ
// QoS 2 でメッセージを公開する
もし(mqttClient.publish("topic", "QoS 2のデバイスステータス", false, 2))
お問い合わせ
Serial.println(「QoS 2のメッセージが正常に公開された」);
お問い合わせ
その他
お問い合わせ
Serial.println("QoS 2のメッセージが失敗しました");
お問い合わせ

メッセージの有効期限インターバル

「メッセージの有効期限間隔」プロパティは、メッセージの寿命を秒単位に設定します。 現時点では、ブローカーはそれを破棄します。 MQTT5は、この機能をサポートしています。 MQTT5 クライアントは、データを公開する際にこれを設定できます。

MQTT 5のため

int expiryInterval = 60;
const char* メッセージ = “デバイスステータスメッセージ”;
mqttClient.beginPublish(トピック、strlen(メッセージ)、false、expiryInterval *1000); //ミリ秒単位の有効期限間隔
mqttClient.print(ペイロード)
mqttClient.endPublish() は、

トピック 別名で

'Topic Alias' プロパティは、クライアントがフルの代わりに短いエイリアスを使用することを可能にします トピック名、メッセージパケットサイズを減らし、ネットワークの効率性を改善します。

MQTT 5のため

// Topic Aliasの最大値(MQTTブローカー機能に基づく調整)
制約のint MAX_TOPIC_ALIAS = 10;
const char* メッセージ = “デバイスステータスメッセージ”;
// ブローカーによってサポートされている場合、トピックエイリアスで公開
mqttClient.beginPublish(トピック、strlen(メッセージ)、false);
mqttClient.writeTopic(トピック) // 完全なトピック名を公開する
mqttClient.writeTopicAlias(1); // // // // トピックエイリアスを設定します。例えば、1 mqttClient.print(メッセージ)
mqttClient.endPublish() は、

MQTT PUBLISHに関連付けられたプロパティは、メッセージ処理を強化し、コンテキストを提供 ブローカーやクライアントの指示 これらのプロパティ, メッセージを含む expiry 間隔とトピックのエイリアス、メッセージ配信とネットワークの帯域幅を最適化します。

会員登録

トピックフィルタへのサブスクライブ

他のクライアントが公開したデータを受信するには、このクライアントは、 マッチングトピック このようなフィルタ:

mqttClient.subscribe("cmq /トピック");

このトピックフィルタは、正確なトピックと一致させることができます # や + のようなワイルドカードを持っている

データの送信

サブスクリプションに送信されたデータを受信するには、コールバック関数を定義する必要があります このように:

onMqttMessage(char*トピック、char*ペイロード、 AsyncMqttClientMessageプロパティ、size_t len、size_t インデックス、 size_t 合計 お問い合わせ
Serial.println(「メッセージ受信:」);
シリアル.print(") トピック: ");
Serial.println(トピック)。
シリアル.print(") ペイロード: ");
Serial.println(ペイロード)。
// // // // アプリケーションのニーズに基づいて、ここで処理を追加することができます
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
ConnectToWifi() ;
mqttClient.onConnect(onMqttConnect)。
mqttClient.onDisconnect(onMqttDisconnect)
mqttClient.onメッセージ(onMqttMessage) // // // // コールバック関数を設定します。 メッセージの受信
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setCredentials(mqtt_user、mqtt_password) は、
mqttClient.connect(client_id) は、
お問い合わせ

トピックからの購読解除

トピックから更新を受信を停止するには、提供されたコードを使用して退会します。

// トピックから退会する
mqttClient.unsubscribe("cmq/topic");;

クライアントの切断

問題を避けるためにブローカーとクライアントの接続の適切な終了を確保 両側のリソース漏れにより、システム安定性を維持します。

以下のコードを使用して、ブローカーからクライアントを切断します。

mqttClient.disconnect() は、

ビジネスロジックの構築

あなたは、あなた自身の複雑なビジネスロジックを開発し、カスタマイズする機会を持っています この環境内では、特定のニーズや目的に合わせて正確に調整します。

ベストプラクティスの実践

独自のクライアントID管理

特定のクライアント ID を各デバイスに正確に識別できるように割り当てます。 プライベート 各クライアントに固有のIDを設定、指定します。 共有環境では、各クライアント ID にランダムな文字列を追加して維持します。 ユニークネス。

データ設計

事前にデータを戦略的に計画する。 あなたが働いているかどうか プレーンテキスト, JSON フォーマットされたデータ、または数値データ、設計があなたのと整列することを保障して下さい アプリケーションのニーズとユースケース。

強力なエラー処理

MQTT接続を処理する強力なエラー管理を実施 失敗、サブスクリプションの問題、およびメッセージを効果的に公開するエラー。

機密保持

ユーザー名、パスワード、クライアント ID などの機密情報を保護する ソースコードをハードコーディングします。 環境変数を使うか、または安全 代わりに設定ファイル。

定期的なテストと監視

MQTT 通信を継続的にテストし、クライアントのメトリックを監視します。 接続状況、メッセージのスループット、エラー率を迅速に特定し、 問題の修正。

セッションマネジメントの最適化

クリーンで永続的なセッション(`clean: true` または `clean: false`) の間で選択します。 クライアント間でサブスクリプションとキューイングされたメッセージを保持する必要性に基づく 接続。

接続解除の解除

コードを追加して、再接続を試みるMQTTブローカー予期しない切断がある場合。 これにより、クライアントがお客様のクライアントを 接続されたまま、データを失うことはありません。

コードをダウンロード

ESP32 MQTT クライアントライブラリを使用するクライアントのための完全なコードをダウンロードし、接続します。 私たちと一緒にMQTTブローカーまたはあなたの選択のブローカー。

MQTT 3.1.1用

//このコードは、機械の可用性状況と生産性のステータスを読み取ります mqttbrokerへ
// 必要なライブラリを含む
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#"time.h" を含む
// WiFiUDP ntpUDP;
const char *ntpServer = "time.google.com";
WiFiClient ProxSen;
PubSubClientクライアント(ProxSen)
unsigned 長い epochTime = 0;
unsigned 長い流れ Millis1 = 0;
const char* ssid = "xxxxxxxxxxxxx"; // xxx... を WIFI SSID に置き換える
const char* パスワード = "xxxxxxxxxxxxx"; // WIFI パスワードで応答
const char* mqtt_server = "xxxxxxxxxxxxxxxx"; //MQTT サーバー名
const char* mqtt_user = "xxxxxxxxxxxxxxxxxxx"; //MQTT ブローカー ユーザー名
const char* mqtt_password = "xxxxxxxxxxxxx"; //MQTT ブローカー パスワード
const int ProxSenPin = 33; //availablity ステータス 読み込み
const int 生産性ピン = 26; // 確率 ステータス 読み込み
const unsigned 長い集計 インターバル = 60000; // 1分
unsigned int 空室状況[60]; // 可用性と生産性の保存 1分間の値
// unsigned int changeoverValues[300];
unsigned int valueIndex = 0;
int の可用性 = 0;
int の生産性 = 1;
boolの農産物 フラグ = false;
符号なしの長いgetTime()
お問い合わせ
time_t 今;
Serial.println("inside gettime")); は、
struct tm timeinfo;
もし(!getLocalTime(&timeinfo))
お問い合わせ
Serial.println(「時間を取得することができません」);
getTime() ;
お問い合わせ
時間(&now);
今すぐ返品
お問い合わせ
// // // // 機械の可用性を読むため
無効 IRAM_ATTR 利用Isr()
お問い合わせ
空室状況 = デジタル読み取り(ProxSenPin) ? 0 : 1; // デバイスはネガティブで動作します ロジック
お問い合わせ
// // // // 機械の生産性を読むため
void IRAM_ATTRの農産物Isr()
お問い合わせ
createFlag = デジタル読み取り(生産性ピン)? 偽 : true;
お問い合わせ
//mqttブローカーとの接続
void connectToMqtt() の
お問い合わせ
間 (!client.connected()))
お問い合わせ
Serial.println("MQTTに接続...");
if (client.connect("ProxSen", mqtt_user, mqtt_password")) )
お問い合わせ
Serial.println(「MQTTに接続」);
お問い合わせ
その他
お問い合わせ
Serial.print("MQTT、rc="に接続することができません)。
セックス
rial.print(client.state()); ;
シリアル.println(") 5秒で再試行...";
遅延(5000);
お問い合わせ
お問い合わせ
void の設定()
お問い合わせ
Serial.begin(115200)。
//WIFI接続の設定
WiFi.mode(WIFI_STA)
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
お問い合わせ
遅延(5000);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
//MQTTBrokerの設定
client.setServer(mqtt_server,1883);
configTime(0, 0, ntpServer);
epochTime = getTime();
connectToMqtt() ;
pinMode(ProxSenPin、INPUT) は、
addInterrupt(digitalPinToInterrupt(ProxSenPin)、availIsr、CHANGE)。
pinMode(生産性ピン、INPUT);
addInterrupt(digitalPinToInterrupt(生産性Pin)、prostIsr、 変更;
可用性 = デジタル読み取り(ProxSenPin)?0:1;
遅延(25);
お問い合わせ
void loop()
お問い合わせ
epochTime = epochTime + 1;
AvailabilityValues[valueIndex] = 利用可能;
valueIndex ++;
//部分の終端の時間で生産データを公開する
もし(produceFlag)
お問い合わせ
DynamicJsonDocument jsonDocument1(1000)。
文字列 json 生産性;
createFlag = false ;
jsonDocument1["production_status"] = 1;
jsonDocument1["timestamp"] = epochTime;
serializeJson(jsonDocument1,json生産性);
もし(!client.connected())
お問い合わせ
connectToMqtt() ;
お問い合わせ
client.publish("ProxSen/productivity",jsonProductivity.c_str());) );
お問い合わせ
//5秒毎に機械の状態を公開
if(millis() - 現在のMilis1 >= 5000)
お問い合わせ
現在のMillis1 =ミリシス();
DynamicJsonDocument jsonDocument2(1000)。
文字列 json AvailStatus;
jsonDocument2["machine_status"] = 利用可能;
jsonDocument2["timestamp"] = epochTime;
serializeJson(jsonDocument2,jsonAvailStatus) ;
もし(!client.connected())
お問い合わせ
connectToMqtt() ;
お問い合わせ
client.publish("ProxSen/machine_status", jsonAvailStatus.c_str());) );
お問い合わせ
遅延(1000);
お問い合わせ

MQTT 5のため

#include <Arduino.h>
#include <WiFi.h>
#include <AsyncMqttClient.h>
#include <ArduinoJson.h>
#"time.h" を含む
// WiFi 認証
const char* ssid = "your_SSID"; // WiFi SSID で置換する
const char* パスワード = "your_PASSWORD"; // WiFi で置換する パスワード
// MQTT ブローカーの設定 const char* mqtt_server = "public-mqtt-broker.bevywise.com"; // MQTTブローカー サーバー名
const uint16_t mqtt_port = 1883; // MQTT ブローカーポート (使用 1883 のための 非TLS)
const char* mqtt_user = "your_mqtt_username"; // MQTT ブローカーのユーザー名
const char* mqtt_password = "your_mqtt_password"; // MQTT ブローカー パスワード
// MQTT クライアントの設定
const char* client_id = "ESP32Client";
AsyncMqttClient mqttClient;
WiFiClientのwifiClient;
unsigned 長い epochTime = 0;
unsigned 長い流れ Millis1 = 0;
const char* ntpServer = "time.google.com";
const int ProxSenPin = 33; // 可用性ステータスピン
生産性を削減 ピン = 26; // 生産性ステータスピン
const unsigned 長い集計 インターバル = 60000; // 1分
unsigned int 空室状況[60]; // 1の可用性値を保存する
unsigned int valueIndex = 0;
int の可用性 = 0;
boolの農産物 フラグ = false;
void IRAM_ATTR リファレンス
可用性 = デジタルRead(ProxSenPin) ? 0 : 1; // 逆論理(負) ロジック)
お問い合わせ
void IRAM_ATTR 生成Isr() {
createFlag = デジタル読み取り(生産性ピン)? 偽 : true;
お問い合わせ
void connectToMqtt() ディレクティブ
Serial.println("MQTTに接続...");
mqttClient.connect() は、
お問い合わせ
unsigned 長い getTime() {
time_t 今;
struct tm timeinfo;
もし(!getLocalTime(&timeinfo)) お問い合わせ
Serial.println(「時間を取得することができません」);
getTime() ;
お問い合わせ
時間(&now);
今すぐ返品
お問い合わせ
onMqttConnect(bool sessionPresent) を無効にします。
Serial.println(「MQTTに接続」)
Serial.print("セッションプレゼント");
Serial.println(セッションプレゼント)
// 必要に応じて必要なトピックを購読する
mqttClient.subscribe(「ProxSen/#」);
// 接続時に公開する例(必要に応じて)
文字列 メッセージ = "こんにちは、MQTT!";
mqttClient.publish("ProxSen/test", 0, false, message.c_str()); );
お問い合わせ
void onMqttDisconnect(AsyncMqttClientDisconnectReason 理由) {
Serial.println(「MQTTから切断」)
もし (WiFi.isConnected())) お問い合わせ
connectToMqtt() ;
お問い合わせ
お問い合わせ
void の設定() お問い合わせ
Serial.begin(115200)。
WiFi.mode(WIFI_STA)
WiFi.begin(ssid、パスワード);
間 (WiFi.status() != WL_CONNECTED(接続済み)
遅延(500);
Serial.print(""); ;
お問い合わせ
Serial.println(「WiFi接続」);
mqttClient.setServer(mqtt_server、mqtt_port)。
mqttClient.setCredentials(mqtt_user、mqtt_password) は、
mqttClient.setClientId(クライアントID)
mqttClient.onConnect(onMqttConnect)。
mqttClient.onDisconnect(onMqttDisconnect)
// MQTT 5 の設定 (オプション)
mqttClient.setCleanSession(true); // // // // クリーンなセッションをtrueまたはfalseに設定する あなたの条件に基づく
// MQTTブローカーに接続する
connectToMqtt() ;
// 可用性と生産性ピンのセットアップ中断
pinMode(ProxSenPin、INPUT) は、
addInterrupt(digitalPinToInterrupt(ProxSenPin)、availIsr、CHANGE)。
pinMode(生産性ピン、INPUT);
addInterrupt(digitalPinToInterrupt(生産性Pin)、prostIsr、 変更;
可用性 = デジタル読み取り(ProxSenPin) ? 0 : 1;
遅延(25);
お問い合わせ
void loop() お問い合わせ
epochTime = epochTime + 1;
AvailabilityValues[valueIndex] = 利用可能;
valueIndex ++;
// createFlag が設定されているときに生産性データを公開する
もし(produceFlag) {
DynamicJsonDocument jsonDocument1(1000)。
文字列 json 生産性;
createFlag = false ;
jsonDocument1["production_status"] = 1;
jsonDocument1["timestamp"] = epochTime;
serializeJson(jsonDocument1、json生産性);
もし(mqttClient.connected()) お問い合わせ
mqttClient.publish("ProxSen/productivity", 0, false, jsonProductivity.c_str() );
お問い合わせ
お問い合わせ
// 5秒ごとにマシンのステータスを公開
if (millis() - 現在のMillis1 >= 5000) {
現在のMillis1 =ミリシス();
DynamicJsonDocument jsonDocument2(1000)。
文字列 json AvailStatus;
jsonDocument2["machine_status"] = 利用可能;
jsonDocument2["timestamp"] = epochTime;
serializeJson(jsonDocument2、jsonAvailStatus) ;
もし(mqttClient.connected()) お問い合わせ
mqttClient.publish("ProxSen/machine_status", 0, false, jsonAvailStatus.c_str() );
お問い合わせ
お問い合わせ
// MQTT クライアントライブラリを扱い、メッセージ処理を続けます
もし(mqttClient.connected()) お問い合わせ
mqttClient.loop(); ;
お問い合わせ
connectToMqtt() ;
お問い合わせ
遅延(1000);
お問い合わせ

実行可能なバンドルを作成する

コードをESP32にフラッシュする手順

続いて、コードを ESP32 プロセッサーにアップロードする手順は次のとおりです。

  • ボードの準備: ブートボタンを押したまま、リセットを押します ボタン。
  • ボードとポートを選択します: [ツール] に移動し、[ポート] に移動し、ESP32 dev モジュールを選択します。 ボードと正しいCOMポート。 使用ポートがわからない場合は、選択してみてください 作品かどうかを調べる
  • コードを確認します。左上隅にあるVerifyアイコンをクリックしてコードをコンパイルします。 エラーのチェック
  • コードをアップロード: アップロードアイコンをクリックして、コードを再びコンパイルし、それをプッシュします ESP32。
  • 出力を確認してください。 シリアルモニターを開き、出力を確認します。 出力がない場合 gibberishは、コードとシリアルに一致させるためにバウドレートを変更する必要があるかもしれません モニター。

クライアントを最先端のアートに接続MQTTブローカーまたはあなたの選択のブローカー。 この強力な組み合わせは、最適なパフォーマンスを保証します すべてのメッセージングニーズの信頼性、堅牢で効率的な方法の舗装 システム統合。