Перейти к содержанию
    

подключить MQTT через MbedTLS

Приветствую!

 

Есть плата nucleo-f767zi. Очень хочется сделать из нее удаленный датчик для IoT.

Для начала генерируем проект из Cube для этой железки и включаем LwIP и FreeRTOS.

Встроенный MQTT клиент прекрасно взаимодействет с локальным Mosquito.

 

А теперь еще хочется передать данные по защищенному соединению. В том же Cube

жмакается галочка MbedTLS и... ничего: нагенеренный проект даже не собирается,

инициализация LwIP тоже изчезла из кода.

 

Собственно дальше начинается изучение влияния всех имеющихся дефайнов и зависимостей,

чтоб хоть как-то запуститься. Пока так понимаю, что надо заставить работать функцию

altcp_tls_create_config_client_2wayauth, но что-то дальше все виснет где-то в потрохах либы.

 

Может подскажет кто, как правильно надо перенастроить проект, чтоб секьюрность заработала?

Или может встречалась готовая инструкция?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, сам спросил - сам ответил

Сто кило для стека надо было выдать, и еще 80к на буфера сетевые - и все запустилось из коробки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26.07.2021 в 12:55, grau сказал:

Сто кило для стека надо было выдать, и еще 80к на буфера сетевые

Офигеть! Когда-то, чтобы передать на сервак кучу данных требовался только простой стек и кило 10 ОЗУ на все про все... А в МК-то есть столько оперативы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это новая кубо-реальность. Вангую скоро уже будет требоваться не менее 1 МБ.  :biggrin:

3 часа назад, mantech сказал:

Когда-то, чтобы передать на сервак кучу данных

Пока что ещё не только "когда-то": у меня в текущем проекте мой стек работает на <10кБ ОЗУ для сетевых буферов (одновременно: 2 открытых TCP-сокета + 1 UDP).

И это работает на стеке <900 байт - стек для всех сетевых задач (включая HTTP).

3 часа назад, mantech сказал:

А в МК-то есть столько оперативы?

Раз скомпилилось, значит есть. Только видимо она вся целиком на это дело и ушла. И на прикладные задачи остались крохи.

Так и получается, что для опроса простого удалённого датчика, по нонешним временам, нужен как минимум - конский Cortex-M7 с максимумом ОЗУ.  :dash2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/26/2021 at 5:55 PM, grau said:

Сто кило для стека надо было выдать, и еще 80к на буфера сетевые - и все запустилось из коробки.

По своему опыту скажу, что 100 кБайт хоть и достаточно для работы стека TCP/IP, но всё же лучше позаботиться о развитии на будущее и выделить хотя бы 256, а ещё лучше 1024 кБайт. Тогда можно спокойно и дальше развивать проект, не опасаясь, что в один прекрасный день он откажется работать адекватно. Если столько памяти в МК нет, то рекомендую относительно дешёвые микросхмы SDRAM. Например, одна такая микросхема в 28-ногом корпусе даст Вам сразу 32 МБайт память. Это уже серьёзно для работы. Попробуйте, и останетесь довольны! Если проект для себя, то такие микросхемы можно наковырять из старых модулей памяти для ПК или видеокарт, а уж этого хватает в ремонтных мастерсхик по ПК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, jcxz said:

мой стек работает на <10кБ ОЗУ

Остается добавить TLS и еще раз подсчитать занимаемую память.

 

20 minutes ago, jcxz said:

Вангую скоро уже будет требоваться не менее 1 МБ. 

Так и есть. А кто не использует защищенные соединения, тех вообще в сеть пускать перестанут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, aaarrr сказал:

Остается добавить TLS и еще раз подсчитать занимаемую память.

И что именно в TLS требует 180 кБ?

Причём:

26.07.2021 в 12:55, grau сказал:

80к на буфера сетевые

это видимо буфера под Ethernet-фреймы?

И какое отношение имеет наличие TLS к их объёму? Неужто для TLS реально нужно иметь буфера для 80*1024/1450 = ~56 Ethernet-кадров???  :shok:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jcxz said:

И что именно в TLS требует 180 кБ?

Десятки кБ в любом случае нужны. Достаточно погуглить что-нибудь на тему "mbedTLS memory requirements".

А проблемы embedded писателей стандартов мало волнуют.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, jcxz said:

И что именно в TLS требует 180 кБ?

И какое отношение имеет наличие TLS к их объёму? Неужто для TLS реально нужно иметь буфера для 80*1024/1450 = ~56 Ethernet-кадров???  :shok:

Стек - там просто математика крутится

 

Под сеть - там есть функция, которая говорит сколько было реально использовано

и дефайны, которые предупреждают, что в определенных ситуациях может не хватить

 

а вообще говоря, сам конечно подивился таким запросам - ведь это простейший случай,

с самоподписанным сертификатом и два байта переслать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, aaarrr сказал:

Остается добавить TLS

Нескромный вопрос, зачем везде пихать его? Вы постоянно при опросе датчиков или подобного передаете секретную информацию, паспортные или банковские данные, пароли пин коды и пр??

14 часов назад, aaarrr сказал:

А кто не использует защищенные соединения, тех вообще в сеть пускать перестанут.

С какого перепугу-то вдруг? Не будут пускать на всякие AWS-ы? Да и хрен с ними, те, кто в теме уже давно поняли, что нужны свои серваки для стабильной работы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, aaarrr сказал:

Десятки кБ в любом случае нужны. Достаточно погуглить что-нибудь на тему "mbedTLS memory requirements".

Ок, как утверждается здесь: https://tls.mbed.org/discussions/crypto-and-ssl/memory-consumption-32-kb-memory-buffer

нужно 32кБ. Ещё куда ни шло. Но всё-таки это не 180кБ. А как бы в ~5 раз меньше. Разница есть и существенная, не находите?

Но так и не ответили на вопрос: "Зачем нужно ~56 сетевых буферов"??? Для какой такой надобности?

Я понимаю когда нужно передавать через TCP-сокет кадры прикладного протокола на большой скорости (без ожидания ACK-ов). Тогда да - нужно хранить длинную историю. Но в задаче ТС-а большая скорость совсем не требуется.

Или если имеем сервер со множеством параллельных активных соединений. Чего вроде тоже как у ТС-а не наблюдается.

 

Или "буфера сетевые" используются функциями TLS (шифрование? подпись? ...), а не только TCP/ETHERNET-стеком?

 

18 минут назад, grau сказал:

Стек - там просто математика крутится

Для "просто математики" 100кБ - как то жирновато. Слишком. Подозреваю, что стек у вас используется в качестве памяти для функций шифрования. Но тоже имхо - как-то слишком жирно.

Вы лучше объясните - зачем:

26.07.2021 в 12:55, grau сказал:

80к на буфера сетевые

И что такое "буфера сетевые"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, jcxz сказал:

Я понимаю когда нужно передавать через TCP-сокет кадры прикладного протокола на большой скорости (без ожидания ACK-ов). Тогда да - нужно хранить длинную историю.

Да даже и так, ну 4 или 8 кадров, на прием и столько же на передачу, хотя прием-то тут зачем такой большой, раз задача передавать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, mantech сказал:

Да даже и так, ну 4 или 8 кадров, на прием и столько же на передачу, хотя прием-то тут зачем такой большой, раз задача передавать...

Если предположить, что у ТС-а через TCP-сокет идёт поток данных со скоростью 1МБ/с и возможны задержки ACK-ов до <0.05c (без торможения потока), то на передачу нужно помнить = 1000000*.05 = 50кБ (в памяти TCP-сокета).

А желательно и несколько больше (на случай редких ретрансмиссий).

Но у ТС-а не 1МБ/с в реальном времени.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, mantech said:

Нескромный вопрос, зачем везде пихать его? Вы постоянно при опросе датчиков или подобного передаете секретную информацию, паспортные или банковские данные, пароли пин коды и пр??

Так становится принято в индустрии, что ж поделать? Вопрос к законодателям мод.

 

1 hour ago, mantech said:

С какого перепугу-то вдруг? Не будут пускать на всякие AWS-ы? Да и хрен с ними, те, кто в теме уже давно поняли, что нужны свои серваки для стабильной работы...

В браузер пускать перестанут, https only. "Свои серваки" никто не ограничит до тех пор, пока на них не передается чувствительная информация (показания приборов учета, например).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jcxz said:

И что такое "буфера сетевые"?

MEM_SIZE

увеличивал, пока не перестали сообщения об ошибках аллокации сыпаться

 

MEM HEAP
    avail: 80000
    used: 66676
    max: 76128
    err: 0

так понимаю, что куча общая, а дальше из нее все откушивают

 

2 hours ago, mantech said:

Да даже и так, ну 4 или 8 кадров, на прием и столько же на передачу, хотя прием-то тут зачем такой большой, раз задача передавать...

потому что получил в лог

altcp_tls: TCP_WND is smaller than the RX decryption buffer, connection RX might stall!

 

и оно в само деле подвисало, пока размеры всех массивов и число буферов не поднял.

В конкретных значениях пока не уверен - просто увеличивал всех сразу по два раза, пока не запустилось

Изменено пользователем grau

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...