Несколько тем MQTT
У меня есть 3 nodemcu(ESP32), каждый из которых подключен к датчику, с которого я получаю данные и отправляю их в aws IoT-core. Как я могу отправить все данные 3 датчиков по одной подписке MQTT? Приведенный ниже код предназначен для одного MQTT с использованием одного nodemcu.
#include "SPIFFS.h"
#include <WiFiClientSecure.h>
#include <Wire.h>
#include <PubSubClient.h>
float V_0 = 5.0; // supply voltage to the pressure sensor
float rho = 1.204; // density of air
// parameters for averaging and offset
int offset = 0;
int offset_size = 10;
int veloc_mean_size = 20;
int zero_span = 2;
const char* ssid = ""; //Provide your SSID
const char* password = ""; // Provide Password
const char* mqtt_server = "a3mtl8k0aiowyx-ats.iot.us-east-2.amazonaws.com"; // Replace with your MQTT END point
const int mqtt_port = 8883;
String Read_rootca;
String Read_cert;
String Read_privatekey;
//=============================================================================================================================
#define BUFFER_LEN 256
long lastMsg = 0;
char msg[BUFFER_LEN];
int value = 0;
byte mac[6];
char mac_Id[18];
int count = 1;
int id=1;
//=============================================================================================================================
WiFiClientSecure espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP32-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish an announcement...
//client.publish("ei_out", "connection success");
// ... and resubscribe
client.subscribe("ei_in");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
for (int ii=0;ii<offset_size;ii++){
offset += analogRead(34)-(1023/2);
}
offset /= offset_size;
Serial.setDebugOutput(true);
// initialize digital pin LED_BUILTIN as an output.
pinMode(2, OUTPUT);
setup_wifi();
delay(1000);
//=============================================================
if (!SPIFFS.begin(true)) {
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
//=======================================
//Root CA File Reading.
File file2 = SPIFFS.open("/AmazonRootCA1.pem", "r");
if (!file2) {
Serial.println("Failed to open file for reading");
return;
}
Serial.println("Root CA File Content:");
while (file2.available()) {
Read_rootca = file2.readString();
Serial.println(Read_rootca);
}
//=============================================
// Cert file reading
File file4 = SPIFFS.open("/9bcef01134-certificate.pem.crt", "r");
if (!file4) {
Serial.println("Failed to open file for reading");
return;
}
Serial.println("Cert File Content:");
while (file4.available()) {
Read_cert = file4.readString();
Serial.println(Read_cert);
}
//=================================================
//Privatekey file reading
File file6 = SPIFFS.open("/9bcef01134-private.pem.key", "r");
if (!file6) {
Serial.println("Failed to open file for reading");
return;
}
Serial.println("privateKey File Content:");
while (file6.available()) {
Read_privatekey = file6.readString();
Serial.println(Read_privatekey);
}
//=====================================================
char* pRead_rootca;
pRead_rootca = (char *)malloc(sizeof(char) * (Read_rootca.length() + 1));
strcpy(pRead_rootca, Read_rootca.c_str());
char* pRead_cert;
pRead_cert = (char *)malloc(sizeof(char) * (Read_cert.length() + 1));
strcpy(pRead_cert, Read_cert.c_str());
char* pRead_privatekey;
pRead_privatekey = (char *)malloc(sizeof(char) * (Read_privatekey.length() + 1));
strcpy(pRead_privatekey, Read_privatekey.c_str());
Serial.println("================================================================================================");
Serial.println("Certificates that passing to espClient Method");
Serial.println();
Serial.println("Root CA:");
Serial.write(pRead_rootca);
Serial.println("================================================================================================");
Serial.println();
Serial.println("Cert:");
Serial.write(pRead_cert);
Serial.println("================================================================================================");
Serial.println();
Serial.println("privateKey:");
Serial.write(pRead_privatekey);
Serial.println("================================================================================================");
espClient.setCACert(pRead_rootca);
espClient.setCertificate(pRead_cert);
espClient.setPrivateKey(pRead_privatekey);
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
//====================================================================================================================
WiFi.macAddress(mac);
snprintf(mac_Id, sizeof(mac_Id), "%02x:%02x:%02x:%02x:%02x:%02x",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
Serial.print(mac_Id);
//=====================================================================================================================
}
void loop() {
float adc_avg = 0;
float veloc = 0.0;
// average a few ADC readings for stability
for (int ii=0;ii<veloc_mean_size;ii++){
adc_avg+= analogRead(34)-offset;
}
adc_avg/=veloc_mean_size;
// make sure if the ADC reads below 512, then we equate it to a negative velocity
if (adc_avg>512-zero_span and adc_avg<512+zero_span){
} else{
if (adc_avg<512){
veloc = -sqrt((-10000.0*((adc_avg/1023.0)-0.5))/rho);
} else{
veloc = sqrt((10000.0*((adc_avg/1023.0)-0.5))/rho);
}
}
// Serial.println(veloc); // print velocity
// delay(10); // delay for stability
//===============================================
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
//=============================================================================================
//String macIdStr = mac_Id;
String sensor_id=String(id);
String Velocity = String(veloc);
snprintf (msg, BUFFER_LEN, "{\"sensor_id\" : \"%s\", \"Velocity\" : \"%s\"}", sensor_id.c_str(), Velocity.c_str());
//"{\"mac_Id\" : \"%s\", \"Velocity\" : %s, \"sensor_id\" : \"%s\"}"
Serial.print("Publish message: ");
Serial.print(count);
Serial.println(msg);
client.publish("ei_out", msg);
count = count + 1;
//================================================================================================
}
digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
ei_out-это тема, на которую я подписался в iot-core, Я хочу иметь еще один ei_out_1 от другого nodemcu
@Shridatha Hegde, 👍2
Обсуждение0
Смотрите также:
- Подключение ESP32 через MQTT
- Как получить список IP-адресов в локальной сети с помощью NodeMcu?
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Простой запрос GET с ESP8266HTTPClient
- Преобразование byte* в int в Arduino
- ESP32S v1.1 NodeMCU vs ESP32 DevKitV1
- Ethernet nodemcu
- esp32-cam публикует изображение в mqtt
"ei_out-это тема, на которую я подписался в iot-core, я хочу, чтобы у меня был еще один ei_out_1 от другого nodemcu" - Итак... есть еще один под названием ei_out_1...? Я не понимаю, о чем ты просишь. Если вы хотите отправить в другую тему, отправьте в другую тему., @Majenko
"Как я могу отправить все данные 3 датчиков по одной подписке MQTT?"...точно так же, как вы поместили бы три слова на один лист бумаги? .... Кстати, данные отправляются путем публикации, подписка предназначена для получения данных, @jsotola
Вы подписываетесь не на "ei_out", а только на тему "ei_in" (определена в " переподключение ()"). Что вы хотите, так это *опубликовать*. На данный момент вы используете только"ei_out" для публикации ("клиент.публикация ("ei_out") " в " цикле()`). Вы можете свободно создавать дополнительные разделы (с именами, отличными от "ei_out") для публикации данных с других датчиков., @StarCat
Публикация должна иметь явную тему. Подписка имеет два подстановочных знака"#", что означает что-либо ниже этого уровня в иерархии, и"+", что означает что-либо на следующем уровне иерархии. Разделение между иерархическими уровнями-это символ"/". Поэтому, если датчик один публикует "датчик/1/выход/temp1", а датчик два публикует "датчик/2/выход/temp1", вы можете подписаться на "датчик/+/выход/temp1" для чтения с обоих датчиков. Вы можете подписаться на " sensor/1/out/+", чтобы прочитать все, отправленное sensor one. Вы можете подписаться на " sensor/#", чтобы считывать любые выходные данные с любого датчика., @Dougie
измените `ei_out " и "ei_out_1" на "ei/out" и "ei/out/1", чтобы получить преимущества иерархической структуры тем. Единственная трудная часть этого материала-это разработка разумной и последовательной иерархии для ваших тем., @Dougie