2022-08-18

arduino mqtt - How to create multi device sequence? MQTT client rename

I am trying to create a small project on arduino (WeMos D1 mini). It is to be based on the communication of several devices with a computer using the MQTT protocol.

The protocol itself works great on arduino. I wrote a program that works as expected, at least at this stage of the project.

The problem is that it works fine on a single arduino. I need to create a network of devices.

Is it possible to execute the sequence on several devices communicating via MQTT?

Example: Own MQTT Broker on Raspberry Pi. Three Arduino (id: 001; 002; 003) with the same program. Is the sequence possible: I am sending a startup message from the computer to Arduino 001. The device does some work, then sends a log to the computer and a message to Arduino 002. Device 002 does the job, then sends a log to the computer and a message to Arduino 003. Device 003 does the job , then sends the log to the computer and completes the sequence.

Message from computer to Arduino 001 is sent to Topic device / 001, to Arduino 002 it is sent to Topic device / 002 and similarly to Arduino 003 it is sent to Topic device / 003.

Today I have a problem because when I run all Arduino's at the same time, only one is active on the network. the other two are unresponsive although the Broker receives the information. Why ?

So, after lond descriptions time for code:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <PubSubClientTools.h>
#include <Thread.h> 
#include <ThreadController.h>

#define WIFI_SSID           "MyNetwork"
#define WIFI_PASS           "123456789"
#define serial              9600
#define MQTT_SERVER         "192.168.8.107"
#define MQTT_PORT           1883

#define id_dev              "001"


WiFiClient espClient;
PubSubClient client(MQTT_SERVER, MQTT_PORT, espClient);
PubSubClientTools mqtt(client);

ThreadController threadControl = ThreadController();
Thread thread = Thread();

int value = 0;
const String s = "";
String service                  = "service"; 
String main_name                = "test"; 
String sub_main_name            = "test";
String info_name                = "test"; 
String sub_info_name            = "test";

void setup() {
  Serial.begin(serial);
  Serial.println("-| WiFi Connection |--------------------------------");
  setup_wifi();
  Serial.println("-| MQTT Connection |--------------------------------");

  Serial.print(s+"Connecting to MQTT: "+MQTT_SERVER+" ... ");
  if (client.connect("ESP8266Client")) {
    Serial.println("connected");

    mqtt.subscribe(service+"/"+id_dev,          topic_service); 
    mqtt.subscribe(main_name,                   topic_main_name);
    mqtt.subscribe(info_name,                   topic_info_name);
  } else {
    Serial.println(s+"failed, rc="+client.state());
  }

  // Enable Thread
  // thread.onRun(publisher);
  thread.setInterval(2000);
  threadControl.add(&thread);

  Serial.println("----------------------------------------------------");
  Serial.println();
}

void loop() {
  client.loop();
  threadControl.run();
}

void setup_wifi() {
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void publisher() {
  ++value;
  mqtt.publish("test/001", s+"Hello World! - No. "+value);
}

void topic_service(String topic, String message) {
  Serial.println(s+"Message arrived in function 1 ["+topic+"] "+message);
  sub_main_name = message;
  subscription(sub_main_name);
}

void topic_main_name(String topic, String message) {
  Serial.println(s+"Message arrived in function 2 ["+topic+"] "+message);
  if (message == "111") {
    Serial.println("Is OK!");
    String message_sent = "111";
    mqtt.publish(sub_main_name+"/002", message_sent);
  } else {
    Serial.println("Something wrong!");
  }
}
void topic_info_name(String topic, String message) {
  Serial.println(s+"Message arrived in function 3 ["+topic+"] "+message);
  sub_info_name = message;
}

void subscription(String wiadomosc){
  if(main_name != wiadomosc){
    Serial.println("main_name: " + main_name + " | sub_main_name: " + sub_main_name +" <- for change");
    main_name = sub_main_name+"/"+id_dev;
    info_name = sub_main_name+"/"+id_dev+"/i";
    mqtt.subscribe(main_name, topic_main_name);
    mqtt.subscribe(info_name, topic_info_name);
  }
}

//----------------------------------------------------

The same code will be uploaded to all devices, diferent will be only ID (id_dev). This is a simple version of my program but it still not working well. On one device is ok but if I run two or more... only lastone is active. The rest are dosn't work (are not visible in network).

I need help getting a network of these devices up and running and communicating between them.



No comments:

Post a Comment