|
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.
1. Проект HTTP сервера от Nordic Semiconductor на плате nRF7002 DK.
Как запустить HTTP сервер хорошо описано
здесь.
Внешний вид Visual Studio Code с загруженным проектом HTTP сервера показан на рисунке ниже.
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.
Выполните следующие действия:
Фрагмен кода Qt/C++ клиента показан на рисунке ниже.
Входной формат данных примерно такой: tvmonitor: 0,81 distance: 0,70.
Полный исходный текст можно посмотреть загрузив проект Object Detector.
Проект Object Detector можно загрузить и поблагодарить:
Консультации через e-mail: veresov@jdesign.ru или телефон: +7 921-215-45-70.
|
