Вопрос по MQTT
- Войдите на сайт для отправки комментариев
Втр, 20/06/2017 - 14:32
Вопрос можети нубский, но чёт не могу сообразить ( нуб нубом) как в функции void loop() получить значение топика чтобы логику писать в нём а не в нутри void callback а в void loop(), а то во всех примерах разбор подпискии идёт в нутри void callback
void loop() { client.loop(); vikl_1.update(); // Get the updated value : int stat_vikl_1 = vikl_1.read(); int value2 = 0; // тут должно быть значение топика на который подписались if ( stat_vikl_1 == LOW || value2 == LOW ) { digitalWrite(RELAY_1, HIGH ); } else { digitalWrite(RELAY_1, LOW ); } } // пример функции void callback(char* topic, byte* payload, unsigned int length) { if ((char)subscribe[0] == '1') { rState1 = true; digitalWrite(RELAY_1, rState1); // Turn the LED on (Note that LOW is the voltage level } else { rState1 = false; digitalWrite(RELAY_1, rState1); // Turn the LED off by making the voltage HIGH } }
Остальной скетч секретный? Кто этот колбэк вызывает, когда и зачем нам догадываться нужно?
скетча рабочего ещё нет, только наброски
Ну, в таком виде (с закомментированной строкой 41) callback не вызывается вовсе.
вот в этм и пытаюсь разобраться, где и как правльно это сделать. В примерах этот класс обьявляется в функции подключения к брокеру (мне это не нравится) и там же стразу идёт логика обработки полученных сообщений, вот и хочу разобраться как правильно и как работает. ну и наверняка просто туп не понимаю элементарных вещей)
А в чём Ваша проблема? Для чего Вам нужно получать всё в функции loop? Чем Вам callback не угодила.
Сделать-то это можно, но я не понимаю зачем и потому не вижу "граблей".
вот в этм и пытаюсь разобраться, где и как правльно это сделать. В примерах этот класс обьявляется в функции подключения к брокеру (мне это не нравится) и там же стразу идёт логика обработки полученных сообщений,
простите, а чем вам это не нравится? Смысл callback - чтобы вы в своей программе могли выполнять какие-то операции во время таймаутов сетевых соединений. Если вам это не надо - можете вообще этим не пользоваться
UPD - посмотрел либу - был неправ. Смысл callback - вернуть вам топик и прочую инфу. Без вызова callback вы ее, похоже, просто не получите. Если вам не нравится обрабатывать ее тут же - тогда просто запоминайте ее, а обрабатывайте потом. Но непонятно, зачем так делать
ну не хотелось бы писать логику в теле функции) (как я понял основной код в ардуино вызывается и работает в loop, вот это и хотелось получить и сомения в доступности переменных одной функции в теле другой) как-то на мой взглдя не правильно совать логику по функциям). пойду дальше осмысливать значение этой функции (callback) и разибраться со свойствами класса. п.с. я не программист)
ну не хотелось бы писать логику в теле функции) (как я понял основной код в ардуино вызывается и работает в loop, вот это и хотелось получить и сомения в доступности переменных одной функции в теле другой) как-то на мой взглдя не правильно совать логику по функциям). пойду дальше осмысливать значение этой функции (callback) и разибраться со свойствами класса. п.с. я не программист)
Желание поместить все в loop() - это типичная ошибка новичка. "Совать логику по функциям" - это не только не ошибка, это как раз более правильный и разумный стиль программирования. В программе, в которой в loop вы видите только вызовы десятка функций и больше ничего - разбираться значительно проще, чем в типичном коде новичка, где все запихано в бесконечный loop().
А сомнения в доступности переменных одной функции в теле другой - это верное сомнение, но для этого существуют глобальные переменные.
как-то на мой взглдя не правильно совать логику по функциям
Это как раз правильно.
Вообще-то все банально просто
Остальное это просто варианты и ничего больше.
код какой-то нелогичный. Или это только теоретический пример? Callback получает и ивент и хендлер "снаружи", а внутри всего лишь соединяет их друг с другом? А смысл?
Вот так было бы полезнее:
или через case
Я же сказал: остальное - варианты. А как ивенты , данные для определение иветнов и хендлеров попадают в калбек функцию не важно. Ведь могут попасть как глобальные переменные, а может засунуты в условие функции. Я чаще использую классы. В классах возможна инкапсуляция данных и куча различных методов в одной куче. Чего одиночная фунция лишена.
В классах возможна инкапсуляция данных и куча различных методов в одной куче. Чего одиночная фунция лишена.
хм... зато метод класса в виде хендлера так просто по ссылке не передать. Очень извращаться придется... Проще всего, если это вызов метода для конкретного экземпляра - тогда обернуть его в обычную "одинокую функцию" и передавать по ссылке без всякого ООП :)
пойду дальше осмысливать значение этой функции (callback) и разибраться со свойствами класса. п.с. я не программист)
шо там разбираться? - она делает
23
if
((
char
)subscribe[0] ==
'1'
) {
24
rState1 =
true
;
25
digitalWrite(RELAY_1, rState1);
// Turn the LED on (Note that LOW is the voltage level
26
}
else
{
27
rState1 =
false
;
28
digitalWrite(RELAY_1, rState1);
// Turn the LED off by making the voltage HIGH
29
}
п.с. я не программист - какого класса? О_О
Вот я не пойму , зачем передавать метод класса в качестве хендлера. Это же глупо. То что передавать можно, так это ответ Клопауцию , зачем в библиотеке 2 файла .h и .сpp. Так вот для этого. Если классы и их методы, то это прерогатива разработчика класса. А вот хенлеры это дело пользователя. Опять же есть классы, а есть объекты по классам. Это функции сами по себе . Сама себе и "класс", сама себе и "метод класса", сама себе и "объект класса". Так что проще через обычные функции. Я и это пробовал. В Qt есть специальные функции для коннектов методов и слотов предствителей классов. Я ими не пользуюсь, так как много текста будет.
В Qt есть специальные функции для коннектов методов и слотов предствителей классов. Я ими не пользуюсь, так как много текста будет.
оффтоп конечно, но можно в 2-3х предложениях - что не так с сигналами и слотами в Qt? Я когда-то пробовал писать в Qt - и для меня как раз сигналы и слоты показались наиболее удобным и простым механизмом... в отличии в целом от написания графического интерфейса. который я не понимаю и не люблю :)
С Qt скорее всего организовано так, как я пишу это ручками. Создается или внешний, или внутрений обработчик в одном представителе, который дергает переменную в другом. Вот только это все очень замаскировано дополнительной функцией или графическим интерфейсом среды разработки. Вот только я пришел к этому самостоятельно, просто следуя по ходу развития программирования вообще и в частности в Си. А вот на счет графического интерфейса, так все там просто и сложно. Просто, если вы поймете концепцию делегирования вместо множественного наследования и придумаете кучу английских слов для обозначения переменных и методов.
Подскажите что значит подписаться (SUBSCRIBE) и отписаться (UNSUBSCRIBE) на топик
1) Брокер начнет слать клиенту обновления топика
2) Брокер перестанет слать обновления.
Доброго времени суток !
Я далеко не программист, прошу не судить строго!
Стояла задача считать значения логической единицы с пина и передать по MQTT в MJDOM.
Задачу выполнил вроде все работает.
Также необходимо по MQTT включать РЕЛЕ тут вроде все получилось, но возникла вот такая проблема при обкатке, спустя час два работы arduino перестает включать реле, но при этом логические единица и ноль (от первой задачи) в мониторе порта отображаются корректно и MJDOM. Перезагружаем arduino и все вновь на какое то время работает.
Что то мне подсказывает, что из Callback убрать нужно delay.
Да и этот момент
char
receivedChar = (
char
)payload[0]; я бы заменил как в мануале на:
Ну и на закуску проверить не обрывается соединение где нибудь.
"Что то мне подсказывает, что из Callback убрать нужно delay"
Вынести в отдельную операцию (функцию), так получается что? От него нужно что бы реле кратко временно выключилось и выключилось.
"Ну и на закуску проверить не обрывается соединение где нибудь."
Ну я так понимаю если первая часть которая работает по MQTT значит cоединение есть. Тут я так понял именно проблема с callback
то что написали пошел пробовать
Да и вообще в callback я бы сделал проверку из какого топика прилетело, а затем, что прилетело, ну и дернуть реле.
Не удобно просить ну так как я уже на это убил 7 дней, все же попрошу можете помочь допилить. а то про проверку написали я уже в ступаре ...
Просто я так понял где используют конструкцию типа:
'pub' was not declared in this scope
все что я пересмотрел везде используется Wifi а в моем случаи его нет вот и в ступаре я ... (((
Спасибо!
Возможно из за того что вы не в reconect подписываетесь на топики.
Так что то же стоит перенести из setup().
Ну и остальное перепроверяйте и пробуйте.
Спасибо пошел пробовать что получится интересно ))) Спасибо ! а как насчет того что бы вне callback сделать влючение и выключение реле
Сделал как Вы писали теперь у меня получается следующее:
relay1 на 40 пине
PowerPanel/relay1 1
отправляешь в топик и включается 41 пин, хотя relay1 на 40
PowerPanel/relay2 1
включается 40 пин ....
как такое может быть все пересмотрел на два раза ...
Вижу тока то что в порт не прилетает 0 или 1 сообщение ... только надпись топика
Наводящий вопрос - что произойдёт в этом условии, если topic эквивалентен "PowerPanel/relay1":
if
(strcmp(topic,
"PowerPanel/relay1"
))
?я так понимаю если наводящий вопрос задан тот тут ошибка в структуре выполняемой операции... должно быть
else if (strcmp(topic, "PowerPanel/relay1"))
а выше общий if
Реле у тебя управляюца нулем, видимо.
Хорошо. По- другому спрошу. Каким уровнем включается реле?
В текущий момент времени реле едут только у меня сейчас я тыстовый вариант на макете собираю включаю вместо реле светодиоды. Вот то что сейчас по коду у меня ткните где мог накосячить в нем...
Сейчас проблема в том что включая relay1 включается relay2
ну и следующая моя проблема будет как в не callback сделать кратковременное включение и потом выключение реле
Наводящий вопрос - что произойдёт в этом условии, если topic эквивалентен "PowerPanel/relay1":
if
(strcmp(topic,
"PowerPanel/relay1"
))
?Точняк! Мой косяк ))
А почему тут инвертировать strcmp нужно ?
и как в не сделать вкл/выкл что бы в callback не использовать delay
Ну про strcmp можно в гугле спросить.
Да и про то как без delay можно там же найти. "Мигаем светодиодом без delay"
Пошел на просторы GOOGLE большое спасибо !!!! Не ожидал что на форуме быстро решение найдется... будем тестить скетч дальше на стабильность !!!
СПАСИБО !
А почему тут инвертировать strcmp нужно ?
Инвертировать не нужно. Нужно знать, что она возвращает.
Ясно уже более менее на просторах гугла нашел ответ....
Подскажите люди добрые,нашел вот такой скетч на просторах интернета, как внего добавить проверку логина и пароля для подключения к mqtt брокеру?
Скетч:
1) dtostrf ();
2) Использовать таймер.
Да тока понял что в топике надо писать конверт значения ...
И все же добавив на ESP 01, возможность определения температуры и исходя из температуры включение вентилятора столкнулся с такой проблемой что
tempCMQTT побольше сделайте. Туда ещё и терминатор строки должен влезать, как минимум.