MQTTでRaspberryPiとESP32を通信してみる(その2)

今度は逆にESP32でSbunscribe(送信)、RaspberryPiでPublish(受信)してみます!💪

一応、前回の記事です。

1、RaspberryPiでPublishする

RaspberryでのPublishのプログラムも記載しておきますが、今回はclientツールを使ってコマンドでデバックしました。topicについては適当に設定しているので自分の環境に合わせてください。

⭐️pythonコード

from time import sleep
import paho.mqtt.client as mqtt
host = '127.0.0.1'
port = 1883
topic = 'mac/a'
# インスタンス作成時に protocol v3.1.1 を指定します
client = mqtt.Client(protocol=mqtt.MQTTv311)
client.connect(host, port=port, keepalive=60)
for i in range(3):
   client.publish(topic, 'testmessage')
   sleep(0.2)
client.disconnect()

⭐️コマンド

mosquitto_pub -h localhost -t tp1/sub1 -m Hello


2、ESP32でSubscribeする

前回のESP32でPublishするときのプログラムとほぼ同じものです。😊

どこが違うか、説明していきますね。

#include <WiFi.h>
#include <PubSubClient.h>
   // WiFi
   const char ssid[] = "your ssid";
   const char passwd[] = "your password";
   // Pub/Sub
   const char* mqttHost = "192.168.43.41"; // MQTTのIPかホスト名
   const int mqttPort = 1883;       // MQTTのポート
   WiFiClient wifiClient;
   PubSubClient mqttClient(wifiClient);
   const char* topic =  "tp1/sub1";     // リクエストするトピック名
   const char* topic2 = "tp1/sub2";     // リクエストするトピック名
   const char* topicesp = "esp/sub";     // リクエストするトピック名
   char* payload;                   // 受信データ
   /**
    * Connect WiFi
    */
   void connectWiFi()
   {
       WiFi.begin(ssid, passwd);
       Serial.print("WiFi connecting...");
       while(WiFi.status() != WL_CONNECTED) {
           Serial.print(".");
           delay(100);
       }
       Serial.print(" connected. ");
       Serial.println(WiFi.localIP());
   }
   /**
    * Connect MQTT
    */
    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 connectMqtt()
   {
       mqttClient.setServer(mqttHost, mqttPort);
       //subscride
       mqttClient.setCallback(callback);
       Serial.println("Connecting to MQTT...");
       
       while( ! mqttClient.connected() ) {
         
         //mqttClient.connect("ESP32Client", mqttUser, mqttPassword )      
           /*
           String clientId = "ESP32-" + String(random(0xffff), HEX);
           if ( mqttClient.connect(clientId.c_str()) ) {
               Serial.println("connected"); 
           }
           randomSeed(micros());
           */
           
           if ( mqttClient.connect("ESP32-1") ) {
               Serial.println("connected"); 
           }
           delay(1000);
   }
   //subscride
        mqttClient.subscribe(topic);
        mqttClient.subscribe(topic2);
}
   void setup() {
       Serial.begin(115200);
       pinMode(0, INPUT_PULLUP);     // Initialize the BUILTIN_LED pin as an output
       // Connect WiFi
       connectWiFi();
       // Connect MQTT
       connectMqtt();
       
   }
int count=0;
   void loop() {
  
       /*Publish機能はコメント
       int a=digitalRead(0);
         if(a==0) {
                  count++;
                  if(count > 250){count =250;}
         }else{
                  count=0;
          }
        if(count ==2){
         payload = "Hello ESP32";
         mqttClient.publish(topicesp, payload);
        }
      */

       delay(100);
       mqttClient.loop();  
   }

下記の行で、ターゲットのtopicが来たときに呼び出すモジュールを登録します。

 mqttClient.setCallback(callback);

こちらが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("-----------------------");
 }   

MQTT brokerにtopicを設定しています。前回解説した通りtopicを複数設定したい場合は下記のように追加していきます。

 mqttClient.subscribe(topic);
 mqttClient.subscribe(topic2);

初期設定が終わったら、下記をループに入れておけばMQTTbrokerにtopicが書き込まれたときにメッセージを受信することができます。

mqttClient.loop(); 

RasberryPiでPublishするとESP32でメッセージを受信できますね。💯

今回はやらないけど、受信したメッセージでLEDを光らせたりも簡単にできますね。💮

3、ESP32でPublishもSubscribeもする

今回はコメントにしてありましたが、この部分のコメントを外してやるとESP32でPub/Sub両方できるようになります。💮💮💮

/*Publish機能はコメント
       int a=digitalRead(0);
         if(a==0) {
                  count++;
                  if(count > 250){count =250;}
         }else{
                  count=0;
          }
        if(count ==2){
         payload = "Hello ESP32";
         mqttClient.publish(topicesp, payload);
        }
      */

4、まとめ

mosquittoでMQTTサーバーをLAN内に立てておけば、ローカルながらマイコン同士が簡単にコミュニケーションを取ることができます。

計測データを自動的にRaspberryPiに送りつけてpandasで処理しちゃうなんてことも簡単にできます。

調べてみるMQTTのスマホアプリもたくさんありますね。(いつか試したい)😃

MQTTbrokerサーバーは外部にもたくさんあるので、ゲートウェイ越しの通信も簡単にできるんです。(有料が多いけど)

とまぁ、今日はこのへんで

では✋

この記事が気に入ったらサポートをしてみませんか?