2022年1月2日日曜日

mqtt service (esp32 and esp8266)

ーーーーーーーicecream free server ーーーーーーーーーーーーーーーーーーーーーーー

MQTTについてのまとめ — そこはかとなく書くよん。 ドキュメント (tdoc.info)

 https://take6shin-tech-diary.com/mqtt/ localでmqttブローカをたちあげる

一つの窓でブローカ開始してPub、もう一つの窓でSub 

Subは自動ダウンなし 購読しっぱなし Pubは、一回の出版ごとに自動ダウン

MQTTbrokerを使ってみる(その1)準備編|ゆう|note 無料のbroker記事

MQTTbrokerを使ってみる(その2)通信編|ゆう|note 同上

username(*)はfseigojpなどといれる client_idはランダムに出されている

username(no*)にicecreamといれ mqttxでmqtt.uko.jpにコネクト!

まずtopic名をきめてsubscribeしておく あとは、それに対してpublishするだけ

-------------node.js mqtt -------------------------test.mosquitto.org--------------------------------------

https://blog.mitsuruog.info/2015/02/what-mqtt.html を参考に

mqttxでanonymous接続してからsubscriptionでpresenceをつくると

node hello_mqtt.js のやりとりが観察できた

----------------bash mqtt ----public-mqtt5-broker----------------------------------------------------

https://qiita.com/ekzemplaro/items/0a03a96c2f5a5ba2ae55

------------------esp8266 for public mqtt server -------

コードではpublishしてsubscribeしてますが、publishは成功しませんでした
mqttxというclient appにesp8266-clientというusernameで入り、esp8266/testというtopicを
つくって適当なメッセージをpublishすると、arduinoのシリアルモニタで観察できました
今週末は、別のアルディーノでpublishして、同様になるか実験。。。

その後、次のように、したらうまくいった(セットアップでサブして、ループでパブ)
esp32でも同じだと思う ただ現実には自分でなげてうけるのは意味がない 
サブとパブは、本来別々のマイコンでうごくべき!

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

const char *ssid = ""; // Enter your WiFi name
const char *password = "";  // 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.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.publish("esp8266/test", "hello emqx");
    client.loop();
    delay(1000);
}

-ーーーーーーesp32でフリーのMQTTを利用するーーtest.mosquitto.orgーーー

https://programresource.net/2020/05/23/3332.html : パブサブOK)

mqttxでanonymous loginしてESP32/TEST/TOPICをサブスクライブしておき

同時にESP32/TEST/TOPICをパブリッシュするようにしておく

あとは以下のコードを実行すると、コードからパブリッシュされるtest publishが

自動的にコードのサブスクライブを呼ぶ またmqttxでパブリッシュしたときは

それが自動的にコードのサブスクライブを呼ぶ

#include <PubSubClient.h>

#include <WiFi.h>


char ssid[] = "";

char pass[] = "";


const char* mqtt_server = "test.mosquitto.org";

const char* mqtt_topic = "ESP32/TEST/TOPIC";


WiFiClient mqttClient;

PubSubClient client(mqttClient);

char mqtt_clientid[32]; // uniqueである必要がある


void callback(char* topic, byte* payload, unsigned int length) {

    char payload_ch[32];

    int chlen = min(31, (int)length);

    memcpy(payload_ch, payload, chlen);

    payload_ch[chlen] = 0; // payload_chがc言語で扱える文字列となる

    Serial.println(payload_ch);

} //ここはsubscribeで起動されるコード片



void wait_mqtt() {

    if (!client.connected()) {

        Serial.print("Waiting MQTT connection...");

        while (!client.connected()) { // 非接続のあいだ繰り返す

            if (client.connect(mqtt_clientid)) { // ここでuniqueなmqtt_clientidで接続する

                client.subscribe(mqtt_topic); // ここで購読がセットされる

            } else {

                delay(2000);

            }

        }

        Serial.println("connected");

    }

}



void setup() {

    Serial.begin(115200);

    Serial.print("connecting wifi");

    WiFi.mode(WIFI_STA); // station mode 

    if (String(WiFi.SSID()) != String(ssid)) {

        WiFi.begin(ssid, pass);


    }

    WiFi.setSleep(false); // sleep omitted? 多分

    while (WiFi.status() != WL_CONNECTED) {

        delay(500);

        Serial.print(".");

    }

    Serial.println("connected");

    byte mac_addr[6];

    WiFi.macAddress(mac_addr);

    sprintf(mqtt_clientid, "ESP32CLI_%02x%02x%02x%02x%02x%02x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);

    // ここでマックアドレスを用いてuniqueなclient_idを作成

    client.setServer(mqtt_server, 1883); // websocketでない場合のポート番号は1883

    client.setCallback(callback);

}


void loop() {

    int c ;

    wait_mqtt();

    client.loop();

    client.publish(mqtt_topic, "test publish"); //送信はこうで、自動的に購読のcallbackが呼ばれる

    Serial.println("sub");

    delay(1000);

}

ーーーーーabout esp8266 -- local mosquitto broker --一番現実的かも

https://tiagohorta1995.medium.com/mosquitto-mqtt-broker-and-esp8266-communcation-in-6-easy-steps-5ea0efae5a10 でローカルのmqtt brokerを

うごかしての記録 mossquitto.confを自作して再起動して成功  conf :: 以下の2行だけ

listener 1883

allow_anonymous true

アルディーノのコードはこれ やはりpublishとsubscribeは同居できんかった

別窓からパブしてOKだった

#include <ESP8266WiFi.h>

#include <PubSubClient.h>

// WiFi 

const char *ssid = "184F32CF8BF3-2G"; // Enter your WiFi name

const char *password = "2215085363556";  // Enter WiFi password

// MQTT Broker

const char *mqtt_broker = "192.168.3.9"; // get by hostname -I 

const char *topic = "test/topic";

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()) {

 String client_id = "esp8266-client-";

 client_id += String(WiFi.macAddress());

 

 Serial.printf("The client %s connects to mosquitto mqtt broker\n", client_id.c_str());

 

 if (client.connect(client_id.c_str())) {

  Serial.println("Public emqx mqtt broker connected");

 } else {

  Serial.print("failed with state ");

  Serial.print(client.state());

  delay(2000);

 }

}

 

 // publish and subscribe

 client.publish(topic, "Hello From ESP8266!");

 client.subscribe(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(" - - - - - - - - - - - -");

}

void loop() {

 client.loop();

}


0 件のコメント:

コメントを投稿