banner
Object Detector and HTTP Server in Zephyr RTOS.

В статье описан Qt/C++ клиент для работы с HTTP сервером от компании Nordic Semiconductor. Cервер работает на плате nRF7002 DK в RTOS Zephyr. Клиент включен в состав программы Object Detector версии 1.7.8. Object Detector может быть запущен в любой из операционных систем macOS, Windows, Linux. Клиент предназначен для обмена данными с сервером на плате nRF7002 DK по протоколу HTTP.
Как это выгдядит?
Программа Object Detector распознает объекты, вычисляет вероятность их распознавания и расстояние до объектов. Затем эти данные можно было бы передать серверу. Но на этот раз поступим по-другому. В клиенте проверим какой обьект обнаружила программа? Если это человек (person), выдадим команду на включение на плате первого светодиода (led1). Если, предположим, найден телевизор (tvmonitor) - включим второй светодиод (led2). Ну, а если обнаружен какой-то другой объект (всего данная нейросеть обнаруживает 80 типов оъбъектов), погасим оба светодиода.
Конечно, типы объектов в программе клиента могут быть изменены на другие. И понятно, что алгоритм на плате nRF7002 DK может выполнять более серьезные функции по управлению оборудованием, чем просто включать и выключать светодиоды. Интересно другое - посмотреть как выглядит C++ код клиента для обмена данными по протоколу HTTP с сервером на плате nRF7002 DK. Фрагмент кода клиента показан на рисунке. Функции для обработки ответа сервера и возможных ошибок можно увидеть загрузив проект Object Detector.
Обратите внимание на то, что рассматриваемый пример сервера работает с протокол IPv4. Однако существует версия сервера работающая с протоколами IPv4 и IPv6.
Это двадцать восьмая статья из цикла "Real-Time Object Recognition". Первые двадцать семь опубликованы здесь: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 и 27.
1. Проект HTTP сервера от Nordic Semiconductor на плате nRF7002 DK.
Как запустить HTTP сервер хорошо описано здесь. Внешний вид Visual Studio Code с загруженным проектом HTTP сервера показан на рисунке ниже.
Http Server
2. Описание исходного кода HTTP сервера.
Коротко опишем последовательность работы HTTP сервера. Откройте файл с исходным текстом. Программа стартует с функции main() (стр. 459). В строке 463 вызывается функция parser_init() (стр. 281-290). В этой функции инициализируется парсер для разбора HTTP запроса приходящего от клиента. Данные при работе парсера сохраняются в структуре http_req. Сама структура определяется в строках 45-54.
В строке 465 вызываутся функция dk_leds_init(). Данная функция инициализирует библиотеку для управления светодиодами.
В строках 471 - 477 выполняется настройка обработчика событий Zephyr NET Connection Manager. Здесь задается структура mgmt_cb, определенная в стр. 82 и функция net_mgmt_event_handler() (стр. 86-113).
Функция прослушивания start_listener() стартует в строке 480. Сама функция находится в строках 450-457. В строке 456 этой функции вызывается функция k_thread_start(tcp4_thread_id), в которой поток tcp4_thread_id добавляется в очередь планирования c функцией process_tcp4().
Функция process_tcp4() находится в строках 428-447. В этой функции в строке 436 вызывается другая функция setup_server() (стр. 293-317). По существу эта функция устаналивает сервер. Если сервер нормально установлен, в строке 445 вызывется функция process_tcp() (стр. 388-425). В этой функции для каждого нового подключения создается отдельный поток. Выполняется это в строках 412-418.
Поток вызывает функцию client_conn_handler() (стр. 320-372). В этой функции начинается работа по анализу принятого запроса. В строках 334 и 351 вызываются функции http_parser_init() и http_parser_execute(). Если запрос получен полностью, то в строке 363 вызывается функция handle_http_request(&request) (стр. 145-218). В этой функции выделяются пришедшие от клиента put или get методы протокола HTTP. В зависимости от полученного метода запроса выполняются различные действия. Так, если запрос обнаружен как put, то вызывается функция handle_led_update(request, led_id) (стр. 116-142). Далее формируется ответ на запрос и в строке 208 он передается клиенту.
3. Проверка обмена данными между программой Object Detector и HTTP сервером на плате nRF7002 DK.
Выполните следующие действия:
  1. Загрузите файл object_detection_1_7_8.zip и распакуйте его;
  2. Перейдите в каталог, созданный архиватором, и распакуйте файл ObjectsDetection.zip;
  3. Перейдите в вторую дочернюю папку ObjectsDetection, откройте проект в Qt Creator;
  4. Убедитесь в том, что строка номер 176 в файле CMakeLists.txt не закомментирована. Строка содержит текст:
    target_compile_definitions(ObjectsDetection PRIVATE HTTP_nRF7002DK);
  5. Скомпилируйте, соберите и запустите проект ObjectsDetection;
  6. В меню "File" выберите пункт "Open Camera";
  7. Далее в меню "File" выберите пункт "Select Protocols and Classes Name";
  8. В окне "Выбор параметров" выберите классы "person" и "tvmonitor", включите для них CheckBox "HTTP POST";
  9. Нажмите кноку "Start";
  10. При попадании в поле зрения камеры указанных объектов проконтролируйте включение светодиода(ов) на плате сервера;
  11. Остановите процесс распознавания, нажав кнопку "Setup";
  12. В окне "Выбор параметров" выберите классы "person" и "tvmonitor" и выключите для них CheckBox "HTTP POST";
  13. В окне "Выбор параметров" выберите класс "cell phone", включите CheckBox "HTTP POST";
  14. Нажмите кноку "Start";
  15. При попадании в поле зрения камеры телефона проконтролируйте выключение светодиодов.
Фрагмен кода Qt/C++ клиента показан на рисунке ниже. Входной формат данных примерно такой: tvmonitor: 0,81 distance: 0,70. Полный исходный текст можно посмотреть загрузив проект Object Detector.

Http Server Http Server

Проект Object Detector можно загрузить и поблагодарить: Спасибо!  2202   2005   9442   6213   (счет в сбербанке).
Консультации через e-mail: veresov@jdesign.ru или телефон: +7 921-215-45-70.
Евгений Вересов.
03.10.2025 года.