Проверка ёмкости и переподключения BLE-шлюза с несколькими датчиками
Ответ на вопрос «Сколько датчиков BLE поддерживает один шлюз?» должен включать описание нагрузки. Десять датчиков с отчётом раз в минуту создают другую задачу, чем десять устройств с пакетными всплесками каждые 20 миллисекунд. Обоснованная спецификация ёмкости определяет радио- и программные ограничения, подтверждает свежесть данных при требуемой нагрузке и измеряет восстановление после одновременного исчезновения нескольких датчиков.
Выберите сбор через соединения или рекламные пакеты
Шлюз с соединениями GATT поддерживает каналы, подписывается на характеристики и может отправлять команды настройки. Сборщик рекламных пакетов принимает отчёты без соединения. Bluetooth Mesh использует ещё одну модель связи и подготовки узлов. У этих архитектур разные свойства поиска, доставки и безопасности; их число узлов нельзя непосредственно переносить с одной на другую.
Начните с перечня устройств: протокол и версия прошивки, формат отчёта, частота измерений, длина всплеска, возможность соединения, требования к сопряжению и допустимый возраст данных. Решите, нужно ли восстанавливать пропущенные исторические отсчёты или достаточно последнего измерения. При сборе рекламных пакетов также потребуется определить на уровне приложения подлинность, устранение дубликатов и защиту от повторного воспроизведения, если этого требует эксплуатация.
На описание выполненного проекта шлюза ESP32 Wi-Fi и Bluetooth описаны отдельные направления Wi-Fi и SIG Mesh. Это полезный архитектурный контекст, но там нет измеренной ёмкости для датчиков с соединениями GATT. Для шлюза GATT нужна собственная проверка конечных устройств и нагрузки.
Отделите предел числа соединений от полезной ёмкости
Проверьте точную модель микросхемы, прошивку контроллера, стек хоста, версию SDK и конфигурацию сборки. Объекты соединений хоста, каналы контроллера, буферы ACL, хранилище связей безопасности и очереди приложения имеют разные пределы. Увеличение одного параметра не устраняет остальные ограничения.
В качестве конкретного примера с указанием версии руководство Espressif по множественным соединениям ESP32 для ESP-IDF v6.0.3 указывает девять одновременных соединений для ESP-NimBLE и ESP-Bluedroid, с соответствующими настройками хоста и согласованной настройкой контроллера. Это предел реализации, а не гарантированное число датчиков для любой нагрузки или любой микросхемы семейства ESP32. Zephyr также предоставляет CONFIG_BT_MAX_CONN. Проверяйте документацию фактически используемого релиза. Источники: руководство Espressif по множественным соединениям и документация GAP Shell Zephyr.
Для шлюза Linux дополнительная RAM или более быстрый процессор не подтверждают повышение предела радиоконтроллера. Зафиксируйте модель USB/UART-контроллера, его прошивку, ядро и версию BlueZ. Обработчики уведомлений должны быть короткими: проверить данные и поставить их в очередь, а запись в базу и работу с внешним каналом выполнять за пределами Bluetooth-обработчика.
Составьте бюджет трафика с измеренным запасом
Сначала рассчитайте байты приложения. Например, восемь датчиков, каждый из которых создаёт 16-байтовую запись с частотой 5 Гц, дают 640 байт в секунду до накладных расходов протокола. Эта арифметика не прогнозирует радиопропускную способность. Обмен пакетами, пустые события соединения, подтверждения, повторные передачи, сканирование и планирование требуют дополнительного времени.
Полезная предварительная оценка — сумма предполагаемого эфирного времени события каждого соединения, делённого на его интервал. Оставьте запас для сканирования, переподключения и сосуществования с внешним каналом. Это не гарантия планирования Bluetooth и не замена измерениям: пересечения событий, политика контроллера и всплески поступлений могут вызвать отказ даже при комфортном среднем бюджете.
Измерьте согласованный интервал соединения, задержку периферийного устройства, тайм-аут наблюдения, PHY, ATT MTU и длину данных канального уровня. Большая ATT MTU не гарантирует более длинный пакет канального уровня или больше пакетов в каждом событии. Увеличение интервала может упростить планирование, но ухудшить задержку или увеличить требования к буферизации всплесков. Меняйте параметры относительно цели по свежести, а не универсальной настройки «максимальная пропускная способность».

Реализуйте переподключение как ограниченный автомат состояний
Отслеживайте каждый датчик отдельно на этапах поиска, соединения, безопасности, определения служб, подписки и потока данных. «Соединение установлено» не означает готовность. Полезный критерий готовности — получение первого действительного и правильно идентифицированного отсчёта приложения после подписки.
DISCOVER -> CONNECT -> SECURE -> RESOLVE -> SUBSCRIBE -> STREAM
failure -> RELEASE_RESOURCES -> BACKOFF -> DISCOVER
# Illustrative full-jitter backoff, seconds:
delay = random_uniform(0, min(60, 2 ** min(attempt, 6)))
# Reset attempt after a defined healthy-stream interval.
# Limit simultaneous connection/setup attempts globally.
Приведённые выше времена — примеры проектирования, а не обязательные настройки BLE. Для каждого состояния определите тайм-аут, путь отмены и код причины. Ограничивайте повторы при неисправностях, требующих вмешательства, например несовместимой версии протокола или повторяющихся ошибках аутентификации. Показывайте понятный для устранения отказ вместо бесконечных попыток на полной скорости.
После разрыва корректно освобождайте устаревшие дескрипторы и регистрации обработчиков, отменяйте потерявшую актуальность работу, затем заново устанавливайте требуемую безопасность и подписки. Сохраняйте устойчивую идентификацию через поддерживаемые механизмы сохранённых связей и приватности либо аутентифицированный идентификатор приложения; не считайте каждую смену частного адреса появлением нового постоянного датчика. В BlueZ используйте поддерживаемый интерфейс уведомлений и обрабатывайте документированные ошибки. См. GATT API BlueZ.
Используйте идентификаторы загрузки и последовательности отсчётов для различения перезапусков, пропусков и дубликатов. Постоянно храните лишь состояние, необходимое для контракта восстановления продукта. Перезагрузка шлюза при передаче накопленного архива не должна молча превращать старые отсчёты в текущие показания.
Проверяйте конкуренцию и отказы при загрузке всех каналов
В конструкции с общим радиотрактом сбор BLE и трафик Wi-Fi конкурируют за радиоресурсы. Espressif описывает приоритетное сосуществование и изменение планирования в зависимости от состояния Wi-Fi. Проверяйте как стабильный внешний канал, так и сканирование и переподключение Wi-Fi: спокойное стендовое соединение не покрывает эти условия. См. руководство по сосуществованию ESP32, затем соответствующий документ для выбранных SDK и микросхемы.
Используйте серийный корпус, предусмотренное положение антенны и источник питания. Варьируйте число поддерживаемых датчиков и частоты отчётов, затем повторяйте испытания на предполагаемой рабочей границе с контролируемым ослаблением или характерным размещением. Один RSSI не является критерием успеха. Сохраните контрольную группу с сильным сигналом, чтобы отделять проблемы очередей и процессора от радиопроблем.
| Сценарий | Воздействие | Необходимое наблюдение |
|---|---|---|
| Устойчивая ёмкость | Повышать число активных датчиков и частоту отчётов до заявленного предела | Свежесть каждого датчика, уникальная доставка, пик очереди, тенденция CPU и памяти |
| Синхронный всплеск | Заставить все датчики отправлять одновременно | Высокие процентили задержки, поведение при переполнении и справедливость |
| Отказ одного узла | Вывести датчик из зоны связи или перезапустить питание | Время обнаружения и восстановления; остальные узлы остаются в целевых пределах |
| Шторм переподключений | Перезапустить все датчики или шлюз | Первый и последний восстановленные потоки, параллельность настройки и распределение повторов |
| Конкуренция внешнего канала | Сканирование Wi-Fi, переподключение и непрерывная выгрузка | Пропуски BLE и восстановление при ограниченных очередях |
| Отказ внешнего канала | Заблокировать сервер или сетевой путь | Граница хранения, сигнал переполнения и учёт передачи архива |
| Разные версии и безопасность | Сочетать поддерживаемые версии и отклоняемые учётные данные | Корректный статус каждого устройства без лишения исправных узлов ресурсов |
| Длительный прогон | Повторять отказы в течение срока, покрывающего требуемые рабочие циклы | Нет утечек ресурсов, застрявших состояний и необъяснимой потери данных |
Определяйте приёмку через пригодные к использованию данные
Установите пороги приёмки до испытаний. Пример спецификации может требовать 99-й процентиль возраста отсчёта менее двух секунд, определённую долю доставки уникальных отсчётов и восстановление всех доступных датчиков за согласованное время. Это примеры требований, а не полученные результаты. Медленному датчику с измерением раз в минуту нужна другая цель свежести.
Определите знаменатель: ожидаемые отсчёты, сформированные за измерительное окно, отсчёты, сохранённые датчиком, и отсчёты, пригодные к передаче, — разные величины. Дубликаты считайте отдельно от уникальных доставленных отсчётов. Укажите влияние известных периодов отсутствия связи на цель. Включите долю успеха с первой попытки и поведение худшего узла, чтобы общая средняя величина не скрывала датчик, лишённый ресурсов.
Измеряйте возраст отсчёта от времени его получения датчиком только при синхронизированных часах либо ограниченных смещении и дрейфе. Иначе отдельно сообщайте задержку от приёма шлюзом до передачи по внешнему каналу, а сквозной возраст помечайте как неизвестный. Для длительности локальных состояний используйте монотонные часы и записывайте весь ход отказа: неисправность, обнаружение, соединение, подписка и первый действительный отсчёт.
Ищите неисправность на действительно отказавшем уровне
- Соединения установлены, но данных нет: проверьте определение служб, состояние подписки, разрешения и формирование данных датчиком.
- Отказы возникают только при большом числе датчиков: проверьте пределы контроллера, исчерпание буферов, планирование событий и общую параллельность настройки.
- Отказ следует за активностью внешнего канала: сравните трассы сосуществования Wi-Fi, длительности обработчиков и рост очередей.
- Один неисправный датчик задерживает все остальные: проверьте общие блокировки, последовательные неограниченные повторы и справедливость очередей.
- Переподключение работает лишь после перезагрузки: ищите неосвобождённые объекты соединений, устаревшие обработчики и состояния без выхода по тайм-ауту.
Полезное техническое задание включает образцы датчиков, версии прошивки, профили трафика, топологию, поведение внешнего канала и численные цели приёмки. Услуга интеграции шлюзов Obeita подходит для определения объёма этой работы. Результатом должны стать версионируемая область допустимой нагрузки и отчёт о восстановлении для выбранной конфигурации, подкреплённые журналами. Архитектурный контекст также даёт описание выполненного проекта шлюза ESP32 Wi-Fi и Bluetooth. Численные примеры и план испытаний в статье не являются измеренными результатами этого проекта.