Witty, WiFi, Mqtt

Тема в разделе "Arduino & Shields", создана пользователем Maxim_Al, 22 авг 2017.

  1. Maxim_Al

    Maxim_Al Нуб

    Только начинаю осваивать Ардуино, примеры как правило помогают, но тут что-то затык.
    Смысл в том что witty должен подключиться по Wifi (коннект есть), подключиться к mqtt (вроде бы подключается, исходя из монитора порта), но вот с приёмом и передачей топиков - полный ноль.
    Что использую, Arduino IDE, модуль PubSubClient 2.6.0, скетч - изменённый под мои данные сети пример к модулю.
    Код (C++):
    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>

    // Update these with values suitable for your network.

    const char* ssid = "*****";
    const char* password = "*****";
    const char* mqtt_server = "*****";

    WiFiClient espClient;
    PubSubClient client(espClient);
    long lastMsg = 0;
    char msg[50];
    int value = 0;

    void setup() {
      pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
      Serial.begin(115200);
      setup_wifi();
      client.setServer(mqtt_server, 1883);
      client.setCallback(callback);
    }

    void setup_wifi() {

      delay(10);
      // We start by connecting to a WiFi network
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);

      WiFi.begin(ssid, password);

      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }

      Serial.println("");
      Serial.println("WiFi connected");
      Serial.print("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();

      // Switch on the LED if an 1 was received as first character
      if ((char)payload[0] == '1') {
        digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
        // but actually the LED is on; this is because
        // it is acive low on the ESP-01)
      } else {
        digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
      }

    }

    void reconnect() {
      // Loop until we're reconnected
      while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Attempt to connect
        if (client.connect("ESP8266Client")) {
          Serial.println("connected");
          // Once connected, publish an announcement...
          client.publish("Synotemper/outTopic", "hello world");
          // ... and resubscribe
          client.subscribe("Synotemper/Tco");
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }
    void loop() {

      if (!client.connected()) {
        reconnect();
      }
      client.loop();
      client.publish("Synotemper/outTopic", "hello world");
      client.subscribe("Synotemper/Tco"); // подписывааемся по топик с данными
      long now = millis();
      if (now - lastMsg > 2000) {
        lastMsg = now;
        ++value;
        snprintf (msg, 75, "hello world #%ld", value);
        Serial.print("Publish message: ");
        Serial.println(msg);
        client.publish("Synotemper/outTopic", msg);
       
    В мониторе порта вижу:
    ....
    WiFi connected
    IP address: *****
    Attempting MQTT connection...connected
    Publish message: hello world #1
    Publish message: hello world #2
    и т.д.

    В клиенте (на смартфоне, куда данные по mqtt идут) создал подписку на Synotemper/outTopic - но там тишина.
    Создал там же для публикации Synotemper/Tco - устанавливаю значение - тоже ничего нет, т.е. не отрабатывает Serial.print("Message arrived - как будто ничего не принимает.
    В чём может быть проблема, что я не так делаю?
     
  2. ИгорьК

    ИгорьК Гуру

    Много чего может быть. Попробуйте работать с программой mqttSpy - она удобнее для разработки чтобы смотреть что происходит.
    https://kamilfb.github.io/mqtt-spy/
     
  3. SergeiL

    SergeiL Оракул Модератор

    Так как коннект к брокеру проходит успешно, с большой вероятностью данные на брокер отправляются.
    Попробуйте подписаться на тот же топик, на который отправляете данные, и увидеть то, что отправляете из loop().

    Подписка на топик в loop() не нужна:
    Код (C++):
    client.subscribe("Synotemper/Tco"); // подписывааемся по топик с данными
    Вы подписываетесь на данный топик в reconnect()
     
    Maxim_Al нравится это.
  4. Maxim_Al

    Maxim_Al Нуб

    Спасибо! Действительно так. Это видимо я от отчаяния везде стал пихать :)
    Вот это вот действительно полезно оказалось! То что Witty отправляет - сам принимает. Но сторонний клиент с ним не работает почему-то. Может что-то с версией протокола не то?
     
  5. SergeiL

    SergeiL Оракул Модератор

    Тут, как мне кажется, нужно смотреть настройки клиента.
    Коннект из клиента к брокеру проходит успешно?
    Попробуйте в клиенте послать что ни будь на какой-то топик, и получить с него же.
     
  6. Maxim_Al

    Maxim_Al Нуб

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

    SergeiL Оракул Модератор

    Честно говоря, не совсем понял из объяснения, что работает, а что нестабильно.
    Мониторинг сами настраивали? На чем брокер? ...
     
  8. Maxim_Al

    Maxim_Al Нуб

    Да вроде бы понятно писал:
    да, сам, брокер - mosquitto 1.4.9-5 (протокол 3.1.1) развернутый на Synology 212j
    Датчики 1-wire подключены и отдают на клиенты (MQTT Dash) температуры и работу (вкл/выкл) насосов системы отопления (параллельно заливая данные на народный мониторинг bash скриптом).
    Всё работает отлично.
    Теперь Ардуино. Скетч, устанавливает wifi соединение, цепляется к mqtt серверу, вывод в порт говорит о том, что периодически происходит реконнект, оформляет подписку на свою же публикацию - данные на порту говорят о том, что вроде бы ардуино принимает отсылаемые данные, но как то странно не стабильно, то есть прием, то пропуски какие-то. А вот до моего клиента (на смартфоне) данные вообще не долетают. Так же не долетает до ардуино публикуемые данные контроля системы отопления, а так же специально созданный топик на смартфоне для передачи на ардуино. Вообще не долетает ничего "из вне" ардуинки..
     
  9. ИгорьК

    ИгорьК Гуру

    Я Вам давал ссылочку на снифер MqttSpy... Чтобы точно понять где что...
    Там можно подписаться на топик # и наблюдать абсолютно все что происходит на брокере.
    В результате, часто рассеиваются заблуждения относительно происходящего.
     
    Maxim_Al нравится это.
  10. Maxim_Al

    Maxim_Al Нуб

    так то оно так, только толком не разобрался я с ним пока, запускается и через какое то время выключается... в какой то момент он ардуинкины топики увидел, потом тишина (пытался всё настраивать :)), но при этом топики mqtt клиента смартфона так и не увидел, что весьма странно, так как исходная система работает исправно.
    Сегодня попробую ещё раз понастраивать снифер, может получится.
     
  11. ИгорьК

    ИгорьК Гуру

    Возможно это заблуждение в части mqtt ситуации.
     
  12. Maxim_Al

    Maxim_Al Нуб

    Это как, у меня длительный галюционез? :) Система работает и к ней никаких претензий нет. Я по ней теперь даже отключение света в районе засекаю - как только народный мониторинг присылает что датчики чего то молчат, значит у провайдера электричество кончилось... А моя mqtt система данные исправно шлёт и принимает.
     
  13. ИгорьК

    ИгорьК Гуру

    Тогда у вас чудо - и работает и не работает одновременно.
     
  14. Maxim_Al

    Maxim_Al Нуб

    ну в принципе это помогло локализовать проблему :)
    Дело в том что топик регистрозависим, эк я тормознул, решил "красиво написать" в скетче, а в снифер из него уже копировал :)!
    Ладно буду дальше свой проект пилить помаленьку.
    Всем спасибо за участие!

    PS и никаких чудес :)
     
  15. ИгорьК

    ИгорьК Гуру

    Разве? И нормальный методологический подход Вас ничему не научил? :)

    ....
     
  16. Maxim_Al

    Maxim_Al Нуб

    Вы вероятно никогда не делаете ошибок копипаста... Я рад за Вас.
    Для меня тема ардуинки - новая, в глубоковечерних погружениях в неё неудивительно совершить глупую ошибку копипаста и не подумать даже об этом.
    Ну а чудес не бывает, бывают глупости.
     
  17. ИгорьК

    ИгорьК Гуру

    Наоборот. Поэтому и привык поступать так как и Вам посоветовал.