HBus

Kiruxa
Сообщения: 13
Зарегистрирован: Пн янв 16, 2017 12:26 pm
Благодарил (а): 0
Поблагодарили: 2 раза

Re: HBus

Сообщение Kiruxa » Сб апр 20, 2019 2:44 pm

надеюсь связь с мажодомо по MQTT будет?
Мне приехала пачка CAN трансиверов, как будет время, тоже займусь тестированием
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Сб апр 20, 2019 2:54 pm

Kiruxa писал(а):
Сб апр 20, 2019 2:44 pm
надеюсь связь с мажодомо по MQTT будет?
Именно с этого я собираюсь начать, когда разберусь с МД. Пока что антивирус (AVG) требует, чтобы я перезагрузил компьютер, поскольку ему надо передвинуть cycle.php в карантин.
За это сообщение автора akouz поблагодарил:
tarasfrompir (Сб апр 20, 2019 3:56 pm)
Рейтинг: 1.18%
Аватара пользователя
tarasfrompir
Сообщения: 3117
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 209 раз
Поблагодарили: 773 раза

Re: HBus

Сообщение tarasfrompir » Сб апр 20, 2019 3:56 pm

akouz писал(а):
Сб апр 20, 2019 2:54 pm
Kiruxa писал(а):
Сб апр 20, 2019 2:44 pm
надеюсь связь с мажодомо по MQTT будет?
Именно с этого я собираюсь начать, когда разберусь с МД. Пока что антивирус (AVG) требует, чтобы я перезагрузил компьютер, поскольку ему надо передвинуть cycle.php в карантин.
:o :o :o :o :lol: :lol: :lol: :lol: осталось только посмеятся :P :P :P
Спасибо нам ПОМОЖЕТ..!
serghei
Сообщения: 2567
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 300 раз
Поблагодарили: 281 раз

Re: HBus

Сообщение serghei » Сб апр 20, 2019 4:12 pm

Аналогично. Я просто закрываю окно антивируса.
За это сообщение автора serghei поблагодарил:
akouz (Сб апр 20, 2019 4:21 pm)
Рейтинг: 1.18%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Вс апр 21, 2019 9:36 am

tarasfrompir писал(а):
Сб апр 20, 2019 3:56 pm
осталось только посмеятся
Действительно, не плакать же.

- Бог с ним, с антивирусом. Невелика беда, вытащил их карантина, задал исключение. Но комментарии на сей счет ожидал бы увидеть не на форуме, а в руководстве по установке МД.
- Моей временнной зоны в МД нет, у меня +9.30. Вообще ни одного австралийского города нет. Новая Зеландия есть, богом забытые тихоокеанские острова есть, Австралии нет. Возможно, это сделано демонстративно, никакого иного объяснения в голову не приходит.
- По наивности я предполагал, что при установке МД будут установлены и все необходимые сервисы, включая MQTT. Очевидно, я ошибался, судя по тому, что в набор МД видосиков для начинающих включен ролик про установку брокера Москито.
- В ролике про установку Москито (почему-то автор делает ударение на последний слог) предлагается запомнить некие ссылки на дополнительные модули, нужные для установки. Однако эти ссылки отсутствуют в последних версиях установщика Москито. Я долго пялился в экран, пытаясь разгадать нужные URL, но безуспешно. Понять из ролика что это такое и зачем это нужно я тоже не смог.

В общем, чем дальше, тем смешнее.
Аватара пользователя
tarasfrompir
Сообщения: 3117
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 209 раз
Поблагодарили: 773 раза

Re: HBus

Сообщение tarasfrompir » Вс апр 21, 2019 12:08 pm

akouz писал(а):
Вс апр 21, 2019 9:36 am
В общем, чем дальше, тем смешнее.
по поводу австралиии - думаю что найти новую базу городов - это не проблема... даже я такое решу...
с отсальным не знаю чем и помочь
Спасибо нам ПОМОЖЕТ..!
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Вс апр 28, 2019 7:48 am

Kiruxa писал(а):
Сб апр 20, 2019 2:44 pm
надеюсь связь с мажодомо по MQTT будет?
Пока пишу скетч для WiFi шлюза (WiFi gateway), задумался о связывании топиков MQTT и TopicID MQTT-SN.

(1) Изначально я полагал задавать все TopicID "намертво", т.е. задавать их в скетчах. Всю работу по связыванию и по устранению противоречий предполагалось делать вручную. Со временем можно было бы написать PC-шную программку для облегчения процесса, что-то наподобие сверхлегковесной СУБД. Такая программка могла бы заодно и соответствующие куски скетчей генерировать.

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

Но это получается довольно громоздко, некрасиво как-то.

(2) Можно, конечно, возложить связывание на шлюз и использовать команды REGISTER и REGACK. Насколько я понимаю, MQTT-SN как раз и заточен на это: по запросу клиента REGISTER, шлюз в ответе REGACK назначает TopicID для запрошенного топика. Более того, в спецификации MQTT-SN даже сказано, что таблицы связывания желательно хранить для каждого клиента, а не в виде общего пула.

Однако это будет означать, что без шлюза система работать не сможет. Тогда как в варианте (1) все работает и без шлюза.

(3) Напрашивется вариант, когда узлы (клиенты) могут обмениваться командами REGISTER и REGACK даже при отсутствии шлюза. Наверное, достаточно было бы в узлах ввести задержку перед REGACK, тогда REGACK, выдаваемый шлюзом, получит приоритет. Ведь только шлюз может точно знать, какие TopicID уже использованы, чтобы избежать повторного назначения. А связывание, которое хранится в узле, тогда используется как "не очень надежное начальное связывание", на случай, если шлюза нет.

Но тогда возникает вопрос - как вновь подключенный шлюз узнает, какое связывание уже используется сейчас? В вариантах (1) и (2) этого вопроса не существует. Возможные решения такие:
- добавить новую широковещательную команду (как расширение списка команд MQTT-SN), по которой узел, в ответ на запрос, где представлен TopicID, публиковал бы полное имя связанного с ним топика
- добавить новую команду в режиме точка-точка (режим HBus), по которой узел выдает свою таблицу связывания; после подключения шлюз просто опрашивает все узлы и вытаскивает из них все что ему требуется, а затем, в случае конфликтов, широковещательными командами REGISTER назначает новые TopicID.

Пожалуй, последний вариант выглядит лучше.

(4) Можно пойти дальше и вообще не назначать TopicID вручную, а изначально задать TopicID=0 для всех топиков. При первом включении каждый модуль при помощи команды REGISTER будет спрашивать: "какой TopicID назначен для вот этого топика (TopicName)?" Если никто не ответил, то модуль сам себе назначает TopicID для данного TopicName. А чтобы разные модули не назначили себе один и тот же TopicID для разных топиков, достаточно генерировать TopicID из собственного ID модуля. Например, берем NodeID, сдвигаем его влево на 5 разрядов и приклеиваем индекс топика. Так каждый модуль сможет без коллизий назначить до 32 TopicID.

Единственно, что NodeID модулям надо ограничить диапазоном 1..0x7FF. Это некритично, все равно столько узлов в одном сегменте разместить не удастся.

А команду REGACK лучше не использовать. Достаточно одной REGISTER, с ней мороки меньше, она контекстно-независимая.
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Ср май 01, 2019 3:17 pm

Выложил ревизию 0.8 и NodeTest rev 1.08, где вышесказанное - п.(4) - реализовано . После подачи питания нода выдерживает паузу 5 сек, а затем в темпе "раз в секунду" запрашивает все неизвестные ей значения TopicId при помощи комады REGISTER. Если никто не отвечает, нода назначает себе TopicId на основе своего NodeID и бродкастит новое значение TopicId комадой REGISTER.

Когда все TopicId определены, нода переходит в нормальный режим работы. Однако примерно раз в полчаса нода снова проверяет свои топики и, если какой-то TopicId не назначен (т.е. равен 0), опять запрашивает в сети его значение, и т.д.

Таким образом, вся рутинная работа по назначению TopicId полностью автоматизирована. Пользователь должен только задать в скетче TopicName текстовой строкой, все остальное будет сделано само. Нода запросит значения TopicID для всех своих топиков. Если топик неизвестен, нода сама назначит уникальное значение TopicID для этого топика и оповестит всех об этом.

Шлюз склеит имя сети "HBus/" с указанным TopicName, в таком виде данные появятся в брокере MQTT и, соответственно, в МД. В обратном направлениии все произойдет так же: шлюз будет подписан на топики "HBus/#", полученные из МД сообщения на эту тему шлюз будет бродкастить в HBus на известные ему TopicId.
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Сб май 11, 2019 5:12 am

Добавил заранее предопределенные топики (pre-defined topics). Поскольку NodeID больше нуля, то TopicId в диапазоне [0x01...0x1F] ни одна нода никогда не назначит. Ввел несколько предопределенных топиков:
- TopicId=0x01, TopicName="time" - текущее время (utc), временная зона, время суток; шлюз будет брать время из NTP сервера и бродкастить несколько раз в день
- TopicId=0x0D, TopicName="debug" - отладочные сообщения
- TopicId=0x0E, TopicName="error" - сообщения об программных ошибках
- TopicId=0x0F, TopicName="fault" - сообщения о неисправности оборудования
Все ноды могут пользоваться предопределенными топиками в любой момент, без процедуры регистрации.

Для обычных топиков шлюз держит в памяти таблицу связи {TopicId, TopicName} размером в 512 элементов, думаю, этого будет достаточно. TopicId хранятся в EEPROM, строки TopicName - в SPIFFS, размер строк не более 128 байт. Русских букв (UTF8), соответственно, не более 64. Ограничение задано HBus, в нем сообщения длиннее 128 байт передавать нельзя.
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Сб май 18, 2019 3:20 pm

WiFi шлюз более-менее заработал. Пока что недостаточно хорошо, чтобы можно было выкладывать. В частности, MQTT-SN сообщение PUBLISH, отловленное в HBus, шлюз преобразует в нормальное MQTT сообщение и отсылает брокеру. Но тут же от брокера получает это сообщение назад, ибо подписан на него, далее шлюз преобразует его в MQTT-SN сообщение и бродкастит в HBus.

Надо добавлять механизм подавления эха. Но для дебага это эхо было очень удобно ;)

Пока же выложил обновленную версию 1.09 NodeTest, в которой текст можно выделить и через Ctrl+C скопировать в клипборд. Думаю, это сильно пригодится для дальнейших объяснений.

Для примера:
Выдаем пользовательскую команду 2, по которой скетч распечатывает список зарегистрированных шлюзом пар TopicId - TopicName

Код: Выделить всё

FF HBus 0A 00 11 00 01 0E 7A 01  {cmd:2}
 - dbg: 1 - time[0D][0A]
 - dbg: 13 - debug[0D][0A]
 - dbg: 14 - error[0D][0A]
 - dbg: 15 - fault[0D][0A]
 - dbg: 32 - hbus/nodes[0D][0A]
 - dbg: 64 - topic0[0D][0A]
 - dbg: 67 - topic1[0D][0A]
Откуда видно, что в списке есть 4 топика "по умолчанию" (1, 13, 14, 15) и 3 обычных топика (32, 64, 67)

Теперь выдаем в сеть HBus MQTT-SN сообщение PUBLISH (код 0x0C), TopicId=67 (0x0043), порядковый номер сообщения 0х0Е7С, источник NodeID=0x0011 (это NodeTest через USB bridge, такой номер я ему назначил)

Код: Выделить всё

FF MQTT 0C 00 11 00 43 0E 7C 01  {val:3} <TopicId=67>
Шлюз ловит это сообщение и находит в списке соответствующую пару

Код: Выделить всё

67 - topic1
Далее он приклеивает к topic1 базовый для всей сети HBus префикс HBus/ и отправляет брокеру сообщение с именем топика HBus/topic1 и содержимым {val:3}

Код: Выделить всё

 - dbg: Published topic=HBus/topic1, content={val:3}[0D][0A]
MQTT брокер ловит это сообщение и рассылает всем зарегистрированным подписчикам. Сам шлюз тоже является подписчиком на все сообщения топика HBus/#. Соответственно, он тоже получает от брокера рассылку:

Код: Выделить всё

 - dbg: Message from MQTT broker, topic=HBus/topic1, content=val:3, converted to HBus message, topic index=34, TopicId=67[0D][0A]
Рассылочное MQTT сообщение преобразовано в HBus MQTT-SN сообщение с TopicId=67 и отправлено в сеть HBus

Код: Выделить всё

FF MQTT 0C 00 01 00 43 0E 7D 01  {val:3} <TopicId=67>
У этого сообщения порядковый номер на единицу больше, 0х0Е7D, исходит оно от узла 0x0001 (это WiFi Gateway), а в остальном оно идентично исходному.
Ответить