- PVSM.RU - https://www.pvsm.ru -
Raspberry Pi снискали огромную популярность по всему миру. Однако многие из любителей-разработчиков сталкиваются с проблемой доступа к устройству из интернета. Как правило приходится необходимо колдовать с DDNS или докупать статический IP адрес. Оба варианта предполагают настройка роутера, что не для всех и не всегда доступно. Кроме того – откртытие прямого доступа к устройству из интрента несет в себе определнные риски безопасности.
Крайне распространенным способом решения этой проблемы является использование промежуточного сервера, через который сервер и клиент подключаются друг к другую.
Схема крайне широко используется в различных пакетах удаленного доступа: VNCViewer, AmmyyAdmin и т.д.
Вариант 1-DDNS
Вариант 2 – статический IP адрес
Вариант 3 – использование промежуточного сервера
Эту схему подключения можно реализовать через протокол MQTT over Websockets, но мне было инетесно реализовать что-то значительно более простое, JSON-ориентированое, расширяемое, без ограничений протокола на размер сообщения и с более очевидной моделью безопасности.
Выбор протокола был очевиден. WebSocket уже давно поддерживается браузерами и большинством платформ и языков программирования.
Модель шины данных тривиальна:
WebSocket cервер поддерживает неограниченное количество каналов. Каждый канал может быть как открытым, так и защищенным паролем. Канал существует только пока у нему подключен хотя-бы один клиент. Никакие жанные на сервере не принципиально не хранятся. Пароль задается первым клиентом подключившемся к каналу. Клиенты без пароля/с неправильным паролем в канал допущены не будут.
Канал является контейнером для сообщений. Сообщения бывают трех типов: адресные сообщения (команды), которые предназначены для одного или нескольких получателей, ответные сообщения и широковещательные сообщения которые будут получены всеми клиентами подключенными к каналу.
Такая схема позволяет относительно безопасно использовать общие хабы для многих потребителей т.к. нет никакой необходимости в настройках, генерации пользователей на сервере (как в MQTT), генерации ключей доступа и пр.
Сообщения нигде не сохраняются, не логируются и передаются по защищенному протоколу wss.
Сообщения – это типизированные JSON объекты. Бинарная информация передается как Base64 encoded string.
Код проекта доступен на GitHub [1], а действующий хаб вы можете найти здесь [2].
Проект состоит из WebSocket сервера на .net, web-приложения-клиента, которая подключается к серверу и python приложения для raspberry pi.
Веб-приложение — далеко не единственно возможный способ взаимодействия с websocket-сервером. Например, можно легко написать облачный клиент, который будет «слушать» события веб камеры и сохранять картинки в какое-нибудь облачное хранилище.
Архитектура позволяет подключать неограниченное число raspberry pi и клиентов на один канал.
Например если вы захотите построить некую систему безопасности/управления климатом/умным домом – вы можете все raspberry «посадить» на один канал и отправлять команды сразу всем или нектором инстансам.
Широковещательные события «broadcast» получат все участники сети.
To be continued…
Автор: Игорь Канель
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/314135
Ссылки в тексте:
[1] GitHub: https://github.com/ikanel/PiHub
[2] здесь: https://pihubdemo.azurewebsites.net/
[3] Источник: https://habr.com/ru/post/447496/?utm_source=habrahabr&utm_medium=rss&utm_campaign=447496
Нажмите здесь для печати.