Только начинаю осваивать Ардуино, примеры как правило помогают, но тут что-то затык. Смысл в том что 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 - как будто ничего не принимает. В чём может быть проблема, что я не так делаю?
Много чего может быть. Попробуйте работать с программой mqttSpy - она удобнее для разработки чтобы смотреть что происходит. https://kamilfb.github.io/mqtt-spy/
Так как коннект к брокеру проходит успешно, с большой вероятностью данные на брокер отправляются. Попробуйте подписаться на тот же топик, на который отправляете данные, и увидеть то, что отправляете из loop(). Подписка на топик в loop() не нужна: Код (C++): client.subscribe("Synotemper/Tco"); // подписывааемся по топик с данными Вы подписываетесь на данный топик в reconnect()
Спасибо! Действительно так. Это видимо я от отчаяния везде стал пихать Вот это вот действительно полезно оказалось! То что Witty отправляет - сам принимает. Но сторонний клиент с ним не работает почему-то. Может что-то с версией протокола не то?
Тут, как мне кажется, нужно смотреть настройки клиента. Коннект из клиента к брокеру проходит успешно? Попробуйте в клиенте послать что ни будь на какой-то топик, и получить с него же.
нет, там все в норме, и брокер и клиент работает не первый день, - мониторю систему отопления... решил вот кое-что навесить уже с управления, через ардуино, но скетч даже свои сообщения ловит не стабильно, а работать с другим клиентом вообще ничего не выходит, ни в ту ни в другую сторону.
Честно говоря, не совсем понял из объяснения, что работает, а что нестабильно. Мониторинг сами настраивали? На чем брокер? ...
Да вроде бы понятно писал: да, сам, брокер - mosquitto 1.4.9-5 (протокол 3.1.1) развернутый на Synology 212j Датчики 1-wire подключены и отдают на клиенты (MQTT Dash) температуры и работу (вкл/выкл) насосов системы отопления (параллельно заливая данные на народный мониторинг bash скриптом). Всё работает отлично. Теперь Ардуино. Скетч, устанавливает wifi соединение, цепляется к mqtt серверу, вывод в порт говорит о том, что периодически происходит реконнект, оформляет подписку на свою же публикацию - данные на порту говорят о том, что вроде бы ардуино принимает отсылаемые данные, но как то странно не стабильно, то есть прием, то пропуски какие-то. А вот до моего клиента (на смартфоне) данные вообще не долетают. Так же не долетает до ардуино публикуемые данные контроля системы отопления, а так же специально созданный топик на смартфоне для передачи на ардуино. Вообще не долетает ничего "из вне" ардуинки..
Я Вам давал ссылочку на снифер MqttSpy... Чтобы точно понять где что... Там можно подписаться на топик # и наблюдать абсолютно все что происходит на брокере. В результате, часто рассеиваются заблуждения относительно происходящего.
так то оно так, только толком не разобрался я с ним пока, запускается и через какое то время выключается... в какой то момент он ардуинкины топики увидел, потом тишина (пытался всё настраивать ), но при этом топики mqtt клиента смартфона так и не увидел, что весьма странно, так как исходная система работает исправно. Сегодня попробую ещё раз понастраивать снифер, может получится.
Это как, у меня длительный галюционез? Система работает и к ней никаких претензий нет. Я по ней теперь даже отключение света в районе засекаю - как только народный мониторинг присылает что датчики чего то молчат, значит у провайдера электричество кончилось... А моя mqtt система данные исправно шлёт и принимает.
ну в принципе это помогло локализовать проблему Дело в том что топик регистрозависим, эк я тормознул, решил "красиво написать" в скетче, а в снифер из него уже копировал ! Ладно буду дальше свой проект пилить помаленьку. Всем спасибо за участие! PS и никаких чудес
Вы вероятно никогда не делаете ошибок копипаста... Я рад за Вас. Для меня тема ардуинки - новая, в глубоковечерних погружениях в неё неудивительно совершить глупую ошибку копипаста и не подумать даже об этом. Ну а чудес не бывает, бывают глупости.