- PVSM.RU - https://www.pvsm.ru -

STM32 + PPP + GSM + LwIp + TLS 1.2

STM32 + PPP + GSM + LwIp + TLS 1.2 - 1

Недавно пришлось снова поднять PPP на STM32
Первая часть [1]
Задача усложнилась обязательным требованием, использовать TLS 1.2 и отправлять данные по MQTT

Напомню, что MQTT и TLS находятся выше TCP (гуглим osi) [2]

Беглый поиск выдал скудную таблицу результатов
Amazon FreeRTOS [3]
очень похожая реализация от ST [4]

В первом варианте оказалось около 10-ти различных архитектурных платформ
Как часто бывает, чип уже был выбрал и запаян на плату (STM32F429)
Ближайшим его родственником в списке оказался L475, под stm32l475_discovery соответственно
На этом отличая не закончились, в discovery используется WI-FI ISM43362-M3G-L44, он добавил сложности в понимании работы

Несколько дней тупления в монитор)
Практически ни одной строчки кода)
Когда проект был портирован, TCP работал не так, как ожидалось
Я видел получение ip из hostname, установление соединения, несколько ack и разрыв со стороны сервера

STM32 + PPP + GSM + LwIp + TLS 1.2 - 2

Простой замены API от WI-FI на реализацию сокетов lwIp оказалось не достаточно
Очевидно MbedTls не работал

STM32 + PPP + GSM + LwIp + TLS 1.2 - 3

В какой-то момент я запутался и решил посмотреть на второй вариант [4]
Это идея оказалась более удачной

Отправной точкой был выбран B-L475E-IOT01
И тут дело пошло!
Код оказался намного понятнее
Проект логически разделен на две части:
— уровень контроллера (wifi, HAL, gpio и пр.)
— AWS (Projects/Common/AWS)

Убрал все лишнее
Добавил свою часть от GSM и PPP
Завел сессию PPP Читать readme в git самого lwip, там все довольно разжевано [5]
В последней версии lwIP (2.1.2) заметны улучшения в части PPP

Вся суть сводится к созданию pcb, заданию аутентификации и вызову нечто похожего:
ppp = pppos_create(&ppp_netif, output_cb, status_cb, ctx_cb_callback);

В калбеке ctx_cb_callback следует получать последний статус PPP, чтобы знать когда соединение установлено и можно включать верхний уровень, или когда произошел разрыв

Далее включил вывод логов mbedTls и получилось примерно так:

STM32 + PPP + GSM + LwIp + TLS 1.2 - 4

Это конечно уже интереснее, но цикл бесконечно зависал на хэндшейках
Некоторое гугление привело к совету обновить версию mbedTls на самую последнюю

После этого получил, что хотел:

STM32 + PPP + GSM + LwIp + TLS 1.2 - 5

И конечно, меня очень обрадовали пришедшие данные в админке aws:

STM32 + PPP + GSM + LwIp + TLS 1.2 - 6

Итог
TLS 1.2 на микроконтроллере это реально!
STM32 + PPP + GSM + LwIp + TLS 1.2 - 7

Полезно использовать свежие версии библиотек
Никогда не сдавайтесь, ищите другие направления если зашли в тупик)

Автор: Владимир

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/322398

Ссылки в тексте:

[1] Первая часть: https://habr.com/ru/post/332742/

[2] гуглим osi): https://micrium.com/wp-content/uploads/2014/03/OSI-Seven-Layer-Model.png

[3] Amazon FreeRTOS: https://github.com/aws/amazon-freertos

[4] очень похожая реализация от ST: https://www.st.com/en/embedded-software/x-cube-aws.html

[5] Читать readme в git самого lwip, там все довольно разжевано: https://github.com/yarrick/lwip/blob/master/doc/ppp.txt

[6] Источник: https://habr.com/ru/post/458192/?utm_source=habrahabr&utm_medium=rss&utm_campaign=458192