Предисловие

Эта статья - обобщение моих изысканий в отношении USB DVR камеры производства фирмы Shenzhen Huiying Technology Co., Ltd Модель камеры не помню - бумажку, на которой была указана модель, я выкинул, а на самой камере нет никакой информации. Вобщем, чтобы добытая информация не потерялась - сохраню её здесь.

Став жертвой собственной скупости, я приобрел эту камеру на aliexpress.  Собственно, вот ссылка: https://aliexpress.ru/item/4000014783157.html Сразу предупреждаю: если вы пока что не купили это чудо китайской инженерной мысли - лучше не покупайте. Найдите что-нибудь более пристойное. Но поскольку вас занесло на эту страницу, то камеру эту вы скорее всего уже купили.

Собственно, основная проблема с этой камерой - это то, что она не поддерживает USB UVC. Из этого следует, что использовать её можно будет только с тем софтом, который идет с ней в комплекте и только под Android-ом. Сторонние приложения работать не будут, равно как и нет версий её родного софта под другие ОС. Есть правда созданное мною исключение - скрипт, который превращает эту камеру в некое подобие IP-камеры.

Кроме ограниченной софтовой поддержки есть ещё одна проблема - низкое качество изображения. Да, разрешение кадра у неё 1280x720 - как заявляет продавец. Вот только каждый кадр подвергается сжатию в JPEG, и сжимается он до размера примерно в 100 кБ.

Теперь немного о внутренностях. Микроконтроллер камеры производства Buildwin (сейчас AppoTech group). Datasheet на него найти не удалось. Изнутри плата камеры выглядит вот так:

Внимание! Если захотите модифицировать оптику, то учитывайте, что хоть держатель объектива выглядит стандартным и имеет стандартную резьбу под объектив M12, но расстояние между крепежными отверстиями у него 18мм.!

О принципе работы

Камера эмулирует USB Mass Storage устройство по имени Buildwin Media Player. Т.е. видно её в системе как USB-диск, и других USB-интерфейсов она не поддерживает. Содержимое этого диска делится на статическое и динамическое. Из статики - apk пакет с софтом для Android-а. С динамическим содержимым все интереснее. В корне диска лежит файл VSFILE. Именно через него данные (как служебные, так и сама картинка) передаются на хост. Также есть ещё один файл в каталоге Android/data/com.fvision.camera с именем HWC. Этот файл предназначен для отправки управляющей информации (например, команд начать запись или установить текущее время) с хоста на камеру.

Файл VSFILE состоит из двух частей: служебная информация (первые 512 байт) и непосредственно картинка в формате JPEG (все остальное). В служебной информации, помимо прочего, содержатся версия прошивки, ответ на последнюю команду, длина данных JPEG и что-то типа счетчика кадров. Последовательность работы с VSFILE следующая:

1. lseek 0 SEEK_SET
2. read 512 байт
3. lseek 8704 SEEK_SET
4. read n*512 байт данных JPEG

Файл HWC исходно состоит из нулей. Но если записать в его начало команду корректного формата, то камера распознает её и исполнит. Наличие новой команды камерой определяется или по самой операции записи, или по несоответствию текущего содержимого предыдущему. Последовательность работы с HWC следующая:

1. lseek 0 SEEK_SET
2. write 512 байт
    Формат команды:
        код_команды 1Б.
        0x00
        длина_данных 1Б.
        0x00
        данные
        дополнение нулями до 512 байт
3. lseek 512 SEEK_SET
4. read 512 байт

Родной софт работает примерно так: открываются файлы VSFILE и HWC с флагами O_DIRECT. Это позволяет полностью отключить кэширование ввода/вывода. В файл HWC выдаются команды инициализации и начала записи. Полностью читается файл VSFILE, и из него выделяется текущее значение счетчика кадров и первоначальная картинка. Затем происходит периодическое чтение первых 512 байт VSFILE. Если значение счетчика кадров изменилось, то происходит чтение новой картинки и обновление сохраненного значения счетчика кадров.

Если кому-то интересны коды команд, то их легко вытащить из родного apk камеры, например с помощью jadx

Родной софт

Побочным эффектом исследования родного софта камеры явилось обнаружение системы обновления продуктов фирмы хуйфенг и стягивание с неё обновленного apk и прошивки. Вот что у меня есть из родного софта этой камеры:

Название Версия Примечание
Traffic safety guard (com.fvision.camera) 1217_v1.4.6 Родной DVR.apk
Traffic safety guard (com.fvision.camera) 0518_v1.6.2 Новая версия apk для Android
bw.d.general.mirror_0713_v4.3_1594726199152.bin 0713_v4.3 Новая прошивка камеры

Использование со сторонним софтом

Для того, чтобы использовать эту камеру хоть с каким-нибудь софтом, отличным от родного, я написал скрипт-сервер на perl. Он работает практически также, как и родной софт, за исключением того, что картинку он выводит не на экран, а в виде Motion JPEG потока по HTTP для подключившихся клиентов. Чтобы привести скрипт в рабочее состояние нужно привести в нем пути к файлам VSFILE и HWC в соответствии с конфигурацией вашей системы. После этого можно запускать и подключаться браузером по HTTP. Кроме этого, скрипт периодически синхронизирует время камеры с текущим временем системы.