Настройка 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 чтобы она хип присылала.
завтра напишу сколько она навычисляла
 
Сверху Снизу