Загрузка…
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,
- 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 port1883
. - 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
В процессе инсталляции «умного дома» мы установили интеллектуальные выключатели, розетки, много датчиков и т.д. Но всем этим надо управлять, получать с этих устройств информацию. Данная статья о том как управлять умным домом через протокол MQTT с мобильного телефона или планшета, отправлять и получать сообщения с сервера.
Практически каждый производитель оборудования имеет свое фирменное приложение для установки на мобильные устройства: Broadlink — приложение с аналогичным названием, Sonoff — программу eWelink. Что мы имеем в результате:
1.-Кучу программ на смартфоне, которые занимают место
2.-Неудобство в использовании для выполнения разных действий приходится открывать несколько приложений.
3.-Кроме всего — подключение к иностранным серверам, которые в нашем постоянно меняющимся мире всегда можно отключить для определенной страны. Сейчас мы наблюдаем как это делается при помощи санкций.
Выгоднее иметь одно приложение, которое подключается к российскому серверу и управляет всеми устройствами и получает с них телеметрию. На данный момент популярный протокол MQTT обеспечивает передачу команд между разными устройствами «Умного дома». Его преимущества по отношению к другим протоколам:
— низкое потребление трафика;
— соединение между клиентом и сервером всегда открыто;
— не нагружает интернет канал;
— отсутствие задержек в передаче данных;
— удобная система подписок на топики;
Эта система управления состоит из двух частей:
-Сервера, как правило одного. Сервер MQTT можно создать свой Например на микрокомпьютере Raspberry установить mosquitto или использовать посторонние сервисы. Сервер служит как бы посредником при передачи и получении данных между клиентами. Если вы желаете получать данные и управлять устройствами в любой точке мира то надо использовать внешний сервер. Я использую WQTT.RU. Можно использовать два сервера MQTT — локальный и внешний, в этом случае необходимо установить между ними сетевой мост.
-Клиентов, которых может быть много.
Описывать подробно работу протокола MQTT не буду, про это достаточно много есть информации в интернете. Нас интересует настройка самого приложения для мобильных устройств MQTT Dash.
Клиентов-приложений под Android большое количество, с разными возможностями. Есть с ограниченными возможностями, платные и т.д. Из всех приложений мне понравился клиент MQTT Dash. Скачать можно по ссылке. Для скачивания включайте VPN.
С установкой думаю не возникнет ни каких проблем. После инсталляции запускаем программу и переходим к настройке приложения. В верху экрана щелкаем по кнопке +
Данные — логин, пароль (password), номер порта. Данные для настройки берем с панели управления брокера
Немного о следующих настройках — Идентификатор ставится автоматически. Размер плиток выбираем по желанию, потом можно поменять. После ввода настроек сохраняемся нажав на значок дискеты в верхней части экрана. Приложение позволяет устанавливать связь с разными серверами. То есть при сбое связи одного сервера Вы можете переключиться на другой и «умный дом» продолжит выполнять свои функции.
Входим в созданное нами соединение и подключаем клиента (client) к серверу. Если не получаем ни каких уведомлений — то подключение к серверу установлено. Если получаем уведомления необходимо возвратиться назад в настройки соединения. Самая распространенная ошибка — при копировании параметров в настройках прописываются лишние знаки пробела и соединение не устанавливается. Зайдя в соединения щелкаем по «+» получаем вот такое меню.
Рассмотрим кратко пункты меню:
Текст Имя может быть любым, в том числе и на русском. Ниже название топика ( Topic), так как в данном случае мы только получаем данные публикацию не включаем. Поля «Префикс» и «Постфикс» служат для ввода дополнительной информации. Показывая мгновенные потребления тока при помощи «Постфикса» показывает единицу измерения — а (ампер). После введения информация не забываем сохраниться. Если надо вывести много параметров то для простоты создания виджетов их можно клонировать, для этого нажать пальцем на виджете и подержать. Появится меню: выбираем копировать.
Переключатель/кнопка Используется для включения выключения различного оборудования, например освещения.
Выбираем нужную картинку для отображения на экране и нужный цвет. Также можно изменять цвет выводимого текста.
Обращаю внимание — подпункты «Вкл» и «Выкл» должны прописываться точно так как на сервере. Если сервере прописано включение «1», а в приложение вы прописали «ON» работать не будет
Диапазон/прогресс Работает как поле «Текст», но кроме этого выводит графический диапазон значения. Выглядит примерно так — виджет в самом низу показывает напряжение
С остальными пунктами меню тоже особых проблем нет, пробуйте. Аппетит приходит во время еды. Думаю, что примеры выше помогут вам в настройках. Вопросы лучше задавать через форму связи на моем сайте
Подключение к mqtt серверу.
Тема в разделе «ESP8266, ESP32», создана пользователем a1000, 21 фев 2021.
-
a1000
ГуруПробую поиграться с MQTT. В качестве сервера выбрал https://clusterfly.ru. В качестве приложения на смартфон установил mqtt dash. Всё как-бы удалось и запустилось. Прикрутил к ESP DS18b20 — всё работает, данные отправляются. На слудующий день попробовал запустить mqtt dash на другом смартфоне. Настройки внёс те-же самые, перепроверял раз десять, но результата нет. Не соеденяется с брокером и всё. В то-же время на первом смартфоне всё нормально, данные приходят и обновляются. На сервере написано — «Кол-во подключений не ограничено.» В чём может быть проблема?
a1000,
21 фев 2021
#1 -
parovoZZ
ГуруЕсть подозрение, что вся эта халява складируется в одном месте не просто так. Сколько потом будет стоить база данных с привязкой к соц. сетям?
parovoZZ,
22 фев 2021
#2 -
KindMan
ГуруДа, там и рефералка была на али. Бесплатно ведь
KindMan,
22 фев 2021
#3 -
SergeiL
Оракул
МодераторИмена подключаемых устройств разные? Они не должны совпадать.
SergeiL,
22 фев 2021
#4 -
a1000
ГуруРазобрался. Второй телефон сильно умным оказался. После точки самомтоятельно вставлял пробел. Поэтому адрес сервера был неверным. Поубирал пробелы, всё заработало.
a1000,
23 фев 2021
#5 -
chumaty
НубЕсли вопрос еще актуальный, то нисколько не будет стоит.
chumaty,
7 окт 2021
#6
(Вы должны войти или зарегистрироваться, чтобы ответить.)
- Ваше имя или e-mail:
- У Вас уже есть учётная запись?
-
- Нет, зарегистрироваться сейчас.
- Да, мой пароль:
-
Забыли пароль?
-
Запомнить меня
- Вики
- Видео
- Форум
В качестве расширения этого вопроса и на основе ответов я использую 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)
Вкратце,
- Я пытаюсь подключиться к работающему брокеру
eclipse mqtt
в контейнере докера, связанном с IP-адресом172.17.0.2
прослушивает порт1883
. - Приложение 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