Перевод Arduino на websocket

Почему websocket?

Все же при использовании централизованного сервера где-нибудь снаружи добраться до ардуинок не просто. Но при наличии интернета ардуинки легко коннектятся к внешнему серверу.

ECC architecture

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

К тому же такая периодичность запросов нагружает сервер.

Websocket позволяет избавиться от этих проблем. А именно:

  1. Запрос общей информации при коннекте. То есть относительно сложные запросы можно вынести на коннект.
  2. Двухсторонняя отправка сообщений по необходимости. Если не нужно отправлять данные – просто не отправляй их.
  3. Практически нет задержки. Хотя на практике столкнулся с задержками до 10 секнд при поднятом коннекте. Скорее всего мой касяк или проблемы с сервером, разбираюсь.
  4. Инициация коннекта ардуинкой. Серверу ничего не нужно знать про ноды. Кому нужно – сам подключится. Пока не подключился – сервер даже не вспомнит о существовании ардуинки.

Websocket-сервер

Реализация вебсокет-сервера на tornado для websocket взята отсюда.

Коннекты от ардуинки и от вебинтерфейса центра управления разделены на 2 класса. Работают они похоже, но центр управления общается при помощи JSON, а ардуинки используют форматированную строку.

При поступлении запроса от ардуинки происходит асинхронный запрос внутреннего API на изменения. По результатам ответа через redis всем, кто подписан на ноду рассылается сообщение на синхронизацию. Главное, что никто никого не ждет и продолжает заниматься своим делом. В качестве разделения подписок выбрал именно ноды, так как они являются физически удобными точками взаимодействия.

Websocket-клиент

За основу взял модуль Arduino-Websocket.
Скетч в примерах содержит ошибку. В одном из файлов модуля тоже есть ошибка.

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

Подробный пример подключения Arduino к ECC через websocket описан в статье arduino websocket и ecc.

Работает на удивление стабильно. вот уже больше недели собирается информация с кучи датчиков и управляются лампы, в том числе с датчика движения.