0
<< предыдущая заметка 
22 декабря 2025
Немножко про работу и бассейны

Здесь будет скучное для программистов. Но у меня тут много классных программистов, может, кому будет интересно.

Итак. Хоть у меня сейчас фактически нет работы и финансовая жопа, но тем не менее, есть по крайней мере один интересный проект для друзей-химиков из Испании, над которым с удовольствием работаю. О самом проекте я как-нибудь потом расскажу вам подробнее: это автоматизированная система подготовки воды для частных бассейнов, электроника которой и датчики позволяют поддерживать оптимальные и своевременные режимы очистки с использованием минимума химикатов из нетоксичных. Соответственно, проекту нужна электроника, и до меня их моделька была на моей любимой ESP. Понятно, что бассейны разбросаны по глобусу хрен знает, где. Нужна хорошая связь с ними и управление в реальном времени, особенно на первых порах, пока отлаживается технология и нужно много наблюдать, делать эксперименты, включать разные агрегаты и снова смотреть данные. Это нужно и авторам проекта, и самим владельцам, и вообще. Короче, нужна какая-то надежная, быстрая и мгновенно реагирующая система связи с устройствами.

Во фреймворке ESP, который я пилю уже десять лет, у меня и раньше чипы были доступны извне. Ну, как доступны... каждые 15 секунд они пингали сервер-матку и могли выполнять какие-то присланные в ответ команды и возвращать какие-то данные. Но, скажем, смотреть графики датчиков в реальном времени было нельзя — только находясь рядом с чипом и открыв его веб-страницу. Почему-то тот факт, что у ESP есть возможность изображать крошечный вебсервер и показывать у себя внутри какие-то куцые странички — это завораживало и казалось важным. А проблему надежной удаленной связи я когда-то собирался решать при помощи UDP-пакетов и даже писал какие-то бэкенды, но слава богу, что не погрузился в эту бесовщину низкого уровня.

Поскольку моя прошлая работа в huly.io была связана с вебсокет-серверами на Rust, а позапрошлая в Алзимологисте — с криптографией 25519... я решил сделать уже всё по-взрослому. Для начала вообще пересмотреть концепцию фреймфорка ESP. На хера там внутренний вебсервер? Чтобы что? Пароль от вайвай однажды вбить, запуская первый раз? Веб нужен там, где принято смотреть веб — в интернете. А данные от ESP пусть бегают по вебсокетам. На первых порах я не стал выключать в прошивке вебсервер совсем, оставил про запас, но сама его концепция, считаю, себя изжила.

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

Фреймворк CFAQ

Я принялся за дело и доработал свой фреймфорк CFAQ для ESP32 (с ESP8266 он тоже должен продолжать работать, но не тестировал пока). Первое, что оказалось: в ESP32 очень и очень плохо с вебсокетами. Либо какие-то совсем громоздкие библиотеки, либо не работают. Более того: судя по всему, на ESP32 вообще нет годного вебсокет-клиента, который способен бегать по wss на сервера за CloudFlare — там какие-то нововведения протоколов, которые сбивают с толку старые библиотеки ESP. Поэтому вебсокет-клиент пришлось писать заново почти с нуля на основе простенькой Socketyee. С wss возиться вообще не стал, решив, что на ESP вся эта беготня с сертификатами «всегда боль», как выражается наш ЧатГПТ. Вместо этого я беру обычный нешифрованный канал ws — прослушивайте. Зато сам трафик шифрую и подписываю современной криптографией 25519 на эллиптических кривых, которая, мягко скажем, посильнее всех этих протоколов https/wss. Результат вышел чудесный — теперь чипы постоянно в сети, и в любой момент авторизованный хозяин с центрального сервера может зайти и выполнить любые действия. В том числе — накидать скрипт прямо на чипе, какие датчики опрашивать, и рисовать любые графики онлайн. Забавная задница приключилась, когда у меня кончилась память: скетч стал занимать 99.6% и не запускаться. Допрограммировался, называется. И понятно, почему такое: всего 4Мб памяти, а я еще хочу обновление прошивки OTA и внутреннюю флешку, да еще натащил во фреймворк вообще всё, что было можно (там же у меня текстовый язык команд, он должен уметь всё), да еще для электроники бассейна подцепил мощный дисплей с развесистой графической библиотекой. Проблему решил временно, откатив саму систему esp32 на чуть более раннюю версию, она не такая громоздкая. Но конечно надо прекратить покупать ESP32 c 4Мб, а брать 8 или 16.

Язык: C++
GitHub: https://github.com/lleokaganov/cfaq

Центральный сервер

Соответственно системе нужен центральный сервер. В нем нужны минимальные протоколы, прием телеметрии от устройств в базу данных, API, разделение доступов и какая-то авторизация по емайлу. Пришлось наконец освоить сервис отправки емайла через smtp2go, а то некоторые криптодрузья мне говорили, будто нет способа отсылать письма от имени своего сайта — мол, либо платить миллион денег Гуглю и богомерзкому Яндексу, либо стыд и грех со сраной поделкой ProtonMail. А оказалось, какой-нибудь smtp2go решает проблему быстро и бесплатно, рекомендую. Сам ws-протокол для данных придумывался довольно мучительно, хотя в итоге оказался прост: ws ходит бинарными посылками, где первые 4 байта — номер адресата, а дальше — шифрованный и подписанный payload. Получая такую посылку (если она не для номера 0 — сервер), сервер тупо пересылает ее адресату, подменяя первые 4 байта номером отправителя. А дальше пусть разбираются получатели, все равно у сервера нету их приватных ключей и заглянуть внутрь трафика он не может. В итоге получилась система, через которую могут обмениваться шифрованным трафиком любые пользователи за двумя NAT — люди, устройства, роботы. Ну и к этому пришлось накидать по-быстрому какое-то подобие фреймфорка, без особого дизайна.

Язык: Rust (ну JS для фреймфорка)
GitHub: https://github.com/lleokaganov/aguardia_server

Криптобиблиотеки

Поскольку самая капризная у нас ESP, долбить крипточасть начал на ней — использовал криптобиблиотеку monocypher. Ок. На сервере после небольших танцев с бубнами поднялась совместимая библиотека Dalek. А вот с фронтендом что-то сразу не вышло. В принципе в своих былых проектах я использовал noble типа как на демке. Но это уже отдельная какая-то вещь в себе и показалась не слишком совместимой с нынешними задачами, поэтому чтобы не париться, я собрал тот же Dalek в виде WASM для браузера. Получилось компактно, удобно, а главное — полностью совместимо с сервером и ESP.

Язык: Rust — WASM
GitHub: https://github.com/lleokaganov/wasm-25519

Мост wsuart

Ну и поигравшись вдоволь с получившейся системой, я задумался: как ее еще можно применить? И последние пару дней занялся побочной демкой — сделал утилитку, которая через вебсокеты и два NAT пробрасывает порт одной машины на другую. Запущенный клиент берет скажем /dev/ttyUSB0, а такой же софт на другой машине, запущенный в режиме slave, создает какой-нибудь /dev/pts/3, который можно точно так же читать-писать. Ну или можно с веб-страницы сервера к своему устройству подключиться и там читать-писать консоль. Вообще мне консоль сама по себе была не нужна. Я планировал из чистого интереса делать всякие звуковые webrtc-девайсики на микролинкусах (например, дистанционно звонить по симкарте), но им-то нужен какой-то канал сигналинга для установки соединения, а чего его искать, если у меня уже всё написано? Так что для начала появилась вот эта утилитка для проброса портов. Ну а в будущем я еще конечно на той же системе шифрованный мессенжер сделаю наподобии того, что делал на позапрошлой работе на DOT-блокчейне, который мессенджеру на фиг не нужен.

Язык: Rust
GitHub: https://github.com/lleokaganov/wsuart

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

<< предыдущая заметка  
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок

Комментарии к этой заметке скрываются - они будут видны только вам и мне.

Оставить комментарий