• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Настройка MQTT брокера mosca [решено]

jmms

Moderator
Команда форума
Доброго времени суток.

Брокер на самом деле настроить удалось. Вот практически стандартный код:
JavaScript:
var mosca = require('mosca')

var ascoltatore = {
  type: 'redis',
  redis: require('redis'),
  db: 12,
  port: 6379,
  return_buffers: true, // to handle binary payloads
  host: "localhost"
};

var moscaSettings = {
  port: 1883,
  backend: ascoltatore,
  keepalive: 5,
  persistence: {
    factory: mosca.persistence.Redis
  }
};

var server = new mosca.Server(moscaSettings);
server.on('ready', setup);

server.on('clientConnected', function(client) {
  console.log('client connected', client.id);    
});

// fired when a message is received
server.on('published', function(packet, client) {
  console.log('Published', packet.payload);
});

// fired when the mqtt server is ready
function setup() {
  console.log('Mosca server is up and running')
  function ping() {
    var message = {
      topic: 'test/mqttclient/topic1',
      payload: 'abcde', // or a Buffer
      qos: 0, // 0, 1, or 2
      retain: false // or true
    };

    server.publish(message, function() {
      console.log('done!');
    });

    console.log('ping..');

    setTimeout(ping, 10000);
  }

  //ping();
}
Функция [inline]ping()[/inline] по-идеи просто должна слать пакеты с интервалом 10 секунд. Но не в этом дело.

Локальная сеть через роутер Tp-Link. Порт для ESP в роутере проброшен и ESP выделен отдельный локальный IP (то есть фаервол по-идеи отключен). IP для ESP 192.168.0.200. Телнет с ноутбука к брокеру подключается (IP ноутбука/брокера 192.168.0.101). Порт брокера стандартный 1883. В ESP используется библиотека https://github.com/Imroy/pubsubclient .

Проблема заключается в следующем: ESP иногда подключается, иногда нет. Как это выглядит:
1) Запускаю redis для брокера
2) Запускаю брокер, он рапартует что запущен и работает
3) Прошиваю скетч в ESP, происходит подключение к Wi-Fi
4) И в цикле (максимум 10 раз) пробует подключиться к брокеру. И вот здесь интересный момент. Если я перезагружаю роутер то иногда на 1-3 раз ESP все таки подключается к брокеру. Но когда я перепрошиваю или перезагружаю ESP- то вероятность подключения ESP к брокеру очень сильно снижается. То есть после перепрошивки или перезагрузки у меня всего 1 раз подключился.

Если использовать внешний брокер, например: 85.119.83.194 (test.mosquitto.org) тогда подключается стабильно на 2-3 раз.

В чем может быть причина такой не стабильной работы в локальной сети?
Проблема в брокере? В роутере? В библиотеке PubSubClient?

Примерный код инициализации клиента в ESP:
Код:
        uint8_t mac[6];
        WiFi.macAddress(mac);
        String macString = macToStr(mac);
        // prepare mqtt id
        String mqttId = "";
        mqttId.concat(config.email);
        mqttId.concat("--");
        mqttId.concat(macString);
        mqttId.concat("--");
        mqttId.concat(name);
#ifdef DEBUG
        Serial.println("mqttId: " + mqttId);
#endif
        // connect to mqtt
        int retries = 0;
        while (retries < RETRIES_LEN) {
            if (mqttClient.connect(mqttId)) {
                mqttClient.publish("test/mqttclient/publish1", "hello world");
                mqttClient.subscribe("test/mqttclient/topic1");
            //@TODO
#ifdef DEBUG
                Serial.println("MQTT connected.");
#endif
                break;
            } else {
#ifdef DEBUG
                Serial.println("MQTT connect fail.");
#endif
            }
            retries++;
            delay(500);
        }
 

jmms

Moderator
Команда форума
Слишком рано начал спрашивать, но стабильность все таки вызывает определенные вопросы.

Что я сделал на данный момент: в брокере перешел от использования Redis к MongoDB. В скетче переместил [inline]mqttClient.connect()[/inline] в [inline]loop()[/inline], где начал проверять статус текущего подключения и в случаях разрыва теперь пытаюсь восстановить подключение.

Но. Иногда при перезагрузке девайса, и после подключения к Wi-Fi - все равно MQTT отказывается подключаться. Лечится перезагрузкой ESP 2-3 раза и рестартом брокера.

Отпишитесь если у вас были похожие проблемы и как вы их решили / решаете.

UPD: Забыл, что зарезервировать порт и локальный IP не мешало бы и для ноутбука, где установлен MQTT брокер. Сейчас вроде бы все работает стабильно.
 
Последнее редактирование:

jmms

Moderator
Команда форума
Вот мой код для NodeMCU, стабильно работает сутками.
Посмотрите.
Спасибо. Посмотрел. Думаю пример полезный.
Я использую C++ библиотеку https://github.com/Imroy/pubsubclient, правда на длительность работы не замерял, но данные может гонять час-два уверенно.

Оффтоп:
Вы производили замер потребляемого хипа? И как у вас обстоят дела с потреблением памяти, как решали?
У меня свободных при старте скетча 20512 и столько же и держится на протяжении часа.

Если не сложно - можете отсылать значение хипа куда ни будь на сервер + строить график, чтобы можно было оценить возможности NodeMCU+Lua. Спасибо.
 

Past

New member
Хип стабильно держится в районе 14-15к

https://docs.google.com/spreadsheets/d/1wwn_Xnv_UpMFI0WZM8BdHxlSmB19UVZOOTp094yEGFk/pubhtml
Вот есть граффик за выходные, но там крутился nodemcu-httpserver и ssdp отвечалка.

Могу сейчас добавить в json чтобы она хип присылала.
завтра напишу сколько она навычисляла
 
Сверху Снизу