dontsovcmc / waterius

Передача показаний воды по Wi-Fi. Watermeter Wi-Fi transmitter.
https://waterius.ru
GNU Lesser General Public License v3.0
569 stars 108 forks source link

MQTT support #77

Closed popsodav closed 5 years ago

popsodav commented 5 years ago

Поддержка протокола MQTT для Waterius

dontsovcmc commented 5 years ago

@popsodav Спасибо за вклад в общее дело! А давайте оптимизируем

  1. Вместо отдельных топиков: mqtt_topic_c0 mqtt_topic_c1 mqtt_topic_bat

сделайте 1 топик: mqtt_topic, а в его подтопики отсылайте уже данные. Тогда можно будет быстро масштабировать кол-во параметров. Поля можно взять из JSON, чтобы не сочинять. https://github.com/dontsovcmc/waterius/blob/master/Export.md#%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-http-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0

  1. Важный момент аутентификации устройства. В MQTT можно сделать логин\пароль, а можно в топик добавить уникальный token: Так: // Иначе данные будут приходить без привязки к ID устройства (token).

Что скажете? Допишите?

popsodav commented 5 years ago

Да, исправлю. По второму пункту не совсем понял. В PubSub клиенте устанавливается уникальный ID клиента на основе MAC-адреса. это не то?

dontsovcmc commented 5 years ago

Отлично, спасибо!

  1. Топик некорректно отобразился: Вот,что предлагаю: Topic/token/parameter

Уникальный ID клиента недостаточно для безопасности. Мак адреса у 1 производителя могут отличаться на несколько цифр. важно видеть с какого устройства пришел топик и чтобы никто не смог вместо нас отослать данные. Можно токен в clientID записать. Тогда увидим, с какого клиента мы получаем данные. Я не видел,чтобы так делали, но я мало видел систем.

OloloevReal commented 5 years ago

Позвольте вставиться свои пять копеек, в sdk esp есть system_get_chip_id() возвращает ID устройства, пишут на форумах что уникальный, по факту часть MAC адреса Можно его использовать для идентификации устройства. К сожалению у attiny ничего похожего на id или серийный номер нет, а то получилась бы совсем уникальная связка.

На примере Blynk аутентификация и авторизация устройства осуществляется только по токену

dontsovcmc commented 5 years ago

Идея в чем: у вас MQTT Брокер и 20 устройств. Вы безусловно отличите их по MAC адресу. Но если мы говорим, что никто не должен знать токен (фактически пароль), то нам нужно его сделать длинным. Это решает токен. А МАС адрес можно перебрать. Я бы взял в пример решения thingspeak, amazon - у них же mqtt для железок. у них там есть логин, пароль и т.п.. @popsodav посмотрите, пожалуйста. гиганты плохого не посоветуют. Пофлексить их решение всегда можно.

popsodav commented 5 years ago

Т.е. хотите включить токен в название топика? Наверно это юзер может сам сделать, если захочет. Например, забьёт в настройка топик вида: /waterius/тут_токен/

dontsovcmc commented 5 years ago

Кстати, да. Окей

dontsovcmc commented 5 years ago

Супер! Только есть ошибка с указателями логина/пароля.. Когда char*, то туда надо передавать либо null, либо целую строку. Потому что в коде будет подобная проверка if(user != NULL)и пустой логин ее пройдет (String(sett.mqtt_login).c_str()). я сейчас это исправлю.

dontsovcmc commented 5 years ago

@popsodav проверьте пожалуйста с логином/паролем и без. В ближайшие дни не смогу проверить с платой. Я думаю надо по дефалту test.mosquitto.org вписать. Конечно, нужно написать в документации, что это открытый брокер и только для тестирования. Что скажете?

dontsovcmc commented 5 years ago

Проверка доступа: в Ватериусе указываем:

mqtt хост: 192.168.1.5
mqtt порт: 1883
mqtt топик: waterius/6901727/
mqtt логин: test   // если нужна авторизация
mqtt пароль: test   // если нужна авторизация

Если нужна авторизация по логину и паролю инструкция:

Создаем файл с разрешенными логинами и паролями
mosquitto_passwd -b <полный путь>/pass.txt user password

в конфигурации mosquitto.conf:
allow_anonymous false
password_file <полный путь>/pass.txt

в конфигурации mosquitto.conf: bind_address 192.168.1.5 // говорим, чтобы работал на локальном ip

Запускаем локальный брокер с файлом конфигурации: mosquitto -c mosquitto.conf

Подписываемся на топики: mosquitto_sub -h 192.168.1.5 -t "waterius/#" -u "test" -P "test" -v

Запускаем Ватериус и видим данные:

waterius/6901727/ch0 0.00
waterius/6901727/ch1 0.00
waterius/6901727/delta0 0
waterius/6901727/delta1 0
waterius/6901727/voltage 2.95
waterius/6901727/resets 0
waterius/6901727/good 1
waterius/6901727/boot 8
waterius/6901727/imp0 0
waterius/6901727/imp1 0
waterius/6901727/version 5
waterius/6901727/version_esp 0.7