KoynovStas / wsdd

wsdd is Linux daemon for ONVIF WS-Discovery service (server side)
GNU General Public License v2.0
59 stars 31 forks source link

ONVIF для видеокамеры #5

Open ZigFisher opened 5 years ago

ZigFisher commented 5 years ago

Добрый день.

Нашел ваш проект в интернете. Вижу вы плотно занимаетесь и разбираетесь в ONVIF. Наша инициативная группа смогла запустить на видеокамерах с процессорами Hisilicon собственную открытую прошивку на базе OpenWrt. Мы получили видео в MJPEG, MP4, RTSP. Сейчас ищем простое и минималистичное решение для базовой (можно с костылями) поддержки ONVIF в видеокамерах для того, что-бы штатные видеорегистраторы могли их (камеры) находить. Я гуглил и скачивал какие-то проекты с GitHub но так и не смог понять, как оно работает. Или не работало, или не собиралось или после сборки уж очень оно оказывалось большим, мегабайты, что для камер неприемлемо. Что вы можете посоветовать по этому поводу ? Спасибо. Проект находится здесь - https://github.com/ZigFisher/chaos_calmer/releases

KoynovStas commented 5 years ago

Вижу вы плотно занимаетесь и разбираетесь в ONVIF

Эмм — это ошибочное мнение! Я занимался ONVIF ровно два месяца, первый месяц я вкуривал что это такое, а второй написал вот эти два проекта:

onvif_srvd - это то, что "договаривается" с видеорегистратором также по протоколу soap (будь он не ладен). Тем самым регистратор понимает, какой формат, какое разрешение, порт, протокол передачи и т.п

Я использовал инструмент gsoap для генерации парсера — это как вы выразились: «Порождает бинарник большого размера» Мне даже не хотелось их выкладывать на гитхаб, просто подумал, может кому-то пригодиться... Но на удивление именно эти исходники пользуются большой популярностью на моем аккаунте.

Вообще что такое ONVIF (Open Network Video Interface Forum) — отраслевая международная организация, которая занимается разработкой стандартизованных протоколов для взаимодействия различного оборудования и программных средств, входящих в состав систем безопасности (IP-камер, IP-кодеров, видеорегистраторов, контроллеров доступа и т.п.).

Но это все лирика! Все это нужно чтобы стандартизировать «общение и другие механизмы» между девайсами системы видео наблюдения. Например в самом простом случае между IP-камерой и видеорегистратором. Тобишь просто описать стандарт (протокол) как спросить — что ответить и в каком формате. Вот тут нас ждет большое удивление и разочарование! Почему? В эту организацию проникли люди близкие к MicroSoft, которые продвинули стандарт soap. Это такая надстройка над XML. И язык WSDL.

Их задумка была такой, что имея WSDL файл, вы в динамике сможете сгенерировать парсер (сервер) для работы с данным девайсом. Вроде все просто! Но ведь мы должны иметь парсер WSDL файлов. Мы должны использовать soap а не чистый XML что мешает использовать простые XML парсеры. А так как и WSDL файл и парсер soap очень сложны (если рассматривать общий случай) то нужны очень большие ресурсы, но эти люди были далеки от embedded систем, они думали категориями облачных вычислений… Что привело к некому подобию Скайпа — монстр который не может выполнить даже своих функций. (Такое чувство, что набирают на работу не инженеров, а всяких медалистов и олимпиадников, которым их большой мозг мешает думать)

Поэтому написать самому все эти парсеры «по уму» в короткие сроки — не реальная задача. Я использовал gsoap который может из WSDL файла сгенерировать парсер soap. Данный парсер — сервер, который обрабатывает soap запросы. Вы лишь добавляете логику. Недостаток — приложения очень большие!.

При этом эти приложения нужны только для общения, реальной полезной работы они не делают. После нахождения камеры у нее запрашивается адрес RTSP и все. Дальше RTSP работает сам по себе и никаким боком к ONVIF не имеет отношения.

Если нужно организовать работу протокола ONVIF без gsoap и ему подобных инструментов. Могу посоветовать попробывать разработать сервер на чистых Си, возможно даже без применения регулярных выражений. Вы должны будете иметь почти готовые строки (soap) для ответа и суметь в запросе понять начало и конец. И понять, что у вас спросили, чтобы отправить готовый ответ. Тут главное однозначно «распарсить» - понять запрос. Я думаю имея нужную вам функциональность на большой машине. Скажем можете взять мои шаблоны и реализовать необходимый минимум. И при помощи сетевого снифера просмотреть запрос-ответ. Чтобы написать Си вариант. Оценить данную работу и будет ли все работать как задумано я не берусь. Если однозначность легко достигнуть, то сервер не должен превышать размер 100 Килобайт. Если машинка имеет флэшку больше 4 метров и стандартная либа С++ может поместиться можно сделать работу на С++. но регулярками от плюсов я бы не пользовался (медленные), а использовал regexp.h

ZigFisher commented 5 years ago

Добрый день !

ОГРОМНОЕ спасибо за развёрнутый и исчерпывающий ответ ! Да, будем пробовать собирать что-то своё и маленькое ибо ресурсов не густо. Если вдруг увидите на GitHub, или может знаете где можно взять подобный базис, буду весьма признателен. Спасибо еще раз. Наш чат в Телеграм - https://t.me/joinchat/FhtyHxDpQsv8HlRliQDgqw