5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ESP8266を無料のパブリックMQTTサーバーに接続する

Last updated at Posted at 2020-10-03

MQTTは、軽量なIoTメッセージ交換およびデータ転送することができるプロトコルです。IoT開発者向けの柔軟化なハードウェア・ネットワークのリソースをバランス良く管理する目的に特化しました。

ESP8266は、高度に統合されたWi-Fi SoCソリューションを提供し、低消費電力、コンパクトなデザイン、高い安定性でユーザーのニーズに応えています。ESP8266は、完全な独立したWi-Fiネットワーク機能を備えており、スタンドアロンでも他のホストMCU上のスレーブとしても使用できます。

今回は、ESP8266をEMQ X MQTT Cloudが運営と保守する無料のパブリックMQTTサーバーに接続し、Arduino IDEを使用してESP8266をプログラミングします。 EMQ X CloudはEMQによって、安全なMQTT IoTクラウドサービスプラットフォーム、運用・保守をワンストップ、分離環境でMQTT 5.0に接続するサービスを提供します。

必要なIoTコンポーネント

  • ESP8266
  • Arduino IDE
  • MQTT X:クロスプラットフォームMQTT 5.0クライアントツール
  • 無料のパブリックMQTTサーバー
    • Broker: broker.emqx.io
    • TCP Port: 1883
    • Websocket Port: 8083

ESP8266 Pub / Sub 構成図

ESP8266.png

ESP8266コードライティング

1. まずは、ESP8266WiFiPubSubClientライブラリをインポートします。
ESP8266WiFiライブラリはESP8266をWi-Fiネットワークに接続できます。
PubSubClientライブラリはESP8266をMQTTサーバーに接続してメッセージをパブリッシュしたり、トピックをサブスクライブしたりします。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

2. Wi-Fi名とパスワード、MQTTサーバーの接続アドレスとポートを設定します

const char *ssid = "name"; // Enter your WiFi name
const char *password = "pass";  // Enter WiFi password
const char *mqtt_broker = "broker.emqx.io";
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()) {
    Serial.println("Connecting to public emqx mqtt broker.....");
    if (client.connect("esp8266-client")) {
       Serial.println("Public emqx mqtt broker connected");
    } 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はメッセージをパブリッシュして、トピックをサブスクライブします

// publish and subscribe
client.publish("esp8266/test", "hello emqx");
client.subscribe("esp8266/test");

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

MQTTサーバーの接続とテスト

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

2. MQTT XクライアントとMQTTサーバー間の接続を確立して、ESP8266にメッセージを送信します
mqttx_pub.png

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

完全なソースコード

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid = "name"; // Enter your WiFi name
const char *password = "pass";  // Enter WiFi password
const char *mqtt_broker = "broker.emqx.io";
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()) {
        Serial.println("Connecting to public emqx mqtt broker.....");
        if (client.connect("esp8266-client")) {
            Serial.println("Public emqx mqtt broker connected");
        } else {
            Serial.print("failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    // publish and subscribe
    client.publish("esp8266/test", "hello emqx");
    client.subscribe("esp8266/test");
}

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

まとめ

ここまで、ESP8266をEMQ X Cloudが提供するパブリックMQTTサーバーへ正常に接続しました。今回は、ESP8266をMQTTサーバに接続するだけです。これはESP8266の基本的な機能の一つであります。実際にESP8266はさまざまなIoTセンサーに接続して、センサーデータをMQTTサーバーに転送することもできます。

今後もIoT開発やESP8266についての記事を投稿していく予定です。次回も、お楽しみに!

5
6
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
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?