Снова MQTT
- Войдите на сайт для отправки комментариев
Осваиваю wemos. Хочу порулить через cloudmqtt.com.
Что сделано
1. Заведен mqtt брокер с именем home.
2. в телефоне поставлено mqtt dashboard. Оформлена подписка на тему home/temp. Добавлен виджет паблишера svetik.
3. Скетч в порт выдает
-
-
Connecting to xxxxx...WiFi connectedIP: 192.168.4.105MAC: 60:01:94:14:E9:60Mask: 255.255.255.0Gateway: 192.168.4.1SSID: xxxxxSignal lvl: -84Connecting to MQTT serverConnected to MQTT server
-
1
-
1
-
1
-
НО в дашбоард эта единичка не прилетает. И светодиодом поморгать не могу... уже и видео посмотрел ... что то похоже не сделал .. а вот что хз...
Если при подключеном дашборде сменить состояние светодиода, отключится и снова сменить то при подключении оно восстанавливается.. так что связь телефон cloudmqtt есть... проблемка со стороны wemos`a
а как он вообще должен читать я не пойму... процедура проверки паблика запукается только при подключении к брокеру... я правильно понял ? Или библиотека PubSubClient.h будет прерывать программу при изменении темы?
P.s Сори что сюда, на профильном народу мало ) молчат все как рыбы. Кроме того буду дальше вязать их с ардуинкой ).
P.s.s
#include <MQTT.h> #include <PubSubClient.h> #include <ESP8266WiFi.h> const char *ssid = "xxxxx"; // Имя вайфай точки доступа const char *pass = "xxxxx"; // Пароль от точки доступа const char *mqtt_server = "m11.cloudmqtt.com"; // Имя сервера MQTT const int mqtt_port = 17427; // Порт для подключения к серверу MQTT const char *mqtt_user = "xxxxx"; // Логи от сервер const char *mqtt_pass = "xxxxx"; // Пароль от сервера WiFiClient wclient; PubSubClient client(wclient, mqtt_server, mqtt_port); #define BUFFER_SIZE 100 int tm, temp; void setup() { pinMode (D1, OUTPUT); Serial.begin(115200); digitalWrite (D1, HIGH); delay(500); digitalWrite (D1, LOW); } void loop() { if (!client.connected()) { // переподключаемся к MQTT серверу reconnect(); } if (client.connected()) { client.loop(); TempSend(); } } // Функция отправки показаний с термодатчика void TempSend() { if (tm == 0) { temp = 1; client.publish("Home/temp", String(temp)); // отправляем в топик для термодатчика значение температуры Serial.println(temp); tm = 300; // пауза меду отправками значений температуры коло 3 секунд } tm--; delay(10); } void callback(const MQTT::Publish & pub) { Serial.print(pub.topic()); // выводим в сериал порт название топика Serial.print(" => "); Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных String payload = pub.payload_string(); if (String(pub.topic()) == "Home/svetik") // проверяем из нужного ли нам топика пришли данные { int stled = payload.toInt(); // преобразуем полученные данные в тип integer digitalWrite(D1, stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных } } void reconnect() { if (WiFi.status() != WL_CONNECTED) { // подключаемся к WIFI Serial.print("Connecting to "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi connected"); Serial.print ("IP: "); Serial.println(WiFi.localIP());//получаем IP WeMos, этот IP необходимо ввести в адресной строке браузера, чтобы получить доступ к WeMos Serial.print ("MAC: "); Serial.println(WiFi.macAddress()); //получаем MAC-адрес WeMos Serial.print ("Mask: "); Serial.println(WiFi.subnetMask()); //маску подсети Serial.print ("Gateway: "); Serial.println(WiFi.gatewayIP()); //IP- шлюза Serial.print ("SSID: "); Serial.println(WiFi.SSID());// имя сети, к которой подключен WeMos Serial.print ("Signal lvl: "); Serial.println(WiFi.RSSI()); //и уровень сигнала } if (WiFi.status() == WL_CONNECTED) { // если вафля подключена if (!client.connected()) { // подключаемся к MQTT серверу Serial.println("Connecting to MQTT server"); if (client.connect(MQTT::Connect("arduinoClient2") .set_auth(mqtt_user, mqtt_pass))) { Serial.println("Connected to MQTT server"); client.set_callback(callback); client.subscribe("Home/svetik"); // подписывааемся по топик с данными для светодиода } else { Serial.println("Could not connect to MQTT server"); } } } }
Разобрался наконец то с подключением и тп...
При загрузке прочитывает только топик Home/rgbr, второй топик Home/svetdiap не читает...
Но если я меняю их с телефона то читатет оба.
как заставить читать либо все при старте ... либо принудительно читать топик ?
на 3 форуме спрашиваю... и везде тишина... неужто никто не делал восстановление данных после перезагрузки вемоса/ардуины и тп )
Почему ж не делали, делали, я использую встроенный EEPROM ESP8266. Вот мой последний проект: https://youtu.be/YVLLmWthCts там очень много кода. :)
И кстати команду WIFI.begin() не нужно вызывать вновь при разрыве WiFI подключения (я тоже раньше так косячил) достаточно 1 раз при загрузке модуля вызвать команду wifi.begin() и при разрывах будет сам вновь подключаться.
И еще на будущее, у этой библиатеки pubsubclient есть косяк - нельзя однавременно в одном цикле loop отправлять с десяток исходящих сообщений, можно только по 1-му сообщению за один цикл loop, а иначе это приведет к подвисанию модуля т.к. на отправку одного сообщения уходит много времени (порядка 200 милисек).
Почему ж не делали, делали, я использую встроенный EEPROM ESP8266. Вот мой последний проект: https://youtu.be/YVLLmWthCts там очень много кода. :)
И кстати команду WIFI.begin() не нужно вызывать вновь при разрыве WiFI подключения (я тоже раньше так косячил) достаточно 1 раз при загрузке модуля вызвать команду wifi.begin() и при разрывах будет сам вновь подключаться.
И еще на будущее, у этой библиатеки pubsubclient есть косяк - нельзя однавременно в одном цикле loop отправлять с десяток исходящих сообщений, можно только по 1-му сообщению за один цикл loop, а иначе это приведет к подвисанию модуля т.к. на отправку одного сообщения уходит много времени (порядка 200 милисек).
Огромное спасибо за советы... 1 запись за loop.. ну введу флаг ) хотя...Может есть другие библиотеки?
Епромом пользоваться не хочу.... не ужели нельзя прогрпмно а не при изменении прочитать топик ? зачем использовать епром когда в облаке уже данные хранятся.... код гляну обяз ... хотчбы в целях обучения.. если не найду решения то конечно епром....
Ну некоторые данные можно хранить в облаке, если отправлять с пометкой "retained". Библиатека есть др. универсальная, ее все используют почему то. А эта спициальная для esp8266. У др. библиотеки тоже косяк, точно такой же, но с подписками, нельзя подписываться на кучу топиков за один цикл loop.
мои данные желательно хранить в облаке.... каму интересен цвет и время включения в акве... уж лучше постить за 1 луп...
НО КАК БЛИН принудительно прочитать тему???? уже мозг сломал
Ну за один цикл loop и не обязательно передовать все исходящие сообщения, я сделал лист для последовательной отправки 10 сообщений, в итоге все 10 исходящих сообщений отправятся за 10 циклов loop.
Да топики сами читаются (входящие сообщения обрабатывает callback). Запускается это все автоматически из цикла loop командой client.loop(), если подключен к серверу(облаку). Но в вашем скетче заметил не дописанный момент, во второй топих данные входящие прилетают, но с ними ничего не выполняется, они ни чем не управляют. Подключите же к ним уж наконц, света-диод какой нибудь. :) А все увидел топик "/Home/svetdiap" управляет каким то световым эфектом.
угу ....
мне важно прочитать топики при включении вемоса.... а не при изменении топика... при изменении читает все норм... при включении читает тока первый...
поэтому либо принудилово читать любой топик... либо при запуске читать все топики...
пока учусь ... топиков будет штук 40 ) ... обработчики смысла писать нет ... пока не научусь... ибо если не работает такая хрень уйду на каскаду...
Просто отправляйте данные в этот топик /Home/svetdiap с пометкой retained через приложение.
Подниму старую тему, вопрос по получению ответа от MQTT сервера.
на ESP8266 WeMos отправлю PUB пакеты, все отлично работает, тут вопросов нет.
на сервере в логах вижу такую запись:
т.е. если я правильно понял - мне сервер что то послал,
смотрю такой командой:
Должен ли я с помощью данного кода увидеть ответ сервера?
Нет, не правильно, там же входящие сообщения обробатываются в цикле void callback();
И есть 2 разных версии этой библиотеки от разных разработчиков, одна построеннана строках объекта класса String (рекомендованна для esp8266) , а др. на char.
Думаю, что служебные протокольные данные (такие, как CONNECT, ACK и т.д.) через обычный read() получить нельзя (да и смысла нет).
я без всяких библиотек работаю, иначе не интересно.
Думаю, что служебные протокольные данные (такие, как CONNECT, ACK и т.д.) через обычный read() получить нельзя (да и смысла нет).
ок, спасибо. А получить просто из любопытства хочеться. Во вскяом случае в оф документации данные пакеты описаны.
Update: судя по доке если я правильно понял, возвращается всего один байт - код ответа. Попробую вывести в консоль.
Update: судя по доке если я правильно понял, возвращается всего один байт - код ответа. Попробую вывести в консоль.
Тогда уточните - кто есть client - что за объект/класс?
Update: судя по доке если я правильно понял, возвращается всего один байт - код ответа. Попробую вывести в консоль.
Тогда уточните - кто есть client - что за объект/класс?
весь код если вдруг нужен:
Если сами пакет формируете, а не через PubsClient, то тогда должны получить. Я думал, что ваш клиент - библиотечный объект. C другой стороны в readResponseFromClient() должны уже получать что-то прилетающее от сервера после коннекта.
readResponseFromClient()
спасибо за подсказку/направление, дальше думаю разберусь.
А как для SIM800 примерно тоже сделать?
Проверенные примеры где то есть?
А в чем глобальная разница?
Есть примеры, поиском по mqtt посмотрите,
Irinka недавно делала
http://arduino.ru/forum/apparatnye-voprosy/arduino-uno-sim800lmqttblynk
закончил игрушку, отправка температуры, прием цвета и зажигание RGB светодиода:
Нашлись служебные данные?
Нашлись служебные данные?
Приходящие байты видны, но не на все команды есть ответы.
на CONNECT я так и не увидел, на SUBSCRIBE и PINGREQ ответы ожидаемо есть.
Т.е. читаем правильно - client.read()
Закончил мучать связку SIM800L + MQTT
Выкладываю рабочую последовательность команд работы с модемом:
Хоть хтото чето полезного запостил. Спасибо, интересно.
// Моносокет, т.е. как я понял - единомоментно работаем только с одним сервером
Я так понимаю, если не моносокет, то в
AT+CIPSTART,
AT+CIPSEND,
и еще коегде добавляется еще один параметр - номер соединения.RECV FROM:
Хоть хтото чето полезного запостил.
Во блин, крутышка посчитал что червь хоть что то знает :)
ЗЫ. Я вас уже давно просил, пожалуйста не отвечайте на мои посты, у меня на вас аллергия.
Ваш монолог прерывать не буду, алергией червя удовлетворен ;)
НО КАК БЛИН принудительно прочитать тему???? уже мозг сломал
Например указать подписки на топики в функции reconnect()
Ну и в callback:
Подскажите. Есть локальный сервер, нужно управлять устройством по протоколу MQTT.
Вопрос? Для MQTT обязательно нужен Интернет, или можно сделать свой локальный. Устройство будет работать в чистом поле где нет интернета
Для MQTT, как протокола, Интернет не нужен.
Извените, а протокол и брокер MQTT это одно и тоже или разные вещи?
Извените, а протокол и брокер MQTT это одно и тоже или разные вещи?
Брокер это облоко (сервер) , через который все работает по протаколу MQTT. Это самое главное без брокера не могут устройства (клиенты mqtt) обмениватся сообщениям.
Н а моем новом телефоне не работает mqtt протокол похоже, предыдущий телефон с андроид норм работал, а новый- Honor 9 lyte не связывается-пишет постоянно-ошибка соединения, кто сталкивался может? Брокер зарегистрирован на cloudmqtt.com, на смартфоне пробовал и mqttdash и mqtt dashboard, везде ошибка выходит, видать в телефоне что то не пропускает.
Н а моем новом телефоне не работает mqtt протокол похоже, предыдущий телефон с андроид норм работал, а новый- Honor 9 lyte не связывается-пишет постоянно-ошибка соединения, кто сталкивался может? Брокер зарегистрирован на cloudmqtt.com, на смартфоне пробовал и mqttdash и mqtt dashboard, везде ошибка выходит, видать в телефоне что то не пропускает.
1. это сайт про Ардуино
2. думаю конкретно у вас и/или оператора проблемы + перепроверьте логин/пароль/сайт для подключения
3. у меня Honor 6A Андроид 7 работает отлично.
Upd: вокруг меня много любителей ставить антивирус на Андроид, возможно и у вас что то режет трафик.
1.Ну так-на той стороне стоит Ардуино с ESP8266. И тема называется Снова MQTT.
2.Ну то что у меня проблемы-об том и речь. Логин и пароль верные, сто раз всё перепроверял, их несколько на разные устройства, это отпадает.
3. У меня Honor 9 с восьмым андроидом и не работает.
Ставил на голый андроид, сам антивирус не ставил,но скрытый есть там вроде,при проверке системы на вирусы надпись Аваст виден, будем копать в сторону рута, но это тоже не очень гуд, с роутом на старом смартфоне переставал работать Сбербанк онлай, ругался на рут.
Ох сомневаюсь что дело в андроиде и рут вам не нужен.
Найду телефон с 9м андроидом - проверю из любопытства.
Upd так если рут стоит, особенно если совсем не РСТ то с большой вероятностью не заработает
Метод PubSubClient::publish() кушает только си-шные строки, но никак не стринги. Т.е. в 45й строке должно быть
Во, коструктивчик, спасибо! А я было уже собрался ленивого в себе бороть и закуривать протокол ))
Похоже не победить этот андроид 8, буду переходить на Blynk.
Нашлись служебные данные?
Приходящие байты видны, но не на все команды есть ответы.
на CONNECT я так и не увидел, на SUBSCRIBE и PINGREQ ответы ожидаемо есть.
Т.е. читаем правильно - client.read()
У меня на запрос пинга cloudmqtt.com почему то дисконнектит. может я его не правильно отсылаю?
У меня на запрос пинга cloudmqtt.com почему то дисконнектит. может я его не правильно отсылаю?
[/quote]
Конечно не правильно.
А дисконнектит вас сервер скорее всего из за того что заканчивается timeout время, отсылаемое сервером в CONNECT PACKET - выше опять же примеры - вставлете свое нужное время и сервер будет это время держать.
Так для этого пинги и посылаю чтоб не заканчивалось. Если пинги не кидаю дисконнектит по таймауту, как положено. Но если послать пинг, хоть сразу после подключения - дисконнектит сразу.
Так для этого пинги и посылаю чтоб не заканчивалось. Если пинги не кидаю дисконнектит по таймауту, как положено. Но если послать пинг, хоть сразу после подключения - дисконнектит сразу.
значит кривой пакет
Upd: в логах самого сервера что нибудь вразумительное есть?
Разобрался, просто видимо не дожидался приглащения и брокеру улетал только "конец пакета" 1A без заголовка )) Вот так работает:
видимо не дожидался приглащения
Мне конечно пофиг :)
но этим страдают множество проектов для Sim800, не дожидаются ответа модема и шлют уже что то другое.....о стабильности и корректности работы таких проектов можно только мечтать.
Фейл.. опять отлетает, бред какой то... Я правильно понял из спецификации, пакет PINGREQ это 0xC0 0x00 и всё?
пакет PINGREQ это 0xC0 0x00 и всё?
да.
советы стандартные: смотреть что пишет модем, смотреть что пишет брокер, разбираться.....