Подключеие MQTT Windows

Проблемы/вопросы, связанные с запуском под различными платформами и конфигурациями.

Модератор: immortal

Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Подключеие MQTT Windows

Сообщение nick7zmail » Пт мар 31, 2017 6:17 pm

Вы что хотите сделать...немного не понимаю....

Если вы хотите управлять релюхой - надо 1 раз в setup подписаться на нужный паблик....и ждать от него сообщений в loop
Publish только передаёт данные, принимать ничего не умеет.
За это сообщение автора nick7zmail поблагодарил:
alex32 (Пн апр 03, 2017 1:44 pm)
Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: Подключеие MQTT Windows

Сообщение DimSun75 » Пт мар 31, 2017 6:34 pm

Можно весь скетч, желательно в виде файла
alex32
Сообщения: 29
Зарегистрирован: Чт мар 30, 2017 4:14 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: Подключеие MQTT Windows

Сообщение alex32 » Пт мар 31, 2017 7:46 pm

DimSun75 писал(а):Можно весь скетч, желательно в виде файла
https://yadi.sk/d/i_BPEJlC3GXm96
alex32
Сообщения: 29
Зарегистрирован: Чт мар 30, 2017 4:14 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: Подключеие MQTT Windows

Сообщение alex32 » Пт мар 31, 2017 7:48 pm

nick7zmail писал(а):Вы что хотите сделать...немного не понимаю....

Если вы хотите управлять релюхой - надо 1 раз в setup подписаться на нужный паблик....и ждать от него сообщений в loop
Publish только передаёт данные, принимать ничего не умеет.
релюхой хочу управлять. в идеале бы еще квитанцию о включении и выключении скинуть обратно умному дому.
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: Подключеие MQTT Windows

Сообщение DimSun75 » Пт мар 31, 2017 7:58 pm

Ну, тут как-то плохо все.

Во первых, вы постоянно дисконектитесь от сервера. Ясно дело, что прошивка либо в дисконекте, либо висит 3 секунды на паузе.
Во вторых, а где client.loop() как библиотека получит входной топик?
За это сообщение автора DimSun75 поблагодарил:
alex32 (Пт мар 31, 2017 8:22 pm)
Рейтинг: 1.16%
alex32
Сообщения: 29
Зарегистрирован: Чт мар 30, 2017 4:14 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: Подключеие MQTT Windows

Сообщение alex32 » Пт мар 31, 2017 8:13 pm

DimSun75 писал(а):Ну, тут как-то плохо все.

Во первых, вы постоянно дисконектитесь от сервера. Ясно дело, что прошивка либо в дисконекте, либо висит 3 секунды на паузе.
Во вторых, а где client.loop() как библиотека получит входной топик?

// client.disconnect(); // Отключиться
if (client.connected()){
client.loop();
}
}
}

в конце заменил так. но не могу проверить реле, т.к. балалайка на работе. по логам можно понять работает оно или нет?



1490980117: Sending PUBLISH to Mega2560 (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
1490980119: New connection from 127.0.0.1 on port 1883.
1490980119: New client connected from 127.0.0.1 as MajorDoMo MQTT Client (c1, k10).
1490980119: Sending CONNACK to MajorDoMo MQTT Client (0, 0)
1490980119: Received PUBLISH from MajorDoMo MQTT Client (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
1490980119: Sending PUBLISH to Mega2560 (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980119: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980119: Received DISCONNECT from MajorDoMo MQTT Client
1490980119: Client MajorDoMo MQTT Client disconnected.
1490980120: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980120: Sending PUBLISH to Mega2560 (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980120: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980121: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980121: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980121: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980121: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980121: Received SUBSCRIBE from Mega2560
1490980121: home/data/status/rele (QoS 0)
1490980121: Mega2560 0 home/data/status/rele
1490980121: Sending SUBACK to Mega2560
1490980121: Sending PUBLISH to Mega2560 (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
1490980124: mosquitto version 1.4.11 terminating

C:\Program Files (x86)\mosquitto>
alex32
Сообщения: 29
Зарегистрирован: Чт мар 30, 2017 4:14 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: Подключеие MQTT Windows

Сообщение alex32 » Пт мар 31, 2017 8:22 pm

по логам постоянно долбит публикация для мега. она ее не забирает получается?

1490980751: home/data/status/rele (QoS 0)
1490980751: Mega2560 0 home/data/status/rele
1490980751: Sending SUBACK to Mega2560
1490980751: Sending PUBLISH to Mega2560 (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
1490980754: Client MajorDoMo MQTT Cycle has exceeded timeout, disconnecting.
1490980754: Socket error on client MajorDoMo MQTT Cycle, disconnecting.
1490980754: New connection from 127.0.0.1 on port 1883.
1490980754: Client MajorDoMo MQTT Cycle disconnected.
1490980754: New client connected from 127.0.0.1 as MajorDoMo MQTT Cycle (c0, k10).
1490980754: Sending CONNACK to MajorDoMo MQTT Cycle (0, 0)
1490980754: Received SUBSCRIBE from MajorDoMo MQTT Cycle
1490980754: # (QoS 0)
1490980754: MajorDoMo MQTT Cycle 0 #
1490980754: Sending SUBACK to MajorDoMo MQTT Cycle
1490980754: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
1490980754: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980754: Sending PUBLISH to Mega2560 (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980754: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980755: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980755: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980755: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980755: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980755: Received SUBSCRIBE from Mega2560
1490980755: home/data/status/rele (QoS 0)
1490980755: Mega2560 0 home/data/status/rele
1490980755: Sending SUBACK to Mega2560
1490980755: Sending PUBLISH to Mega2560 (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
1490980759: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980759: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980759: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980759: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980759: Received SUBSCRIBE from Mega2560
1490980759: home/data/status/rele (QoS 0)
1490980759: Mega2560 0 home/data/status/rele
1490980759: Sending SUBACK to Mega2560
1490980759: Sending PUBLISH to Mega2560 (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
1490980762: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980762: Sending PUBLISH to Mega2560 (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980762: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/rele', ... (1 bytes))
1490980763: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980763: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/temp', ... (3 bytes))
1490980763: Received PUBLISH from Mega2560 (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980763: Sending PUBLISH to MajorDoMo MQTT Cycle (d0, q0, r0, m0, 'home/data/status/sensor/hum', ... (3 bytes))
1490980763: Received SUBSCRIBE from Mega2560
1490980763: home/data/status/rele (QoS 0)
1490980763: Mega2560 0 home/data/status/rele
1490980763: Sending SUBACK to Mega2560
1490980763: Sending PUBLISH to Mega2560 (d0, q0, r1, m0, 'home/data/status/rele', ... (1 bytes))
DimSun75
Сообщения: 318
Зарегистрирован: Вс янв 01, 2017 8:32 pm
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 44 раза

Re: Подключеие MQTT Windows

Сообщение DimSun75 » Пт мар 31, 2017 8:35 pm

alex32 писал(а): // client.disconnect(); // Отключиться
if (client.connected()){
client.loop();
}
}
}
Нет, это ерунда. Вот кусок моего кода для esp. Для меги в принципе тоже самое должно быть

В loop:

Код: Выделить всё

  if (!client.connected()) {
    reconnect();
  }
 
  client.loop(); 
Функция reconnect:

Код: Выделить всё

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client" + ESP.getChipId())) {
      Serial.println("connected");

     sprintf(releTopic, "DSDevice/%d/RELE1/Status", ESP.getChipId());
     client.subscribe(releTopic);

// Публикуем топик с ID 

      sprintf(msg, "%d", ESP.getChipId());
      client.publish("DSDevice/RELE/PowerUp", msg);

// Публикуем топик с IP
      
      sprintf(msg, "%d.%d.%d.%d", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3]);
      sprintf(IPTopic, "DSDevice/%d/IP", ESP.getChipId());
      client.publish(IPTopic, msg);

// Запускаем таймер с периодичной пкбликацией статуса 

      alive_timer.setTimeout(ALIVE_TIMEOUT);
      alive_timer.restart();
            
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
} 
Здесь еще используется таймер (alive_timer) из библиотеке RBD_Timer. С помощью него периодически отправляется состояние реле, для определения работоспособности модуля. Я бы и у вас что-то подобное для отправки значения температуры использовал. В loop он так используется:

Код: Выделить всё

  if (alive_timer.onExpired())
  {
    sprintf(msg, "%d", ReleStatus);
    client.publish(releTopic, msg);
    alive_timer.restart();    
  } 
За это сообщение автора DimSun75 поблагодарил:
alex32 (Пт мар 31, 2017 8:42 pm)
Рейтинг: 1.16%
alex32
Сообщения: 29
Зарегистрирован: Чт мар 30, 2017 4:14 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: Подключеие MQTT Windows

Сообщение alex32 » Пт мар 31, 2017 8:44 pm

спасибо. буду кумекать))))
alex32
Сообщения: 29
Зарегистрирован: Чт мар 30, 2017 4:14 pm
Благодарил (а): 7 раз
Поблагодарили: 0

Re: Подключеие MQTT Windows

Сообщение alex32 » Пн апр 03, 2017 1:58 pm

nick7zmail писал(а):Вы что хотите сделать...немного не понимаю....

Если вы хотите управлять релюхой - надо 1 раз в setup подписаться на нужный паблик....и ждать от него сообщений в loop
Publish только передаёт данные, принимать ничего не умеет.
чето как то тяжко все это (((( релюха своей жизнью живет. хочет включается. хочет выключается (((( как ее обуздать?
сделал один в один как тут https://www.youtube.com/watch?v=CjG0JXCGye0 и тишина. к брокеру мега не подключается вообще.
выкинул из своего кода все лишнее - обращения к брокеру идут, но ниче не работает.
ответка от брокера к мажордомо прилетает разная
home/data/status/rele2_2 значение 1
home/data/status/rele2_2 значение hello world
home/data/status/rele2_2 значение 0
странно конечно. когда реле выключено, то в мажордомо прилетает 1.

что мне в коде нужно поправить?
или если есть дайте рабочий пример управления релюхой

#include <SPI.h> // Ethernet shield
#include <Ethernet.h> // Ethernet shield
#include <PubSubClient.h>
const int rele2Pin = 5;
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x00 };
IPAddress ip(10, 3, 1, 194); //IP Клиента (Arduino)
IPAddress server(10, 3, 1, 155); //IP Брокера
EthernetClient ethClient;
PubSubClient client(ethClient);
void callback(char* topic, byte* payload, unsigned int length) { // Callback function header
if(payload[0] == '1'){
digitalWrite(rele2Pin, HIGH); //включение реле если прилетает подписка с 1
client.publish("home/data/status/rele2_2", "1"); } //публикация результата
if (payload[0] == '0'){
digitalWrite(rele2Pin, LOW); //выключение реле если прилетает подписка с 0
client.publish("home/data/status/rele2_2", "0"); //публикация результата
}
}
void setup() {
pinMode( rele2Pin, OUTPUT );
digitalWrite(rele2Pin, LOW);
client.setServer(server, 1883);
client.setCallback(callback);
Ethernet.begin(mac, ip);
// Allow the hardware to sort itself out
//delay(1500);
}
void loop() {
if (client.connect("Mega2560")){
client.publish("home/data/status/rele2_2", "hello world");
client.subscribe("home/data/status/rele2"); // подписка
delay(3000); // Отправка данных в Брокер раз в 5 секунд
if (client.connected()){
client.loop();
}
}
}
Ответить