Мікроконтролеру з модулем Wi-Fi UART не потрібно реалізовувати VPN, щоб дістатися до сервісу за ним. Модуль уже виконує стек TCP/IP і надає сокети через послідовний порт, а шлюз у тій самій локальній мережі може провести цей трафік через тунель. Схема працює лише тоді, коли ви можете по черзі відповісти на чотири питання, тому ставтеся до неї як до контрольного списку: адреса, сокет, маршрут, межа. Зупиніться на перших воротах, які не проходять, бо наступні не можуть це компенсувати.

Дайте кожному рівню одне завдання

Канал UART переносить AT-команди й корисне навантаження між мікроконтролером і модулем. Модуль приєднується до мережі Wi-Fi і володіє IP-з'єднанням, включно зі своєю адресою джерела. Шлюз володіє тунелем, обліковими даними й політикою пересилання. Саме розділення цих завдань робить схему придатною для налагодження на кожному етапі.

Розділення змінює і те, як ви пишете політику шлюзу. Правило джерела має називати адресу модуля в локальній мережі, а не вигадану адресу мікроконтролера за послідовним каналом. Мікроконтролер у цій схемі не має власної ідентичності IP, а спроба вдати, що вона є, породжує правило, яке ніколи не збігається.

Дайте модулю стабільну адресу будь-яким механізмом резервування, який підтримує мережа, або помістіть пристрої в окремий сегмент і дозвольте шлюзу зіставляти за інтерфейсом. Адреса з пулу, яка змінюється після перезавантаження, рано чи пізно зламає політику, що була правильною, коли ви її писали.

Чи може шлюз назвати адресу модуля?

Перш ніж відкриється будь-який сокет, переконайтеся, що модуль під'єднаний, має адресу і що шлюз бачить його на очікуваному інтерфейсі. Це ворота, які найчастіше відмовляють мовчки, бо модуль охоче повідомить про спробу з'єднання, яка так і не покинула локальну мережу.

AT+CWMODE=1
AT+CWJAP="lab-wifi","passphrase"
AT+CIPSTA?
AT+CIPMUX=0

Режим одного з'єднання зберігає послідовність команд простою, і це правильний початковий пункт для одного датчика, що розмовляє з одним сервісом. Режим кількох з'єднань змінює синтаксис кожної наступної команди, тому визначте, у якому ви режимі, перш ніж копіювати приклад з іншої версії прошивки.

Відкрийте сокет з модуля

Коли адресу й режим визначено, модуль може відкрити TCP-з'єднання з приватним сервісом. Адреса нижче — приклад із документаційного діапазону; підставте свою і збережіть ту саму форму.

AT+CIPSTART="TCP","10.90.0.20",9000
AT+CIPSEND=18
{"t":21.4,"rh":48}

Ця AT-команда відкриває звичайний TCP-сокет, а сокет не є тунелем: ніщо в ньому не створює VPN і ніщо не шифрує корисне навантаження. Режим TLS у прошивці — окрема функція зі своєю командою і своєю роботою з сертифікатами, і довільний модуль UART може не підтримувати жодної з них. Звіртеся з довідником AT-команд TCP/IP для своєї прошивки, а не припускайте, що наведений синтаксис до неї застосовний.

Довжина корисного навантаження в AT+CIPSEND має відповідати тому, що ви справді надсилаєте, інакше модуль чекатиме байти, які ніколи не прийдуть, і з'єднання виглядатиме завислим. Ця помилка схожа на мережеву проблему і майже завжди є помилкою на одиницю в довжині.

Спрямуйте з'єднання через шлюз

Шлюзу потрібен маршрут до приватного призначення, дозвіл пересилати з мережі пристроїв у тунель і зворотний шлях, що доходить до модуля. Якщо віддалена сторона не маршрутизує назад у підмережу пристроїв, схемі потрібне навмисне правило трансляції, і це правило змінює ідентичність джерела, яку бачить сервіс.

ip route get 10.90.0.20
sudo tcpdump -ni wg0 'host 10.90.0.20 and port 9000'
sudo conntrack -L | grep 9000

Спершу стежте за зворотним шляхом. Пересланий пакет, який доходить до сервісу і ніколи не повертається, дає тайм-аут на модулі без будь-якої помилки на шлюзі, і люди годинами дивляться на канал Wi-Fi. Запис у conntrack каже, чи бачив шлюз відповідь узагалі.

Вирішіть, де тунель справді закінчується

Тунель починається на шлюзі. Він не шифрує канал UART і не робить сегмент локальної мережі між модулем і шлюзом частиною тунелю. Усе, що потребує захисту на цьому сегменті, потребує власного механізму, а звичайний TCP у цьому прикладі — не TLS.

Вирішіть і те, що стається, коли тунель падає. Якщо доставка має йти лише через VPN, політика пересилання не повинна дозволяти те саме призначення альтернативним шляхом, бо резервний маршрут тихо скасовує вимогу. Обмежте поведінку під час перепідключення, щоб від'єднаний модуль не затопив послідовний канал або віддалений сервіс повторними спробами.

Запишіть чотири відповіді разом: адресу модуля, ціль сокета, маршрут шлюзу і місце, де починається шифрування. Наступній людині, яка налагоджуватиме цей пристрій, знадобляться всі чотири, і жодну з них не можна вивести лише з прошивки.

Схожі статті