Меню

Mqtt dash ошибка соединения

В процессе инсталляции «умного дома» мы установили интеллектуальные выключатели, розетки, много датчиков и т.д. Но всем этим надо управлять, получать с этих устройств информацию. Данная статья о том как управлять умным домом через протокол MQTT, отправлять и получать сообщения с сервера

Практически каждый производитель оборудования имеет свое фирменное приложение для установки на мобильные устройства: Broadlink — приложение с аналогичным названием, Sonoff — программу eWelink. Что мы имеем в результате:

1.-Кучу программ на смартфоне, которые занимают место

2.-Неудобство в использовании для выполнения разных действий приходится открывать несколько приложений.

3.-Кроме всего — привязка к иностранным серверам, которые в нашем постоянно меняющимся мире всегда можно отключить для определенной страны. Сейчас мы наблюдаем как это делается при помощи санкций.

Выгоднее иметь одно приложение, которое управляет всеми устройствами и получает с них телеметрию. На данный момент популярный протокол MQTT обеспечивает передачу данных между разными устройствами «Умного дома». Его преимущества по отношению к другим протоколам:

— низкое потребление трафика;

— соединение между клиентом и сервером всегда открыто;

— не нагружает интернет канал;

— отсутствие задержек в передаче данных;

— удобная система подписок на топики;

Эта система управления состоит из двух частей:

-Сервера, как правило одного. Сервер можно создать свой Например на микрокомпьютере Raspberry установить mosquitto или использовать посторонние сервисы. Сервер служит как бы посредником при передачи и получении данных между клиентами. Если вы желаете получать данные и управлять устройствами в любой точке мира то надо использовать внешний сервер. Я использую WQTT.RU

-Клиентов, которых может быть много.

Описывать подробно работу протокола MQTT не буду, про это достаточно много есть информации в интернете.

Клиентов-приложений под Android большое количество, с разными возможностями. Есть с ограниченными возможностями, платные и т.д. Из всех приложений мне понравился клиент MQTT Dash. Скачать можно по ссылке. Для скачивания включайте VPN.

GooglePlay скачиваем MQTT Dash

С установкой думаю не возникнет ни каких проблем. После инсталляции запускаем программу. В верху экрана щелкаем по кнопке +

Добавление сервера MQTT Dash
прописываем параметры сервера MQTT
настройка сервера MQTT Dash

Данные — логин, password, номер порта для настройки берем с панели управления брокера

параметры сервера на Broker

Немного о настройках — Идентификатор ставится автоматически. Размер плиток выбираем по желанию, потом можно поменять. После ввода настроек сохраняемся нажав на значок дискеты в верхней части экрана. Приложение позволяет устанавливать связь с разными серверами. То есть при сбое связи одного сервера Вы можете переключиться на другой и «умный дом» продолжит выполнять свои функции.

Входим в созданное нами соединение и подключаем клиента к серверу. Если не получаем ни каких уведомлений то соединение установлено. Если получаем уведомления необходимо возвратиться назад в настройки соединения. Самая распространенная ошибка — при копировании параметров в настройках прописываются лишние знаки пробела и соединение не устанавливается. Зайдя в соединения щелкаем по «+» получаем вот такое меню.

меню сервера MQTT Dash

Рассмотрим кратко пункты меню:

Текст Имя может быть любым, в том числе и на русском. Ниже название топика, так как в данном случае мы только получаем данные публикацию не включаем. Поля «Префикс» и «Постфикс» служат для ввода дополнительной информации. Показывая мгновенные потребления тока при помощи «Постфикса» показывает единицу измерения — а (ампер). После введения информация не забываем сохраниться. Если надо вывести много параметров то для простоты создания виджетов их можно клонировать, для этого нажать пальцем на виджете и подержать. Появится меню: выбираем копировать.

Топик Текст MQTT Dash

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

Топик кнопка MQTT Dash
Топик переключатель MQTT Dash

Выбираем нужную картинку для отображения на экране и нужный цвет. Также можно изменять цвет выводимого текста.

Обращаю внимание — подпункты «Вкл» и «Выкл» должны прописываться точно так как на сервере. Если сервере прописано включение «1», а в приложение вы прописали «ON» работать не будет

Диапазон/прогресс Работает как поле «Текст», но кроме этого выводит графический диапазон значения. Выглядит примерно так — виджет в самом низу показывает напряжение

Топик диапазон MQTT Dash

С остальными пунктами меню тоже особых проблем нет, пробуйте. Апетит приходит во время еды. Вопросы лучше задавать через форму связи на моем сайте

Подключение к mqtt серверу.

Тема в разделе «ESP8266, ESP32», создана пользователем a1000, 21 фев 2021.


  1. a1000

    a1000
    Гуру

    Пробую поиграться с MQTT. В качестве сервера выбрал https://clusterfly.ru. В качестве приложения на смартфон установил mqtt dash. Всё как-бы удалось и запустилось. Прикрутил к ESP DS18b20 — всё работает, данные отправляются. На слудующий день попробовал запустить mqtt dash на другом смартфоне. Настройки внёс те-же самые, перепроверял раз десять, но результата нет. Не соеденяется с брокером и всё. В то-же время на первом смартфоне всё нормально, данные приходят и обновляются. На сервере написано — «Кол-во подключений не ограничено.» В чём может быть проблема?


    a1000,
    21 фев 2021

    #1


  2. parovoZZ

    parovoZZ
    Гуру

    Есть подозрение, что вся эта халява складируется в одном месте не просто так. Сколько потом будет стоить база данных с привязкой к соц. сетям?


    parovoZZ,
    22 фев 2021

    #2


  3. KindMan

    KindMan
    Гуру

    Да, там и рефералка была на али. Бесплатно ведь :)


    KindMan,
    22 фев 2021

    #3


  4. SergeiL

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

    Имена подключаемых устройств разные? Они не должны совпадать.


    SergeiL,
    22 фев 2021

    #4


  5. a1000

    a1000
    Гуру

    Разобрался. Второй телефон сильно умным оказался. После точки самомтоятельно вставлял пробел. Поэтому адрес сервера был неверным. Поубирал пробелы, всё заработало.


    a1000,
    23 фев 2021

    #5


  6. chumaty

    chumaty
    Нуб

    Если вопрос еще актуальный, то нисколько не будет стоит.


    chumaty,
    7 окт 2021

    #6

(Вы должны войти или зарегистрироваться, чтобы ответить.)

Показать игнорируемое содержимое

Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня


Амперка / Форум

  • Вики
  • Видео
  • Форум

As an extension of this question and based on the answers, I am using websockets to connect to MQTT broker using dash_mqtt taking this app script as a reference. But I am not able to send or receive data with the configuration in the below app.py.

import dash_mqtt
import dash
from dash.dependencies import Input, Output, State
import dash_html_components as html
import dash_core_components as dcc
import flask
import json
import paho.mqtt.client as mqtt



TEST_SERVER = '172.17.0.2'
TEST_SERVER_PORT = 1883
TEST_SERVER_PATH = 'mqtt'
MESSAGE_OUT_TOPIC = 'testtopic'
MESSAGE_IN_TOPIC = 'testtopic'

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

server = flask.Flask(__name__)
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.config.suppress_callback_exceptions = True



app.layout = html.Div([
    dash_mqtt.DashMqtt(
        id='mqtt',
        broker_url=TEST_SERVER,
        broker_port = TEST_SERVER_PORT,
        broker_path = TEST_SERVER_PATH,
        topics=[MESSAGE_IN_TOPIC]
    ),
    html.H1('MQTT echo'),
    html.P('MQTT echo server to ' + TEST_SERVER + ' on port ' + str(TEST_SERVER_PORT)),
    dcc.Input(
        id='message_to_send',
        placeholder='message to send',
        debounce = True),
    html.Button('Send',id='send'),
    html.Div(id='return_message')
])


@app.callback(
        Output('mqtt', 'message'),
        Input('send', 'n_clicks'),
        State('message_to_send', 'value')
    )
def display_output(n_clicks, message_payload):
    if n_clicks:
        return {
            'topic': MESSAGE_OUT_TOPIC,
            'payload' : message_payload
        }
    return dash.no_update

if __name__ == '__main__':
    app.run_server(host='0.0.0.0',port=8050,debug=True) 

In brief,

  1. I am trying to connect to eclipse mqtt broker which is running
    in a docker container associated with the IP address
    172.17.0.2 listening to the port 1883.
  2. Dash app is running in another docker container with the port 8050.

All the basic configuration to the mosquitto.config file is done so that it listens and responds to external communications. Also, this app runs successfully without errors in the log but cannot communicate with the MQTT broker.

What configuration changes should I have to make to connect to the broker?

Thank you

Edit: The browser console saysWebSocket connection to 'ws://172.17.0.2:1883/mqtt' failed:

mosquitto.conf

# Config file for mosquitto

# =================================================================
# Listeners
# =================================================================

# listener port-number [ip address/host name/unix socket path]
listener 1883

# =================================================================
# Persistence
# =================================================================

persistence True

# =================================================================
# Security
# =================================================================

# Defaults to false, unless there are no listeners defined in the configuration
# file, in which case it is set to true, but connections are only allowed from
# the local machine.
allow_anonymous True

  • #21

А почему пробелы в конце мешают? 16 символов не помещается в виджет?

Просто с этими пробелами перенос на новую строку в андроид срабатывает таким образом, как вы это видите. Это не мой код, а код андроид. Без этих пробелов строка разбивается на две и отображается по центру корректно. А в вашем случае также пытается еще и уместить ваши пробелы, что не имеет смысла. Они не несут смысловой нагрузки.
Виджет просто отображает то, что вы ему даете.

  • #22

Что ж, прерву затишье в теме, раз никто это не делает вместо меня :)
В моем доме для каждого помещения несколько изменяемых параметров и отображаемых величин, порядка десятка на каждую комнату, коридор, кухню, ванную. На квартиру в сумме больше 50 наберется. Всё это помещать на одну страницу — крайне сомнительное занятие… Один из вариантов решения, который можно увидеть в Linear MQTT Dashboard — закладки (tab’ы), между которыми можно переключаться. На текущий момент можно наделать для каждой комнаты отдельное подключение и обозвать их соответственно «Кухня», «Коридор» и т.д., но ведь подключения сделаны не для этого. К примеру, можно сделать внутри подключения еще квадратики, по нажатию на которых будут открываться те или иные метрики.
Также в Range/progress есть неудобство. Довольно сложно быстро выставить минимальное или максимальное значение, т.к. одно переходит в другое очень быстро. Т.е. если светодиодная лента управляется при помощи Range/progress — быстро выставить нулевую яркость, не выверяя движение пальцем, затруднительно…

  • #23

Всё это помещать на одну страницу — крайне сомнительное занятие…

Согласен. Но пока так. Процесс переделки займет много времени, которого у меня пока нету. Но я думал уже об этом.

Довольно сложно быстро выставить минимальное или максимальное значение,

Я попробую увеличить элементы, но всегда найдется значение, которое тяжело выставить, например от 0 до 1000 с точностью 2 знака после запятой.
Я на вашем месте использовал бы мульти-переключатель с десятком предопределенных значений. Для освещения 10 градаций яркости более, чем достаточно.

Спасибо.

  • #24

Заметил странную особенность при сохранении значений топиков.
У меня есть два соединения, например, connection1 и connection2. Если выйти из connection1 и снова войти в него, то при входе отображаются те значения, которые были при выходе. А вот если после выхода из connection1 зайти в connection2, то отображаются сохраненные когда-то ранее значения, и обновляются только после прихода новых публикаций.
Подозреваю, что значения для соединений сохраняются только при выходе из программы. А при входе в другое соединение теряются. Нельзя ли как-то сохранять их в этом случае?

  • #25

А вот если после выхода из connection1 зайти в connection2, то отображаются сохраненные когда-то ранее значения

Ну так все правильно. А как должно быть по-вашему? Каждое соединение независимо. Даже если они работают с одним и тем же брокером. Значения сохраняются в пределах соединения, но не в пределах программы.

  • #26

А как должно быть по-вашему?

Хотелось бы, чтобы при выходе из соединения сохранялись последние значения топиков (те, которые были при выходе). Сейчас не так.

  • #27

Если выйти из connection1 и снова войти в него, то при входе отображаются те значения, которые были при выходе.

Хотелось бы, чтобы при выходе из соединения сохранялись последние значения топиков (те, которые были при выходе). Сейчас не так.

Не понимаю, если честно.

  • #28

Странно, но сейчас все нормально отображается. Может глюк какой был )
Вопрос пока снимается.

  • #29

Всем привет! Заметил в обновленной версии в плей маркете на скринах webcam. Подскажите пожалуйста как реализовать данную возможность ? На сколько я понимаю, сервер mqtt не поддерживаеттпотоковое видео, с чем и связанно у меня данное затруднение. Скажу поясню,,я только начинаю вникать в С++)) но собрал кое как скетч с релюшками и датчиком dht22.
Прогой Вашей очень доволен и готов отблагодарить, лишь бы Ваш интерес к ней не пропал ))

  • #30

Заметил в обновленной версии в плей маркете на скринах webcam. Подскажите пожалуйста как реализовать данную возможность ?

На скрине вебкамера отдает данные в формате JPEG. Если у вас есть такая на примете — надо просто взять URL изображения со странички.
Есть также IP камеры, которые помимо главного потока умеют отдавать JPEG, которыми я успешно пользуюсь. Это не real-time, но с обновлением картинки раз в пару секунд можно оценить обстановку.

  • #31

и готов отблагодарить, лишь бы Ваш интерес к ней не пропал ))

Я не из-за денег. Но все-равно — спасибо )

  • #32

1) нужно найти способ выгрузки этого JPEGa на сервет mqtt?

Возможно, но это длинный путь (хотя самый универсальный — не надо пробрасывать порты внутрь).
Обычно, китайские камеры имеют как минимум 3 потока, rtsp, mjpeg и jpeg. И возможность загрузки изображений на FTP.
Также, если зайти в веб-интерфейс, то там будет нечто похожее, как на изображении.
Screen Shot 2016-12-20 at 9.54.11 PM.png

В моем случае «No Plug-In Mode (for smartphone browser)» как раз то, что нужно.

  • #33

Другими словами, либо файл изображения как MQTT данные, либо — загрузка из URL с нужным интервалом.

  • #34

Возможно, но это длинный путь (хотя самый универсальный — не надо пробрасывать порты внутрь).
Обычно, китайские камеры имеют как минимум 3 потока, rtsp, mjpeg и jpeg. И возможность загрузки изображений на FTP.
Также, если зайти в веб-интерфейс, то там будет нечто похожее, как на изображении.
Посмотреть вложение 2864

В моем случае «No Plug-In Mode (for smartphone browser)» как раз то, что нужно.

Привет! Помоги плиззз.
В моем случае снэпшот с камеры могу просматривать только в окне браузера.
Как видно из скрина ниже, функциz No Plug-In Mode у меня отсутствует, а snapshot mode (for smarthone) несет в себе видео картинку.

URL на jpeg файл к сожалению работает только в домашней сети wifi

скинь пример URL свой , может на основе него смогу себе подобрать.

upload_2016-12-23_22-23-47.png

  • upload_2016-12-23_22-9-55.png

    208.5 KB
    Просмотры: 10

  • #35

URL на jpeg файл к сожалению работает только в домашней сети wifi

Так snapshot и нужен (URL на файл изображения).
Если собрался смотреть из вне, не через свой вайфай, то тебе нужен статический белый IP или DynDNS или NoIP
плюс пробросить порт на роутере из вне на камеру.
К сожелению это все относится к насторойке сетей и тема обширная. К приложению это не имеет отношения.
В общем, ищи по ключевым словам «DynDNS», «пробросить порт».

  • #36

Добрый вечер, в вашей программе нет возможности подавать звуковой сигнал по выходу того или иного параметра за указанные пределы?
Казалось бы простая функция сигнализировать о понижении или повышении температуры, или не обновлении данных, но не в одном из существующих приложений не нашел. неужели ни для кого не важно что например данные не поступают или где то вышло из строя отопление?
Из пожеланий можно высказать это регулирование размера шрифта и размера плитки, и ее цвета. На планшете смотрится мелковато. А так по моему ваша программа лучшая из того что есть.

  • #37

нет возможности подавать звуковой сигнал по выходу того или иного параметра за указанные пределы?

Нет, такой возможности нет. Слишком много сценариев, вашими же словами:

понижении или повышении температуры

данные не поступают или где то вышло из строя отопление

плюс еще могу набрать десяток условий, по которым можно было-бы сигнализировать звуком/цветом. Пользовательский интерфейс настройки превратится в ад. Для вас, может это и не составит труда настроить, но для кого-то — очень сложно и можно заблудиться в настройках. С самого начала я придерживался принципа простоты, и хотел-бы придерживаться его дальше.
Возможно, это можно будет реализовать через JavaScript (когда будет реализовано), но это тоже потребует навыков программирования, хоть и не сложных.
Не получится сделать на все случаи жизни к сожалению. Хочется придерживаться простоты.

  • #38

Понятно — спасибо за оперативный ответ. Придется в железе делать — ибо очень надо или разбираться с LOT.

  • #39

В общем, ищи по ключевым словам «DynDNS», «пробросить порт»

как раз этим параллельно и занимался, благодарю за пинок))

Добрый вечер, в вашей программе нет возможности подавать звуковой сигнал по выходу того или иного параметра за указанные пределы?
Казалось бы простая функция сигнализировать о понижении или повышении температуры, или не обновлении данных, но не в одном из существующих приложений не нашел. неужели ни для кого не важно что например данные не поступают или где то вышло из строя отопление?
Из пожеланий можно высказать это регулирование размера шрифта и размера плитки, и ее цвета. На планшете смотрится мелковато. А так по моему ваша программа лучшая из того что есть.

Согласен, вся суть умного дома и заключается в своевременном оповещении о той или иной проблеме в жилище. Но для начала и этот вариант интересный. Думаю автор со временем допилит функционал, за что я прям пальцы крещу))

  • #40

Понятно — спасибо за оперативный ответ. Придется в железе делать — ибо очень надо или разбираться с LOT.

был уверен что (IOT) иот

yesterday: i changed the way i collect data from my thinspeak channel from the ThingSpeak arduino library to mqtt. it worked like a charm.

today: my ESP8266 tells me that he is connected. but no data comes from the subscription and so the esp8266 will try to reconnect.

I think i reached the maximum of mqtt clients (3 clients in free mode). Is there a way to reset the clients to reconnect?

#include <EEPROM.h>

#include <ESP8266WiFi.h>

#include <PubSubClient.h>

#include <Wire.h>

const char ssid[] = «xxxxxxx»; //Insert your SSID

const char pass [] = «xxxxxxxxx»; /Insert Your password

const char* mqtt_server = «mqtt.thingspeak.com»;

const char* mqttUserName = «xxxxxxxxxxx»; // Thingspeak username.

const char* mqttPass = «xxxxxxxxxxxxxxxx»; // Change to your MQTT API Key from Account > MyProfile.

const char* ChannelID = «xxxxxx»; // Thingspeak Channel ID

const char* APIKey = «xxxxxxxxxxxxxxxx»; // Thingspeak Channel Read API Key

String Temp_String;

WiFiClient espClient;

PubSubClient client(espClient);

const byte ledPin = 0; // Pin with LED on Adafruit Huzzah

void callback(char* topic, byte* payload, unsigned int length) {

Serial.print(«Data received: «);

Serial.print(«Temperature «);

for (int i = 0; i < length; i++) {

char receivedChar = (char)payload[i];

Temp_String += (char)payload[i];

}

float TS_Temp = Temp_String.toFloat();

Serial.print(TS_Temp);

TS_Temp = 0;

Temp_String = «»;

Serial.println();

}

void reconnect() {

// Loop until we’re reconnected

while (!client.connected()) {

Serial.print(«Attempting MQTT connection…»);

// Attempt to connect

if (client.connect(«ESP8266», mqttUserName, mqttPass)) {

Serial.println(«connected»);

//

client.subscribe(«channels/INSERT YOUR CHANNEL ID HERE/subscribe/fields/field1/INSERT YOUR API READ KEY HERE»);

} else {

Serial.print(«failed, rc=»);

Serial.print(client.state());

Serial.println(» try again in 5 seconds»);

// Wait 5 seconds before retrying

delay(5000);

}

}

}

void setup()

{

Serial.begin(115200);

delay(250);

client.setServer(mqtt_server, 1883);

client.setCallback(callback);

WiFi.disconnect();

delay(100);

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, pass);

while (WiFi.status() != WL_CONNECTED) {

Serial.print(«.»);

delay(500);

}

Serial.print(«OK»);

Serial.println();

}

void loop()

{

if (!client.connected()) {

reconnect();

}

client.loop();

}

yesterday: i changed the way i collect data from my thinspeak channel from the ThingSpeak arduino library to mqtt. it worked like a charm.

today: my ESP8266 tells me that he is connected. but no data comes from the subscription and so the esp8266 will try to reconnect.

I think i reached the maximum of mqtt clients (3 clients in free mode). Is there a way to reset the clients to reconnect?

#include <EEPROM.h>

#include <ESP8266WiFi.h>

#include <PubSubClient.h>

#include <Wire.h>

const char ssid[] = «xxxxxxx»; //Insert your SSID

const char pass [] = «xxxxxxxxx»; /Insert Your password

const char* mqtt_server = «mqtt.thingspeak.com»;

const char* mqttUserName = «xxxxxxxxxxx»; // Thingspeak username.

const char* mqttPass = «xxxxxxxxxxxxxxxx»; // Change to your MQTT API Key from Account > MyProfile.

const char* ChannelID = «xxxxxx»; // Thingspeak Channel ID

const char* APIKey = «xxxxxxxxxxxxxxxx»; // Thingspeak Channel Read API Key

String Temp_String;

WiFiClient espClient;

PubSubClient client(espClient);

const byte ledPin = 0; // Pin with LED on Adafruit Huzzah

void callback(char* topic, byte* payload, unsigned int length) {

Serial.print(«Data received: «);

Serial.print(«Temperature «);

for (int i = 0; i < length; i++) {

char receivedChar = (char)payload[i];

Temp_String += (char)payload[i];

}

float TS_Temp = Temp_String.toFloat();

Serial.print(TS_Temp);

TS_Temp = 0;

Temp_String = «»;

Serial.println();

}

void reconnect() {

// Loop until we’re reconnected

while (!client.connected()) {

Serial.print(«Attempting MQTT connection…»);

// Attempt to connect

if (client.connect(«ESP8266», mqttUserName, mqttPass)) {

Serial.println(«connected»);

//

client.subscribe(«channels/INSERT YOUR CHANNEL ID HERE/subscribe/fields/field1/INSERT YOUR API READ KEY HERE»);

} else {

Serial.print(«failed, rc=»);

Serial.print(client.state());

Serial.println(» try again in 5 seconds»);

// Wait 5 seconds before retrying

delay(5000);

}

}

}

void setup()

{

Serial.begin(115200);

delay(250);

client.setServer(mqtt_server, 1883);

client.setCallback(callback);

WiFi.disconnect();

delay(100);

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, pass);

while (WiFi.status() != WL_CONNECTED) {

Serial.print(«.»);

delay(500);

}

Serial.print(«OK»);

Serial.println();

}

void loop()

{

if (!client.connected()) {

reconnect();

}

client.loop();

}

В качестве расширения этого вопроса и на основе ответов я использую websockets для подключения к MQTT-брокеру с помощью dash_mqtt использования этого скрипта приложения в качестве ссылка. Но я не могу отправлять или получать данные с конфигурацией ниже app.py.

import dash_mqtt
import dash
from dash.dependencies import Input, Output, State
import dash_html_components as html
import dash_core_components as dcc
import flask
import json
import paho.mqtt.client as mqtt



TEST_SERVER = '172.17.0.2'
TEST_SERVER_PORT = 1883
TEST_SERVER_PATH = 'mqtt'
MESSAGE_OUT_TOPIC = 'testtopic'
MESSAGE_IN_TOPIC = 'testtopic'

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

server = flask.Flask(__name__)
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.config.suppress_callback_exceptions = True



app.layout = html.Div([
    dash_mqtt.DashMqtt(
        id='mqtt',
        broker_url=TEST_SERVER,
        broker_port = TEST_SERVER_PORT,
        broker_path = TEST_SERVER_PATH,
        topics=[MESSAGE_IN_TOPIC]
    ),
    html.H1('MQTT echo'),
    html.P('MQTT echo server to ' + TEST_SERVER + ' on port ' + str(TEST_SERVER_PORT)),
    dcc.Input(
        id='message_to_send',
        placeholder='message to send',
        debounce = True),
    html.Button('Send',id='send'),
    html.Div(id='return_message')
])


@app.callback(
        Output('mqtt', 'message'),
        Input('send', 'n_clicks'),
        State('message_to_send', 'value')
    )
def display_output(n_clicks, message_payload):
    if n_clicks:
        return {
            'topic': MESSAGE_OUT_TOPIC,
            'payload' : message_payload
        }
    return dash.no_update

if __name__ == '__main__':
    app.run_server(host='0.0.0.0',port=8050,debug=True) 

Вкратце,

  1. Я пытаюсь подключиться к работающему брокеру eclipse mqtt в контейнере докера, связанном с IP-адресом 172.17.0.2 прослушивает порт 1883.
  2. Приложение Dash работает в другом док-контейнере с портом 8050.

Вся базовая конфигурация файла mosquitto.config выполняется таким образом, чтобы он прослушивал внешние сообщения и отвечал на них. Кроме того, это приложение успешно работает без ошибок в журнале, но не может обмениваться данными с брокером MQTT.

Какие изменения конфигурации мне нужно внести, чтобы подключиться к брокеру?

Спасибо

Изменить: консоль браузера говорит WebSocket connection to 'ws://172.17.0.2:1883/mqtt' failed:

mosquitto.conf

# Config file for mosquitto

# =================================================================
# Listeners
# =================================================================

# listener port-number [ip address/host name/unix socket path]
listener 1883

# =================================================================
# Persistence
# =================================================================

persistence True

# =================================================================
# Security
# =================================================================

# Defaults to false, unless there are no listeners defined in the configuration
# file, in which case it is set to true, but connections are only allowed from
# the local machine.
allow_anonymous True

1 ответ

Как указано в комментариях,

Вы не можете использовать один и тот же порт для Native MQTT через TCP и MQTT через Websockets, поэтому вам нужно добавить второго прослушивателя в mosquitto.conf

Например

listener 1884
protocol websockets

И измените порт в своем приложении на 1884.


0

hardillb
19 Июл 2021 в 18:24

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Mql5 код ошибки 4756
  • Mql4 код ошибки 5004