Как я сенсорную сеть изобретал ч.2
Продолжаю тему с исследованием сенсорных сетей. Как я рассказал в прошлой части, я реализовал драйвер меш-сети, который прошел успешное тестирование в среде эмулятора и был назван идиоматичным условиям его применения названием Burelom. Теперь настало время для его тестирования на реальном железе. Для этого мне потребовалось, собственно, само железо и какой-то сетевой слой, который бы не утопил меня сходу в особенностях его реализации.
Железо
Итак, железо — ESP32C6. В представлении не нуждается, платформа хорошо известна любому инженеру. Почему С6, а, скажем, не S3? В дальнейшем я хочу реализовать для Bulerom полноценный TDMA MAC, а значит, мне для этого потребуется физический драйвер радиоканала. В инфраструктуре ESP32 такой драйвер имеется — IEEE 802.15.4. Именно на этой истории основан почти весь современный стек ZigBee и Thread. И именно его я хочу использовать для того, чтобы заставить Bulerom работать там, где не будут работать другие сети. Возможно, я ошибаюсь, тогда мне придется копнуть еще глубже, но уже в сторону NRF, которые дают доступ еще ниже, на уровне регистрового управления трансивером. И ESP32C6 как раз поддерживает IEEE 802.15.4, в отличие от других моделей серии.
Сетевой слой
В качестве тестового сетевого слоя я взял ESP-NOW, он идеально ложится на текущую задачу. Если кратко, у Wi-Fi есть так называемые Control Frames (CF) — фреймы, предназначенные для рассылки по сети служебной информации. Для получения такого пакета не нужно устанавливать соединение MAC-уровня. Т. е. если для того, чтобы отправить данные по Wi-Fi, вам нужно сначала произвести сканирование, потом инициировать соединение, и только после этого вы сможете выполнять обмен данными, то для CF это не требуется. У него есть расширение — Vendor Specific Action. В котором, собственно, и реализуется вся логика ESP-NOW. Плюс ко всему этому, CF могут быть еще не только unicast, но и broadcast. Что это значит для моей задачи: у меня есть драйвер сети, который позволяет отправить unicast произвольному узлу в зоне радиовидимости или broadcast всем узлам вокруг. При этом вся логика MAC-уровня полностью инкапсулирована в Wi-Fi слое. Идеальное решение для задачи тестирования L3 Burelom.
Ну и очевидно, что если отходить от темы статьи, ESP-NOW — это очень хороший способ быстро и надежно связать несколько устройств по воздуху. При этом ESP-NOW разделяет канал с Wi-Fi (по сути, это просто Wi-Fi с плагином). Т. е. он никак не мешает работе модуля с основным драйвером Wi-Fi, можно подключить устройство, например, к роутеру и использовать его как шлюз в интернет, параллельно принимая данные по ESP-NOW. Условие только одно — чтобы было разделение частотных каналов.
В общем, этими средствами можно очень быстро развернуть работающую IoT-сеть. Но это не наши методы. Поэтому роль ему отводится только в качестве псевдо-MAC.
Псевдо-MAC и адаптация к ESP32
Драйвер L3 Burelom, как я уже писал в первой статье, спроектирован так, что он ничего не знает о физике устройства и сети, на которой он выполняется. Для этой абстракции он предлагает набор трейтов, которые реализуют контракт между драйвером и железом:
Cipher: функции аппаратного шифрования
Mac: программно зависимые функции L2 уровня
Rand: аппаратно специфичный истончик энтропии
Собственно, в целевом решении под имплементацией Mac подразумевается именно реализация L2 уровня сети. Т. е. в случае ранее упомянутого IEEE 802.15.4 это будет полноценный TDMA драйвер, задача которого будет забирать данные из L3, планировать их в расписание, собирать входящие фреймы и передавать их на уровень L3. ESP-NOW — это уже реализованный вендорский L2, поэтому моя задача тут сводится к тому, чтобы просто сделать адаптер между Burelom и драйвером ESP-NOW. Поэтому он называется у меня Псевдо-MAC, потому что по сути ничего сам на L2 не делает.
За деталями реализации вы можете сходить ко мне в репозиторий. В принципе ничего сложного для понимания там нет.
Тестовый стенд и методика
Тестирование сети проводилось (должно было проводиться) в трех режимах:
1-Hop. Прямая связь между двумя устройствами. Тут всё просто: A отправил пинг на устройство в радиовидимости (B), получил ответ. Доказывает то, что сеть работает на уровне линка.
2-Hop Routing. Это проверка AODV-маршрутизации. Задача тут усложняется, сети нужно найти маршрут до узла от узла А до узла С, при том, что они находятся вне прямой радиовидимости. Для этого по сети должен пройти Routing Request и простроить маршрут на промежуточном узле B. Доказывает, что сеть умеет выполнять динамическую маршрутизацию.
Multihop. Узел A отправляет пакет на узел C. Сеть должна простроить маршрут через два промежуточных узла B, С. Каждый узел сети виден только соседнему узлу. Доказывает, что сеть может транслировать данные в режиме mesh.
Результаты тестирования
Тестировал я всё это дело в три этапа. Первым этапом было создание звезды, чтобы было понимание, что у узлов 2-4 имеется линк к 1. Этот этап был пройден без осложнений.
Далее я попробовал построить мультихоп дома, поскольку живу в современной многоэтажке, имеются стены толщиной 70 см. Получилось собрать некоторое подобие меша, используя изгибы стен. На этом этапе устранил несколько ошибок. Вообще вот сколько себе говорю, никогда не вызывай unwrap() в Rust, даже если кажется, что ничего не может случиться, оно случится!
Ну и завершающим этапом тестирования должно было стать тестирование схем 2 и 3 на естественном рельефе, для этого я отправился в парк около дома. Но там я столкнулся с очень значительными сложностями. Сложности свелись к тому, что ко мне подошли два охранника парка и попросили объяснить, что я делаю. После попыток такового объяснения мне сообщили, что ничего не поняли и с их точки зрения я выгляжу крайне подозрительно. А учитывая известную всем ситуацию, может быть, я тут занимаюсь диверсионной деятельностью или делаю что-то, связанное с дронами. И что, вероятно, им из соображений бдительности стоит вызывать Росгвардию. На все попытки объяснить им, что диверсионность моих железок не большая, чем у домашнего Wi-Fi роутера, они не реагировали. Поэтому мне пришлось срочно ретироваться. Хорошо хоть хоть их «бдительность» осталась только на словах, а то, возможно, я бы это сейчас не писал, а рассказывал архитектуру ESP32 какому-нибудь дознавателю.
Но за то время, что успел там пробыть, было получено вот это:
11.379 [INFO ] Send ping Ping to 4
11.380 [INFO ] <1> Initialized route request dest=4
11.385 [INFO ] <1> Received transit preq packet from=1, packet dropped due seen
11.398 [INFO ] <1> Created route target=4, gateway=2, hops=3
11.398 [INFO ] <1> Received target prep packet from=4
11.399 [INFO ] <1> Route request completed dest=4 gw=2
11.399 [INFO ] <1> Send dataghram dest=4 gw=2 data=50696E6731
Hops=3, route request прошел два промежуточных узла вперед и назад, собственно, это чего я и хотел увидеть. Качество PCB антенн ESP32, конечно, никакое, при этом оно разнится от модуля к модулю. Потому что в схеме линией узел 4 периодически получал hello-пакеты от 2. Т. е. 2 видел 3 и 4, а 4 видел только 3. Это приводит к ошибкам маршрутизации. Потому что прорвавшийся пакет от 4 к 2 создает новый более короткий маршрут, узел 2 начинает считать, что 4 на расстоянии одного хопа, а это более приоритетный роут. А затем линк пропадает, и маршрут оказывается в подвешенном состоянии до его обнуления по бездействию. Надо бы придумать какой-то защитный механизм от залетных hello-пакетов.
В общем, Burelom работает на железе. Конечно, использование ESP-NOW на PCB-антеннах — чушь полная. Но это сильно упрощает тестирование, буду работать дальше в сторону расширения возможностей сети.
P. S.
Инцидент с «бдительными» гражданами требует очень серьезного осмысления, потому что как будто бы имеется совершенно реальный шанс привлечь к себе внимание соответствующих спецслужб. Возможно, стоит обратиться к этим самым спецслужбам за разъяснением, как добросовестному инженеру не загреметь в диверсанты, проводя практику в собственном дворе.















