Введение
В эпоху IoT встраиваемые системы всё чаще требуют сетевого взаимодействия. Для этого необходимо реализовать стеки протоколов — иерархические наборы сетевых стандартов, обеспечивающих:
- передачу данных между устройствами;
- адресацию и маршрутизацию;
- контроль ошибок и повторную отправку;
- безопасность (шифрование, аутентификацию).
В статье разберём:
- архитектуру стеков TCP/IP и Bluetooth;
- ограничения встраиваемых платформ;
- подходы к реализации (от «с нуля» до готовых библиотек);
- оптимизацию для МК;
- примеры интеграции.
1. Архитектура сетевых стеков
1.1. Модель OSI vs TCP/IP
OSI (7 уровней):
- Физический (PHY) — сигналы, кабели, радио.
- Канальный (L2) — MAC, кадры, CRC.
- Сетевой (L3) — IP, маршрутизация.
- Транспортный (L4) — TCP, UDP.
- Сеансовый (L5) — управление сессиями.
- Представительский (L6) — кодирование данных.
- Прикладной (L7) — HTTP, MQTT, CoAP.
TCP/IP (упрощённая модель):
- Сетевой доступ (L1–L2): Ethernet, Wi‑Fi, Bluetooth LE.
- Интернет (L3): IPv4/IPv6, ICMP, IGMP.
- Транспорт (L4): TCP, UDP.
- Прикладной (L7): HTTP(S), MQTT, CoAP, DNS.
1.2. Bluetooth stack (BR/EDR и LE)
Основные слои:
- Controller (L1–L2):
- PHY (радио);
- Link Layer (LL) — кадры, сканирование, соединение.
- Host (L3–L7):
- HCI (Host‑Controller Interface);
- L2CAP (логические каналы);
- ATT/GATT (атрибуты для LE);
- GAP/GATT Profiles;
- Прикладные профили (HID, SPP, BLE Services).
2. Ограничения встраиваемых систем
2.1. Ресурсы
- ОЗУ: 2–256 КБ (критично для буферов TCP, таблиц маршрутизации).
- ПЗУ: 8–2048 КБ (размер кода стека).
- Тактовая частота: 8–240 МГц (задержки обработки пакетов).
- Энергопотребление (важно для батарейных устройств).
2.2. Периферия
- Отсутствие Ethernet‑MAC/PHY (требуется внешний чип).
- Ограниченные SPI/UART для подключения модулей (Wi‑Fi, LTE).
- Мало DMA‑каналов для разгрузки CPU.
2.3. Требования реального времени
- Жёсткие сроки обработки пакетов (например, для управления).
- Минимизация джиттера.
3. Подходы к реализации
3.1. «С нуля» (для учебных/простых случаев)
Плюсы:
- полный контроль над кодом;
- минимальная «нагрузка» (только нужные функции).
Минусы:
- высокие затраты времени;
- риск ошибок в реализации (безопасность, соответствие стандарту).
Пример: простой UDP‑стек для датчика:
- обработка IP‑заголовка;
- проверка контрольной суммы;
- извлечение UDP‑данных;
- отправка ответа.
3.2. Готовые библиотеки с открытым кодом
Популярные решения:
- LwIP (Lightweight IP) — TCP/IP для МК:
- поддержка IPv4, TCP, UDP, ICMP, DHCP, DNS;
- конфигурируемый размер буферов;
- порты для FreeRTOS, Zephyr.
- NanoStack (от ARM) — 6LoWPAN/IPv6 для LPWAN.
- BLE‑stack от производителей:
- Nordic NRF5 SDK (SoftDevice);
- TI CC2640R2F BLE Stack;
- Silicon Labs BGScript.
- MQTT‑SN, CoAP — облегчённые прикладные протоколы.
Плюсы:
- протестированность;
- поддержка сообщества;
- оптимизация для МК.
Минусы:
- зависимость от вендора;
- сложность настройки.
3.3. Аппаратные стеки (off‑the‑shelf модули)
Примеры:
- Wi‑Fi: ESP8266/ESP32 (с AT‑командами или SDK);
- LTE‑M/NB‑IoT: Quectel BG96, SIM7000;
- Bluetooth LE: nRF52832, CC2652.
Плюсы:
- минимум кода на МК;
- сертификация (FCC, CE).
Минусы:
- стоимость модуля;
- ограниченная гибкость.
4. Реализация TCP/IP на МК (на примере LwIP)
4.1. Архитектура LwIP
- Netif — интерфейс к PHY (Ethernet, PPP, SLIP).
- IP — маршрутизация, фрагментация.
- ICMP/IGMP — пинг, мультикаст.
- UDP/TCP — транспорт.
- DHCP/DNS — автоконфигурация.
- Sockets API — BSD‑совместимый интерфейс.
4.2. Шаги интеграции
- Настройка LwIP:
- определение
LWIP_CONF_H(размер буферов, поддержка TCP/UDP). - выбор PBUF‑типа (pool vs heap).
- определение
- Реализация PHY‑драйвера:
- функции
low_level_init(),low_level_output(),low_level_input().
- функции
- Инициализация стека:
lwip_init(); netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ethernet_link_status, tcpip_input); netif_set_default(&netif); netif_set_up(&netif); - Работа с TCP:
- создание соединения (
tcp_new(),tcp_connect()); - обработка событий (
tcp_recv(),tcp_sent()).
- создание соединения (
4.3. Оптимизация для МК
- Статические буферы:
LWIP_TCP_RECVMBOX— фиксированный пул буферов.
- Отключение ненужных функций:
- без IPv6 →
LWIP_IPV6=0; - без DHCP →
LWIP_DHCP=0.
- без IPv6 →
- Использование DMA для передачи пакетов.
5. Реализация Bluetooth stack (на примере BLE)
5.1. Режимы работы BLE
- Observer (сканирование).
- Advertiser (рассылка объявлений).
- Central (подключение к периферии).
- Peripheral (ожидание подключения).
5.2. Интеграция с МК
Вариант 1: Внешний модуль с AT‑командами
- МК общается через UART.
- Пример команды:
AT+BLEADVSTART=1,3000(старт рекламы).
Вариант 2: SDK от производителя
- Nordic nRF52: SoftDevice (прошивка для радиочасти) + приложение на C.
- TI CC2640: Stack API (функции
GAP_StartAdvertising(),GATT_WriteCharValue()).
5.3. Пример: BLE‑периферий (nRF52)
- Инициализация:
ble_stack_init(); // Запуск SoftDevice gap_params_init(); // Настройки GAP gatt_db_init(); // Создание GATT‑базы - Запуск рекламы:
advertising_init(); advertising_start(); - Обработка событий:
- подключение (
BLE_GAP_EVT_CONNECTED); - запись в характеристику (
BLE_GATTS_EVT_WRITE).
- подключение (
5.4. Оптимизация
- Минимизация рекламы (короткий интервал, мало данных).
- Спящие режимы между пакетами.
- DMA для UART/SPI при работе с внешним модулем.
6. Оптимизация сетевых стеков для МК
6.1. Экономия ОЗУ
- Фиксированные буферы вместо динамического выделения.
- Уменьшение размеров очередей (например, 2–4 TCP‑соединения).



