Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Домашние IoT серверы", создана пользователем jmms, 8 июн 2015.

Метки:
  1. jmms

    jmms Moderator Команда форума

    Сообщения:
    67
    Симпатии:
    23
    Доброго времени суток.

    Брокер на самом деле настроить удалось. Вот практически стандартный код:
    Код (Javascript):
    1. var mosca = require('mosca')
    2.  
    3. var ascoltatore = {
    4.   type: 'redis',
    5.   redis: require('redis'),
    6.   db: 12,
    7.   port: 6379,
    8.   return_buffers: true, // to handle binary payloads
    9.   host: "localhost"
    10. };
    11.  
    12. var moscaSettings = {
    13.   port: 1883,
    14.   backend: ascoltatore,
    15.   keepalive: 5,
    16.   persistence: {
    17.     factory: mosca.persistence.Redis
    18.   }
    19. };
    20.  
    21. var server = new mosca.Server(moscaSettings);
    22. server.on('ready', setup);
    23.  
    24. server.on('clientConnected', function(client) {
    25.   console.log('client connected', client.id);    
    26. });
    27.  
    28. // fired when a message is received
    29. server.on('published', function(packet, client) {
    30.   console.log('Published', packet.payload);
    31. });
    32.  
    33. // fired when the mqtt server is ready
    34. function setup() {
    35.   console.log('Mosca server is up and running')
    36.   function ping() {
    37.     var message = {
    38.       topic: 'test/mqttclient/topic1',
    39.       payload: 'abcde', // or a Buffer
    40.       qos: 0, // 0, 1, or 2
    41.       retain: false // or true
    42.     };
    43.  
    44.     server.publish(message, function() {
    45.       console.log('done!');
    46.     });
    47.  
    48.     console.log('ping..');
    49.  
    50.     setTimeout(ping, 10000);
    51.   }
    52.  
    53.   //ping();
    54. }
    55.  
    Функция ping() по-идеи просто должна слать пакеты с интервалом 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:
    Код (C):
    1.         uint8_t mac[6];
    2.         WiFi.macAddress(mac);
    3.         String macString = macToStr(mac);
    4.         // prepare mqtt id
    5.         String mqttId = "";
    6.         mqttId.concat(config.email);
    7.         mqttId.concat("--");
    8.         mqttId.concat(macString);
    9.         mqttId.concat("--");
    10.         mqttId.concat(name);
    11. #ifdef DEBUG
    12.         Serial.println("mqttId: " + mqttId);
    13. #endif
    14.         // connect to mqtt
    15.         int retries = 0;
    16.         while (retries < RETRIES_LEN) {
    17.             if (mqttClient.connect(mqttId)) {
    18.                 mqttClient.publish("test/mqttclient/publish1", "hello world");
    19.                 mqttClient.subscribe("test/mqttclient/topic1");
    20.             //@TODO
    21. #ifdef DEBUG
    22.                 Serial.println("MQTT connected.");
    23. #endif
    24.                 break;
    25.             } else {
    26. #ifdef DEBUG
    27.                 Serial.println("MQTT connect fail.");
    28. #endif
    29.             }
    30.             retries++;
    31.             delay(500);
    32.         }
    33.  
     
  2. jmms

    jmms Moderator Команда форума

    Сообщения:
    67
    Симпатии:
    23
    Слишком рано начал спрашивать, но стабильность все таки вызывает определенные вопросы.

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

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

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

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

    Past Читатель

    Сообщения:
    60
    Симпатии:
    9
    Вот мой код для NodeMCU, стабильно работает сутками.
    Посмотрите.
     
  4. jmms

    jmms Moderator Команда форума

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

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

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

    Past Читатель

    Сообщения:
    60
    Симпатии:
    9
    Хип стабильно держится в районе 14-15к

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

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

Поделиться этой страницей