Меню

Void callback const mqtt publish pub ошибка

Hi Addi, first of all thanks for sharing i am starting with this awesome
world and your work is really something to start at.

I am getting this error when verifying the code with arduino ide. What´s
wrong? Might be a syntax issue with the new ide?

Thanks in advance

Javier

Arduino:1.6.9 (Windows 7), Tarjeta:»Generic ESP8266 Module, 80 MHz, 40MHz,
DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None»

ESP8266_mqtt_relay_ADITYA:14: error: ‘MQTT’ does not name a type

void callback(const MQTT::Publish& pub) {

ESP8266_mqtt_relay_ADITYA:14: error: expected unqualified-id before ‘&’
token

void callback(const MQTT::Publish& pub) {

ESP8266_mqtt_relay_ADITYA:14: error: expected ‘)’ before ‘&’ token

ESP8266_mqtt_relay_ADITYA:14: error: expected initializer before ‘pub’

void callback(const MQTT::Publish& pub) {

ESP8266_mqtt_relay_ADITYA:14: error: ‘MQTT’ does not name a type

void callback(const MQTT::Publish& pub) {

ESP8266_mqtt_relay_ADITYA:14: error: expected unqualified-id before ‘&’
token

void callback(const MQTT::Publish& pub) {

ESP8266_mqtt_relay_ADITYA:14: error: expected ‘)’ before ‘&’ token

ESP8266_mqtt_relay_ADITYA:14: error: expected initializer before ‘pub’

void callback(const MQTT::Publish& pub) {

exit status 1
‘MQTT’ does not name a type

Este reporte podría tener más información con
«Mostrar salida detallada durante la compilación»
opción habilitada en Archivo -> Preferencias.


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
#1, or mute the thread
https://github.com/notifications/unsubscribe/AAtdagRaj50KL_jBHjxZxHniCVsVWj7Hks5qSnHcgaJpZM4JFNhf
.

PlatformIO Community

Loading

  • #1

Пытаюсь работать с библиотекой PubSubClient, модуль ESP8266 Wemos D1.
Получаю данные от Ардуино по UART.
С интервалом 5 сек посылаю на MQTT broker Mosquitto порядка 10 метрик, используя для этого функцию client.publish(topic, value).
Столкнулся со странной особенностью, а именно если предварительно подписаться на отсылаемую тему методом client.subscribe(topic), то публикация значений в эту тему (отработка метода client.publish) происходит за в среднем 3 миллисекунды, хотя бывают и задержки. Если же не подписываться, то метод отрабатывает за 200!!! миллисекунд. Это из-за чего так? Можно ли как-нибудь ускорить работу метода публикации?

Последнее редактирование: 29 Сен 2016

Сергей_Ф


  • #2

@max506 могу только предположить, что подписка устанавливает и держит соединение с сервером. Без подписки соединение переустанавливается каждую публикацию — вот и тратится время на это. Код не смотрел, могу ошибаться.

  • #3

Вот код, которым я пользуюсь

Код:

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


const char *ssid = "......";  // Имя вайфай точки доступа
const char *pass = "......";  // Пароль от точки доступа

const char *mqtt_server =  "......";  // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "";
const char *mqtt_pass = "";

String subscr_topic = "/esp/topic1/";
String prefix = "/esp/";
String buf_recv;


WiFiClient wclient;   
PubSubClient client(wclient, mqtt_server, mqtt_port);


// Функция получения данных от MQTT брокера
void callback_subscr(const MQTT::Publish &pub)
{

  String topic = pub.topic();
  String value = pub.payload_string();


  if( topic.substring(0,subscr_topic.length()) == subscr_topic)   // передаем в UART только данные, на которые подписывались
     Serial.println(topic.substring(subscr_topic.length())+"="+value);
   
}


// Отправка данных на MQTT брокер
void Send(){

  char ch;
  String pub_topic;
  String val;
  int pos_delim;
  long t;

    // полчение данных по UART от Arduino
    while (Serial.available()) {

      ch = (char)Serial.read();
    
      if (ch == 'r') continue;

      if (ch == 'n') {
   
        // Данные приходят в виде строк в формате <тема>=<значение>
        pos_delim = buf_recv.indexOf('=');
        pub_topic = buf_recv.substring(0,pos_delim);
        val = buf_recv.substring(pos_delim+1);

        
        // #### Вызов метода публикации "виснет" на 200 миллисекунд, если предварительно не подписаться на публикуемую тему !!!!!
        t=millis();
        client.publish(prefix+pub_topic,val);
        Serial.println(millis()-t);
     
     
        buf_recv="";
        break;
      }
     
      buf_recv += ch;

    }
}


void setup() {

  Serial.begin(9600);

}

void loop() {

  // подключаемся к wi-fi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }

  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if ( client.connect(MQTT::Connect("ESP_Witty").set_auth(mqtt_user, mqtt_pass)) ) {
        Serial.println("Connected to MQTT server");
        client.set_callback(callback_subscr);
        client.subscribe(subscr_topic+"#"); // подписывааемся на темы с изменяемыми данными
                     
      } else {
        Serial.println("Could not connect to MQTT server");
      }
    }

    if (client.connected()){
   
      client.loop();
  
      Send();
    }
 
  }

}

  • #4

могу только предположить, что подписка устанавливает и держит соединение с сервером. Без подписки соединение переустанавливается каждую публикацию — вот и тратится время на это.

А может кто-нибудь код глянуть, я не очень понимаю в библиотеках классов.
Может есть возможность не подписываться на все темы и при этом публиковать сообщения, на которые не подписан, с нормальной скоростью.

  • #5

А может кто-нибудь код глянуть, я не очень понимаю в библиотеках классов.
Может есть возможность не подписываться на все темы и при этом публиковать сообщения, на которые не подписан, с нормальной скоростью.

Смотрю вы пользуетесь той же библиотекой pubsubclient, что и я. Этих библиотек есть 2 вида, та что мы с вами используем самая редкая, и есть др. которой все пользуются, она доступна в репазитории arduino ide методы ее использования в скетче различаются с нашей. Наша построена на объекте класса String — все текстовые строки, а та что самая популярная на строках char*.
Мною были замечены баги и в той и в той библиотеке, в нашей с вами — если в один из топиков на каторый мы подписаны быстро засыпать данные, например нажимая быстро одну и туже кнопку в приложении или дергать слайдер в приложении с которого не преривно сыпятся данные, то esp8266 виснет намертво и даже не ребутит. В др. библиотеке что есть в IDE если взять даже стандартный пример mqqt_pablish_in_callback и дописать в его с дисяток подписок, то модуль esp начинает уже виснуть на 5 подписке где-то, а далее ребутит.

  • #6

Попробуйте использовать версию менеджера плат esp8266 не последнюю, а 2.0.0. С ней намного устойчивее работает.

  • #7

Попробуйте использовать версию менеджера плат esp8266 не последнюю, а 2.0.0. С ней намного устойчивее работает.

Да я последнюю (2.2.3) и не использую. Я использую 2.2.0

  • #8

Да я последнюю (2.2.3) и не использую. Я использую 2.2.0

Попробуй перейти на 2.0.0

  • #9

Попробуй перейти на 2.0.0

Ок. Папробую.

Реально это практически полностью помогло, решить проблему с зависанием если быстро засыпать данными в топик. Сейчас как бы тоже видно будто бы подвисает, но не намертво спустя пару секунд само атдупляется. :)

Последнее редактирование: 26 Дек 2016

  • #10

можно ли как-нибудь ускорить работу метода публикации?

Ура, ура, меня осинило :) Наконец то понял в чем были все проблеммы с зависанием, они были как раз в этом что вы описали. На отправку одного исходящего сообщения действительно уходит много времени и если нужно подрят отправить до 10 или более исходящих сообщений то цикл void loop давольно сильно на долго преривается может на сек 2 — 3 (с 11 -ю сообщениями).
У меня в это время (раз в 5 сек) все остальные функции скетча очень сильно подвисало. И наконец то мне пришла в голову идиальная идея, как получить преривание loop длительностью всего в 1 сообщение (не важно сколько их будет).
В общем решение хитрое, нужно сделать так что бы за один цикл void loop отправлялось только одно сообщение, все последующие распределены по 1 шт, на 1 цикл void loop. В кратце: что бы отправить 10 сообщений нужно что бы цикл void loop повторился 10 раз.
С таким подходом все работает гораздо быстрей. Раз в 5 сек начинает отправлятся 10 (у меня даже 11) исходящих сообщений, за 11 циклов void loop, после чего таймер обнуляется вновь что бы вновь через 5 сек все повторилось.

  • #11

нужно сделать так что бы за один цикл void loop отправлялось только одно сообщение

Ну у меня в коде так и сделано. Выгребаю из Serial порта полностью одно сообщение, отправляю, затем снова Loop и снова чтение из Serial порта.

  • #12

@max506, ну в общем то я и др. самую знаменитую библиатеку pubsubclient точно так же победил, но только там тот же косяк был с подписками, сделал так что бы создавалась только одна подписка за цикл loop, и в общем то библиотека работает довольно таки быстро, ничего не виснет, отправляю в тэст — примере 8 исходящих сообщений (на которые сама библиотека не подписана) и все за один цикл loop.
И что нам сейчас делать? Так лень переписывать огромный скетч под др. либу. :)

  • #14

@krepton85 Тоже столкнулся с такой проблемой, 5 топиков шлет без проблем, на 6 виснет. Скетчем не поделитесь?

  • #18

@krepton85
Спасибо, все получилось, еще бы научили push уведомления отправлять.

  • #19

Вот код, которым я пользуюсь

Код:

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


const char *ssid = "......";  // Имя вайфай точки доступа
const char *pass = "......";  // Пароль от точки доступа

const char *mqtt_server =  "......";  // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "";
const char *mqtt_pass = "";

String subscr_topic = "/esp/topic1/";
String prefix = "/esp/";
String buf_recv;


WiFiClient wclient; 
PubSubClient client(wclient, mqtt_server, mqtt_port);


// Функция получения данных от MQTT брокера
void callback_subscr(const MQTT::Publish &pub)
{

  String topic = pub.topic();
  String value = pub.payload_string();


  if( topic.substring(0,subscr_topic.length()) == subscr_topic)   // передаем в UART только данные, на которые подписывались
     Serial.println(topic.substring(subscr_topic.length())+"="+value);
 
}


// Отправка данных на MQTT брокер
void Send(){

  char ch;
  String pub_topic;
  String val;
  int pos_delim;
  long t;

    // полчение данных по UART от Arduino
    while (Serial.available()) {

      ch = (char)Serial.read();
  
      if (ch == 'r') continue;

      if (ch == 'n') {
 
        // Данные приходят в виде строк в формате <тема>=<значение>
        pos_delim = buf_recv.indexOf('=');
        pub_topic = buf_recv.substring(0,pos_delim);
        val = buf_recv.substring(pos_delim+1);

      
        // #### Вызов метода публикации "виснет" на 200 миллисекунд, если предварительно не подписаться на публикуемую тему !!!!!
        t=millis();
        client.publish(prefix+pub_topic,val);
        Serial.println(millis()-t);
   
   
        buf_recv="";
        break;
      }
   
      buf_recv += ch;

    }
}


void setup() {

  Serial.begin(9600);

}

void loop() {

  // подключаемся к wi-fi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }

  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if ( client.connect(MQTT::Connect("ESP_Witty").set_auth(mqtt_user, mqtt_pass)) ) {
        Serial.println("Connected to MQTT server");
        client.set_callback(callback_subscr);
        client.subscribe(subscr_topic+"#"); // подписывааемся на темы с изменяемыми данными
                   
      } else {
        Serial.println("Could not connect to MQTT server");
      }
    }

    if (client.connected()){
 
      client.loop();
 
      Send();
    }
 
  }

}

А у вас есть пример скетча для ардуины, на получения данных по UART ??

  • #20

Товарищи, помогите пожалуйста с решением задачки, у меня схожая проблема. Написал скетч который запоминает состояние после включениявыключения реле на esp8266-01S, и вносит его в EEPROM, после нештатного выключения электричества реле возвращается в исходное состояние. Т.е. после подачи питания мне нужно передать состояние на MQTT-сервер. В сущности, pubSubClientPublishing() нужно вызвать до pubSubClientSubscribe(), потому как pubSubClientSubscribe() следит за топиком и соответственно включает или выключает если в топике появляется 0 или 1. Скетч мой работает, но работает только после того как вызвана функа подписки. Пробовал делать паузу, т.к. было подозрение что публикация запускается раньше доступности сервера MQTT, потом подключил библиотеку 8266PING, после получения true на ответ сервера MQTT передает состояние в топик, и все равно не могу передать состояние (топик пустой), пока не будет выполнена подписка.

Offline

Зарегистрирован: 25.12.2015

добрый вечер всем нашёл этот скетч и обрадовался потому что это то что я и хотел но не тут было ни как не могу скомпилировать этот скетч , постоянно какие то ошибки сначала с библиотеками были вроде решил потом со строками 

EthernetClient ethClient; //ЗДЕСЬ КОМЕНТИРУЮ И КОПИРУЮ В ДРУГОЕ МЕСТО НИЖЕ

PubSubClient client(server, 1883, callback, ethClient);

перенёс их ниже как подсказали эта ошибка исчезла и вот теперь уже несколько дней мучаюсь с ошибкой 58 строка

DHT DHT; ошибка no matching function for call to ‘DHT::DHT()’

я думаю что проблема с библиотекой но я несколько установил проблема не исчезла . IDE 16.6

но пробовал и другие если кому не сложно выложите библиотеку DHT с которой этот скетч компилируется ну и заодно свой скетч и версию IDE. сейчас у меня ват такой скетч

#include <SPI.h> // Ethernet shield
#include <Ethernet.h> // Ethernet shield
#include <PubSubClient.h> // MQTT 
#include <Servo.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Servo servo;

byte mac[] = { 0xC1, 0x7C, 0x38, 0x41, 0x89, 0x12 };
byte server[] = { 192, 168, 1, 190 }; //IP Брокера
byte ip[] = { 192, 168, 1, 167 }; //IP Клиента (Arduino)


//EthernetClient ethClient; //ЗДЕСЬ КОМЕНТИРУЮ И КОПИРУЮ В ДРУГОЕ МЕСТО НИЖЕ
//PubSubClient client(server, 1883, callback, ethClient);
#define id_connect "myhome-kitchen"
#define Prefix_subscribe "myhome/Kitchen/"

///////////////Объявляем порты ввода-вывода
#define ServoPin 3 //Порт к которому подключен сервопривод

const int start_DI_pin [] = {2, 4, 5}; // Порты Ввода
int n_DI_pin = sizeof(start_DI_pin) / sizeof(start_DI_pin[0]) - 1; //Вычисляем длинну массива

const int start_DO_pin [] = {6, 7}; //Порты Вывода
int n_DO_pin = sizeof(start_DO_pin) / sizeof(start_DO_pin[0]) - 1; //Вычисляем длинну массива

int DI[] = {0, 0, 0};
int old_DI[] = {0, 0};

///////////////////////////Переменные для работы с освещением//////////////////////////////////////
int ServoAngle = 100; //Угол сервопривода при включении
int flag = 0;
int flag2 = 0;
int pause = 0;

//------------------------------------------- Sensors -------------------------------------------//
const int MQ7_Pin = A0; // Куда подключили MQ7
//int MQ7Value = 0;
int MQ7Value = analogRead(MQ7_Pin);


const int foto_Pin = A1; // устанавливаем входную ногу для Фоторезистора
//unsigned int fotoValue = 0; // цифровое значение фоторезистора
unsigned int fotoValue = analogRead(foto_Pin);

#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS_sensors(&oneWire);
// 28 FF F2 5C 53 15 2 97
DeviceAddress addr_T1 = { 0x28, 0xFF, 0xF2, 0x5C, 0x53, 0x15, 0x02, 0x97 };

float T1 = 0;

DHT DHT;
#define DHT22_PIN 9
float Hout = 0;
float Tout = 0;
//#define DHTPIN 2 // Номер пина, к которому подсоединен датчик
//#define DHTTYPE DHT22 // Задаём тип DHT датчика
//DHT dht(DHTPIN, DHTTYPE);


////////////////////////////////////////////////////////////////////////////
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '';
// Serial.print(topic);
// Serial.print("=");
String strTopic = String(topic);
String strPayload = String((char*)payload);
// Serial.println(strPayload);
callback_iobroker(strTopic, strPayload);
}

EthernetClient ethClient; //ЗДЕСЬ КОМЕНТИРУЮ И КОПИРУЮ В ДРУГОЕ МЕСТО НИЖЕ
PubSubClient client(server, 1883, callback, ethClient);
////////////////////////////////////////////////////////////////////////////
void setup() {
//Serial.begin(57600);
// Serial.println("start");
//Объявляем порты Digital inputs/outputs
for (int i = 0 ; i <= n_DI_pin; i++) {
pinMode (start_DI_pin [i], INPUT);
}
digitalWrite(5, HIGH); //Окно
digitalWrite(4, HIGH); //Объемник
for (int i = 0 ; i <= n_DO_pin; i++) {
pinMode (start_DO_pin [i], OUTPUT);
}

Ethernet.begin(mac, ip);
if (client.connect(id_connect)) {
getSensors();
control();
// client.publish("myhome/Kitchen/Change_Counter", "0");
// client.publish("myhome/Kitchen/Temp_room", "0");
// client.publish("myhome/Kitchen/Humidity_room", "0");
// client.publish("myhome/Kitchen/Temp_radiator", "0");
// client.publish("myhome/Kitchen/Temp_in", "0");
// client.publish("myhome/Kitchen/Lux", "0");
// client.publish("myhome/Kitchen/Servo", "0");
// client.publish("myhome/Kitchen/MQ7", "0");

client.subscribe("myhome/Kitchen/#");
}
}
/////////////////////////////////////////////////////////////////////////
void loop() {
client.loop();
control();
getSensors();
if (!client.connected()) {
if (client.connect(id_connect)) {
control();
getSensors();
client.subscribe("myhome/Kitchen/#");
}
}
}

и отдельно Functions

/////////////////////////////////От Брокера//////////////////////////////////////////////
void callback_iobroker(String strTopic, String strPayload){
  if (strTopic == "myhome/Kitchen/Servo"){
        ServoAngle=strPayload.toInt();
    if (ServoAngle >= 0 && ServoAngle <= 255){
          servo.attach(ServoPin);
          //delay(200); //ждем 2 секунды
          servo.write(ServoAngle); //ставим вал под 0
          delay(1000); //ждем 2 секунды
          //client.publish("myhome/Kitchen/Servo", b); 
          servo.detach();
    }
  }
}

////////////////////////////////////Брокеру/////////////////////////////////////
void control(){
  
       if(digitalRead(5)==HIGH && flag==0) { //если окно открыто
          client.publish("myhome/Kitchen/Window", "1");
          flag=1; 
       } 
       if(digitalRead(5)==LOW && flag==1){//если окно закрыто  
        client.publish("myhome/Kitchen/Window", "0");       
        flag=0;//обнуляем переменную flag 
       }   
       
       if(digitalRead(4)==HIGH && flag2==0) { // Если есть движение
          client.publish("myhome/Kitchen/Motion", "1");
          flag2=1; 
       } 
       if(digitalRead(4)==LOW && flag2==1){// Если нет движения
        client.publish("myhome/Kitchen/Motion", "0");       
        flag2=0;//обнуляем переменную flag 
       }          
}
///////////////////////////////Данные сенсоров////////////////////////////////////

void getSensors () {

  MQ7Value = analogRead(MQ7_Pin); 
  fotoValue = analogRead(foto_Pin);  // считываем значение с фоторезистора
// ServoAngle = analogRead(2);

//Обработка данных датчика DHT22. Подключение к порту цифровому P9 Arduino
//Глобальные переменные Hout и Tout типа флоат - влажность (%) и температура (град. С)
  if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
    Hout = DHT.humidity;
    Tout = DHT.temperature;
  }
  if (Hout == 0 || Tout == 0){
    delay (1000);
    if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
    Hout = DHT.humidity;
    Tout = DHT.temperature;
  }
  }
  //Обработка данных цифровых датчиков температуры типа DS18B20.
  //Шина 1-Wire на цифровой пин P8 Arduino.
  //Подключено 2 датчика температуры, адреса задаются в секции глобальных констант "Sensors"
  //Три значение температуры T1, T2, типа float (град. С).
  DS_sensors.requestTemperatures();
  T1 = DS_sensors.getTempC(addr_T1);
  
///////////////////////Паблик данных сенсоров////////////////////////
 if (pause == 50 || pause == 0){ 
   
  char b[5]; 
    String char_Hout = String(Hout);
    char_Hout.toCharArray(b,5);
    client.publish("myhome/Kitchen/Humidity_room", b);
    
  String char_Tout = String(Tout);
  char_Tout.toCharArray(b,5);
  client.publish("myhome/Kitchen/Temp_room", b);
  
    String char_T1 = String(T1);
    char_T1.toCharArray(b,5);
    client.publish("myhome/Kitchen/Temp_radiator", b);
      
    String char_fotoValue = String(fotoValue);
    char_fotoValue.toCharArray(b,4);
    client.publish("myhome/Kitchen/Lux", b);
    
  String char_ServoAngle = String(ServoAngle);
  char_ServoAngle.toCharArray(b,4);
  client.publish("myhome/Kitchen/Servo", b);
  
    String char_MQ7Value = String(MQ7Value);
    char_MQ7Value.toCharArray(b,4);
    client.publish("myhome/Kitchen/MQ7", b);
  
    pause = 1;
 }
 else pause++;
}

а вот скетч целиком http://forum.iobroker.net/download/file.php?id=2951

Можете подсказать отчего у меня всё так получается.

Заранее всем спасибо за ответы жду ответов

big_pig

2 / 2 / 0

Регистрация: 19.02.2019

Сообщений: 48

1

06.01.2020, 20:16. Показов 1962. Ответов 0

Метки lua (Все метки)


Здравствуйте не давно начал изучать платформу esp8266 в данном случае использую NodeMcu V2 Lua на чипах ESP8266 и CP2102 Когда я подключаюсь к MQTT серверу мне отладка выдает ошибку «MQTT — none» не однократно проверял строки с данными подключения но все еще не знаю где именно ошибка
Примечание в попытках подключения я использовал несколько серверов последний из которых не нуждается в логине и пароле http://www.mqtt-dashboard.com/index.html

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
#define MQTT_client "cjoaswat"
#define LED 2 // определяем пин светодиода
 
//Wifi
const char *ssid =  "Sheoq";  // Имя вайфай точки доступа
const char *pass =  "(SHEOQ)%9112"; // Пароль от точки доступа
 
//Сервер
const char *mqtt_server = "broker.hivemq.com"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = ""; // Логин от сервер
const char *mqtt_pass = ""; // Пароль от сервера 
 
const char *Sheoq_topic="test/on";
const char *data_topic="test/data"; // топик для данных
 
int pause = 300; // переменная для паузы между отправками данных
long int times=0; // для времени
 
void callback(const MQTT::Publish& pub)
{
    String topic = pub.topic();
    Serial.print(topic);                // выводим в сериал порт название топика
    Serial.print(" => ");
    String payload = pub.payload_string(); // чтение данных из топика
    Serial.print(payload);   // выводим в сериал порт значение полученных данных
    Serial.println(); 
    // действия над светодиодом в зависимости от данных из топика
    if (topic==Sheoq_topic) 
    {
    if (payload[0] == '0') digitalWrite(LED, LOW); 
    else if (payload[0] == '1') digitalWrite(LED, HIGH); 
    else if (payload[0] == '2') digitalWrite(LED, !digitalRead(LED)); 
    }
}
 
WiFiClient wclient;  
PubSubClient client(wclient, mqtt_server, mqtt_port);
 
void refreshData() {
  if (pause == 0) {
    times = millis(); // формируем данные для отправки
    client.publish(data_topic, String(times));
    pause = 3000; // пауза меду отправками 3 секунды
  }
  pause--;
  
  delay(1); 
}
 
void setup() 
{
  
  Serial.begin(115200);
  delay(10);
 
  
  pinMode(LED, OUTPUT);
}
 
void loop() 
{
  // подключаемся к wi-fi
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);
 
    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }
 
  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED) 
  {
    if (!client.connected()) 
    {
      Serial.println("Connecting to MQTT server...");
      if (client.connect(MQTT::Connect(MQTT_client) // если соединились то делаем всякое
                                 .set_auth(mqtt_user, mqtt_pass))) 
      {
        Serial.println("Connected to MQTT server");
        client.set_callback(callback);
        client.subscribe(Sheoq_topic); // подписываемся по топик с данными для светодиода
      } 
      else 
      {
        Serial.println("Could not connect to MQTT server");   
      }
    }
 
    if (client.connected())
    {
      client.loop();
      refreshData();
    }
  }
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



I have an MQTT server (Mosquitto) running on a RPi3. I also have a sensor array on my bench that publishes readings to MQTT every 5 seconds. All of this is working great.

Tonight, I wired up an ESP8266-01 to an Arduino Mega using one of the Mega’s extra hardware serial ports (rx1, tx1). I’m using two libraries in my sketch: (1) WiFiEsp and (2) PubSubClient. I’ve tried both O’Leary’s PubSubClient and Imroy’s branch off O’Leary’s PubSubClient. I get the same result with each.

When I power up my Mega with it’s ESP8266 shield, it connects to WiFi and the MQTT broker fine. However, its not receiving any messages. It also drops the connection to the MQTT broker every minute or so. It immediately reconnects. The blue transmit LED on the ESP8266 is cycling extremely fast. Way too fast for the message traffic on my MQTT server.

I’m using proper level shifting between the devices. When I put a scope on the Mega’s rx1, I see a continuous trace of data that only stops upon disconnect.

In a similar post here, ankur posted just yesterday that there is a bug in the callback. I think he’s probably referring to the PubSubClient library. PubSubClient is a very popular library that a lot of people are using. Can anyone comment further on the nature of the bug that ankur alluded to? I’ll post my code below.

If anyone else runs into this issue, I also tested another variant of this configuration. I put my WiFi client code and my MQTT client code directly on the ESP8266’s micro and connected the ESP8266 to an Arduino Uno via SoftwareSerial at 19200 baud. The connection to my MQTT server is rock solid and all messages are coming through flawlessly.

My code on the Mega follows:

#include <WiFiEsp.h>
#include <PubSubClient.h>

const char *ssid = "********";
const char *pass = "********";
int status = WL_IDLE_STATUS;

#define BUFFER_SIZE 100

IPAddress server(10, 0, 1, 6);

// initialize WiFi client
WiFiEspClient espClient;

// connect to mqtt server
PubSubClient client(espClient);

void callback(const MQTT::Publish& pub) {
    if (pub.has_stream()) {
        uint8_t buf[BUFFER_SIZE];
        int read;
        while (read = pub.payload_stream()->read(buf, BUFFER_SIZE)) {
            Serial.write(buf, read);
        }
        pub.payload_stream()->stop();
        Serial.println("");
    } else
        Serial.println(pub.payload_string());
}

void setup() {
    
    pinMode(19, INPUT_PULLUP);  // pull rx1 high

    Serial.begin(9600);
    Serial1.begin(9600);

    WiFi.init(&Serial1);

    // check for the presence of the shield
    if (WiFi.status() == WL_NO_SHIELD) {
        Serial.println("WiFi shield not present");
        // don't continue
        while (true);
    }

    // attempt to connect to WiFi network
    while (status != WL_CONNECTED) {
        Serial.print("Attempting to connect to WPA SSID: ");
        Serial.println(ssid);
        // Connect to WPA/WPA2 network
        status = WiFi.begin(ssid, pass);
    }
    Serial.println("You're connected to the network");
}

void loop() {
    if (!client.connected()) {
        reconnect();
    }
    client.loop();
}

void reconnect() {
    if (!client.connected()) {
        client.set_server(server, 1883);
        client.connect("AVR101");
        client.subscribe("ishnalaIOT");
        client.set_callback(callback);
    }
}

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Voicemod ошибка настройки аудиоустройства
  • Voice install could not be verified ошибка