Недавно пришлось снова поднять PPP на STM32.

Первая часть.

Задача усложнилась обязательным требованием, использовать TLS 1.2 и отправлять данные по MQTT.

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

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

В первом варианте оказалось около 10-ти различных архитектурных платформ. Как часто бывает, чип уже был выбран и запаян на плату (STM32F429).

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

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



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



В какой-то момент я запутался и решил посмотреть на второй вариант.

Это идея оказалась более удачной.

Отправной точкой был выбран B-L475E-IOT01.

И тут дело пошло!

Код оказался намного понятнее.

Проект логически разделен на две части:

  • уровень контроллера (wifi, HAL, gpio и пр.)
  • AWS (Projects/Common/AWS)

Убрал все лишнее.

Добавил свою часть от GSM и PPP.

Завел сессию PPP Читать readme в git самого lwip, там все довольно разжевано.

В последней версии lwIP (2.1.2) заметны улучшения в части PPP.

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

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

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



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

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



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



Итог

TLS 1.2 на микроконтроллере это реально!



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

Комментарии (6)


  1. olartamonov
    30.06.2019 11:01
    +4

    Полное содержание статьи:

    1. Если один пример кода не работает, попробуйте другой
    2. Иногда помогает обновить библиотеки
    3. Полезно также прочитать документацию

    С уважением, Капитан Очевидность.


  1. ittakir
    30.06.2019 11:22

    Многовато флеша съело. Не пробовали настраивать доступные алгоритмы шифрования, повыкидывать все, чтобы меньше прошивка была?


    1. olartamonov
      30.06.2019 14:14

      Так это флэш, который съело неизвестно что. Может, там у автора в прошивке через строчку printf с «Войной и миром» и без --specs=nano.specs.


      1. ittakir
        30.06.2019 15:38

        Просто меня очень волнует вопрос, можно ли сделать TLS/SSL + PPP на BluePill (STM32F103C8T6)?


        1. olartamonov
          30.06.2019 15:46

          В принципе скорее да, но придётся сплясать шаманский танец вокруг MbedTLS — причём не только с флэшем, сколько с ОЗУ (более того, C8T6 можно поменять на CBT6 со 128 КБ флэша, а вот с 20 КБ ОЗУ, если вам надо сохранить данную конкретную плату с её LFQP-48 под проц, вы ничего не сделаете).

          tls.mbed.org/discussions/generic/tiny-ssl-library-reduce-footprint-of-mbedtls-to-10kb-ram


      1. Khomin Автор
        30.06.2019 15:51

        так и есть
        полная отладочная информация и дополнительные задачи