Device network sdk что это
SDK тебе, SDK мне, SDK всем! Как делать SDK и зачем это нужно
Наша компания делает сервис для хранения и обработки данных с промышленных устройств (насосы, буры и прочая промышленная техника). Мы храним данные наших клиентов и предоставляем функционал для их анализа: построение отчетов, графиков и еще много чего.
И в ходе работы мы заметили, что интеграция каждого нового клиента сильно затягивается, а количество различных ошибок постоянно возрастает. Тогда стало понятно, что пора с этим разобраться. Как показал анализ ситуации, IT отдел каждого нашего клиента разрабатывал свое решение для локального сбора данных с устройств и отправки к нам в сервис. Все усложняет то, что с учетом специфики отрасли, не всегда есть доступ к интернету и необходимо хранить данные локально и отправлять при первой возможности. И таких нюансов достаточно большое количество, что и приводит к росту количества ошибок.
И тогда мы поняли, что лучшим решением в данной ситуации будет разработать SDK и предоставлять его клиенту. Сразу же начал искать лучшие практики и рассуждения на тему разработки SDK и сильно удивился — в рунете об этом практически ничего нет, а в басурманских интернетах очень мало информации и она разрознена. Ну что ж, задача понятна, обдумана и реализована.
Пора определяться
Начнем с того, что определим, что такое SDK и зачем он может быть нужен.
SDK (от англ. software development kit) — комплект средств разработки, который позволяет специалистам по программному обеспечению создавать приложения для определённого пакета программ, программного обеспечения базовых средств разработки, аппаратной платформы, компьютерной системы, игровых консолей, операционных систем и прочих платформ. SDK использует преимущества каждой платформы и сокращает время на интеграцию.
…
Инженер-программист обычно получает SDK от разработчика целевой системы.
Что ж, логично. Простыми словами, SDK — это пакет библиотек, для того, чтобы клиент мог легко и быстро начать работать с вашей системой (в данной статье речь пойдет про наш сервис, но всё изложенное в статье применимо и к другим видам SDK) или выполнять однотипные действия.
Но, как и у любого подхода, у «Пути SDK» есть как преимущества, так и недостатки.
Преимущества
Высокая скорость интеграции нового клиента — вашим клиентам нужно писать меньше кода.
Переиспользование кода — один и тот же код используется сразу в нескольких местах. Можно сказать, что это дублирование предыдущего пункта, но речь идет о том, что логика работы везде одинокава, из чего следует
Предсказуемость поведения — использование одних и тех же библиотек приводит поведение систем к определенному стандарту, что сильно облегчает поиск и устранение ошибок и уязвимостей.
Качество кода — много где любят экономить на тестировании (жалко бюджета, горят сроки и прочие причины). Понятно, что в реальном мире покрыть тестами все участки проекта это учень трудоемкая задача. Но качественно протестировать все модули SDK, а затем использовать их — это путь повышения процента покрытия тестами, что приведет вас к снижению количества ошибок.
Документация — тот же сценарий, что и с тестами. Покрыть документацией весь проект достаточно проблематично. Переиспользование модулей SDK повышает процент покрытия документацией, что снижает порог вхождения новых сотрудников в проект и вообще помогает по жизни.
Все преимущества, по сути, это следствия самого главного — мы очень качественно пишем код один раз, а затем его переиспользуем.
Недостатки
Высокие требования к качеству кода SDK — следствие главного преимущества. Ошибка в SDK породит ошибки во всех системах, его использующих.
Установка ограничений — SDK — это набор библиотек для реализации стандартных сценариев. Иногда разработчики SDK полагают, что кроме реализации одного из предусмотренных сценариев клиенту ничего не потребуется, что клиенту проще сделать все с нуля самостоятельно, чем строить пьедестал из костылей для SDK.
Dependency hell и обновления — при расширении функционала (например, кастомизации решения под конкретного клиента), вы выпустите новую версию библиотеки. Но существуют зависимости, различные наборы версий библиотек у разных клиентов, и нужно очень тщательно следить за обратной совместимостью или строгим версионированием.
Когда SDK действительно нужен
У вас есть несколько стандартных сценариев, которые реализуются заново из раза в раз — собственно, наш случай.
Внутренние разработки — в разных проектах вы используете системы логирования, конфигурирования систем, работу с HttpRequest, БД, файлами? Выработайте внутренний SDK — набор библиотек для внутреннего использования. Вы в любой момент можете расширить функционал SDK, но скорость разработки новых проектов, процент покрытия тестами и документацией вырастет, а порог вхождения новых разработчиков снизится.
Когда SDK скорее всего будет лишним
Сценарии использования не определены или постоянно меняются — оставьте реализацию кастомных решений клиентам и помогите им. Не надо городить вундервафлю, которая будет только мешать. Очень актуально для молодых компаний и стартапов.
Вы не умеете делать качественно — у меня для вас плохая новость: пора учиться. Но отдавать кривое решение клиенту это очень, очень неправильно. Клиентов надо уважать, в конце концов.
Итак, мы определились, что такое SDK, с его преимуществами и недостатками и когда он нам нужен. Если после этого вы поняли, что SDK действительно нужен — приглашаю вас встать на «путь SDK» и разобраться, а каким он должен быть и как его, черт подери, делать?
«А вы любите Lego?» — Модульность
Представим все возможные сценарии использования SDK (вы же уже определились, зачем он вам нужен, правда?) и сделаем по библиотеке на сценарий. Чем не выход? Но это плохой подход, и так мы делать не будем. А будем так:
Например, с учетом специфики задачи, нам необходимо, чтобы вся логика задавалась из конфигов. Реализуем модуль работы с конфигами (чтения, записи, обновления, валидации и обработки конфигураций) и будем использовать его во всех остальных модулях.
А для реализации стандартных сценариев мы действительно сделаем модули — этакие «управляющие» модули, каждый из которых реализуют один конкретный сценарий, используя другие модули того же SDK. Таким образом для реализации стандартных сценариев клиент должен лишь подключить управляющий модуль сценария (а он сам подтянет все зависимости), а для реализации нестандартных — используем базовые модули, так же переиспользуя код.
Именно этим обусловлено то, что SDK не должен быть одной библиотекой (хотя очень хочется, понимаю. Ведь когда весь SDK в одной библиотеке, можно забыть о зависимостях и всем, что с ними связано), а быть комплектом библиотек. Дополнительным плюсом данного подхода будет уменьшение «веса» программы клиента — он будет тянуть тяжеловесный SDK, а подтянет только необходимые модули.
Но не стоить плодить модули как попало, ведь чем больше модулей, тем больше головной боли от их зависимостей! Т.е. важно правильно разбить логику на модули, соблюдая баланс между решением «все в одном» и «на каждую функцию свой модуль».
«А что, так можно было?!» — Универсальность
Предоставьте клиенту различные интерфейсы для работы с вашей библиотекой. Приведу пример:
Если предоставить только синхронную версию, то при реализации асинхронного приложения клиент вынужден будет делать асинхронные обертки вашего синхронного метода. Если предоставить только асинхронную версию — ситуация похожа. Дайте клиенту и то и другое и он скажет вам спасибо.
Приятным плюсом будут дженерики. Например, у нас есть класс для работы с конфигурациями, реализующий методы упаковки конфига в строку, загрузки конфига из файла и т.д. Конфигурация конкретного модуля будет наследоваться от нашего базового класса, но для работы с новым классом нам необходимо также предоставить методы распаковки.
Таким образом мы предоставили клиенту аж три реализации, которые он может использовать. Дженерики очень удобны, но при работе с динамическими типами их можно вызывать только через рефлексию, что накладно. Общий принцип универсальности, надеюсь, понятен.
«Родитель 1, Родитель 2, Дети[ ]» — Именование
Что самое трудное в работе программиста? Выдумывать имена для переменных.
И тем не менее… Правильное именование модулей, классов, свойств и методов сильно помогут тем, кто будут с вашим SDK работать. Пример, не требующих комментариев:
Kinect 2.0 SDK example
Всё ясно из названий классов и методов. А если есть автодополнение кода в вашей IDE, то зачастую можно и в документацию не заглядывать, если и так все понятно.
Но даже если у вас очень красиво и актуально названы все модули, классы, методы и свойства, документацию все равно необходимо написать. Во-первых, это очень сильно сбережет вам нервы (количество вопросов клиентов уменьшается на порядок. Все есть в документации), а во-вторых, всегда понятно, почему вы сделали так, а не иначе.
Документация, в SDK, как правило, проста и лаконична. Она обычно делится на две части: Tutorial — пошаговый курс в стиле “Построим город за 10 минут” и раздел Reference — справочник по всему, что можно сделать с помощью данного SDK.
Мы выбрали самый простой путь — summary + articles. Мы добавляем Xml атрибуты для методов и классов, которые светятся в intellisense как подсказки. Используя Docfx мы строим документацию по этим атрибутам и получаем подробную и удобную документацию, которую дополняет статьями, описывающими сценарии использования и примеры.
«— Чтобы чисто было! — Как я буду вилкой-то чистить?» — Тестирование
Что можно сказать про тестирование в рамках обсуждения SDK… Must have! Лучшим решением будет TDD (несмотря на то, что я негативно отношусь к данному подходу, в данном случае я решил использовать именно его). Да, долго. Да, нудно. Но зато в будущем вы не повеситесь от постоянных падений SDK на стороне и следствий этого падения.
Основной сок ситуации заключается в том, что отдавая SDK клиенту вы теряете контроль: вы не можете быстро пофиксить ошибку, сложно эту самую ошибку найти, да и выглядеть в такой ситуации вы будете достаточно глупо. Поэтому — тестируйте. Тестируйте лучше. И еще раз. И, на всякий случай, протестируйте ваши тесты. И тесты тестов. Так, что-то я увлекся, но важность тестирования SDK, надеюсь, понятна.
«Жертва, которая не могла противостоять своему прошлому, была поглощена им» — Логи
Поскольку вы отдаете SDK сторонней компании, в следствие чего теряете контроль над ситуацией, в случае ошибки (на этапе тестирования вы все-так решили «и так сойдёт», да?) вас ждет достаточно долгий и болезненный процесс поиск этой самой ошибки. Именно тут вам на помощь придут логи.
Логируйте все, абсолютно все, а в случае возникновения ошибки запросите у вашего клиента логи. Таким образом вы сэкономите много времени и сможете не потярять лицо перед клиентом.
«Alarm! Achtung! Attention!» — Ошибки
Долго размышляя на тему ошибок я пришел к интересному выводу — ни один метод в вашем SDK не должен отдавать ошибку, не описанную в документации. Согласитесь, очень неприятно, когда вы подключаете стороннюю библиотеку для работы с HttpRequest, а она вываливает на вас какой-нибудь NullPointerException и StackTrace, который уводит в недра библиотеки. И вам приходиться погружаться в эти самые «недра», пытаясь понять, насколько глубока кроличья нора, и в чем, собственно, проблема.
Поэтому я предлагаю следующее решение — декларируйте закрытый список возможных исключений и документируйте их. Но, т.к. нельзя быть увереннным, что вы предусмотрели все, оберните метод в try-catch, а пойманную ошибку — в задекларируему. Например, ConfigurationException, который будет содержать InnerException — пойманную ошибку. Это позволит стороннему разработчику поймать все возможные ошибки, но в случае чего быстро разобраться в чем дело.
Версии или «как не укусить себя за хвост»
Во избежание проблем в будущем крайне рекомендую использовать строгое версионирование. Выберете подходящую вам систему построения версий и используйте ее. Но если новая версия библиотеки не имеет обратной совместимости — это необходимо указать. Как это разруливать — думать вам. Но подумать об этом точно стоит.
«Паровозик, который смог» — Deploy
Необходимость актуальности документации и версий порождают требование к корректности деплоя. В своем решении мы используем следующее решение (костыли, но работают).
Когда надо выпустить нвый релиз, разработчик дергает bat’ник с указанием номера релиза, а затем батник:
На выходе получаем обновленную версию сайта с документацией, откуда можно скачать архив с последней версией SDK.
В планах на будущее — упаковка всего в Nuget пакеты и публикация в локальный Nuget репозиторий.
Рекоммендую обратить внимание на этот пункт, ведь вы можете существенно снизить количество головной боли, вызванной отсутствием актуальной информации о новой версии библиотеки.
«-А так можешь? — Фигня. Смотри как надо!» — Примеры & toolkit
Заключение
Разработка SDK стало для меня интересной новой задачей, поднявшей много важных архитектурных вопросов. Многое описанное в статье является очевидными вещами (для меня), но считаю важным огласить даже очевидные вещи, чтобы получить четкую общую картину.
Спасибо за прочтение, буду рад вашим комментариям. Надеюсь, эта статья будет для вас полезной.
Device network sdk что это
iVMS-4200 3.6.1.5 для Windows 7/8/10 x64
iVMS-4200 AC 1.6.1.5 для устройств контроля доступа
iVMS-4200 3.3.0.5 для устройств c термографией
iVMS-4200 2.0.0.12 для MacOSX
Утилиты для работы с устройствами по сети
В этой версии для Windows появилась возможность самостоятельно отвязывать устройство от облачной учетной записи.
Работа с архивом
Windows 7/8/10
Плагины и фильтры для просмотра в сторонних плеерах
Калькуляторы и инструменты
Калькулятор битрейта и глубины архива.
Утилита для подбора объективов. Windows 7/8/10
Прошивки для оборудования Hikvision
Системные компоненты
Обновления компонентов DirectX
Распространяемый компонент Microsoft Visual C++ для Visual Studio 2017
Магазин мобильных приложений Hikvision
Device Network SDK (for Windows 32-bit)
V6.1.6.3_build20200925
Скачать
Device Network SDK (for Windows 64-bit)
V6.1.6.3_build20200925
Скачать
Device Network SDK (for Linux 32-bit)
V6.1.6.3_build20200925
Скачать
Device Network SDK (for Linux 64-bit)
V6.1.6.3_build20200925
Скачать
Политика по обработке персональных данных
Информация на сайте не является публичной офертой.
Описание товара носит справочный характер.
Производитель оставляет за собой право изменять внешний вид и характеристики товара без предварительного уведомления.
Что такое NDI?
Опубликовано Максим Пода
NDI (Network Device Interface) — это открытый стандарт с бесплатным набором SDK, позволяющий нескольким видеосистемам идентифицировать друг друга и взаимодействовать посредством IP-соединения для кодирования, преобразования и приема нескольких потоков ых видео- и аудиосигналов высокого качества с минимальной задержкой и высокой частотой кадров в реальном времени. Многие рассматривают его как более простой и дешевый путь к работе на основе IP, чем медленные и дорогостоящие в реализации стандарты SMPTE. Протокол позволяет, кроме передачи видео, звука и служебной информации, осуществлять управление удаленными устройствами — например, вращение и наклон PTZ-камеры по сети интернет на расстоянии в десятки километров. Протокол поддерживает работу по сети с широким спектром видеоустройств, например, видеомикшеры, PTZ-камеры, карты захвата. Также любое HDMI устройство (без встроенного LAN порта с поддержкой NDI) может быть подключено через преобразователь стандартов.
Давайте послушаем, что скажут разработчики:
Протокол настолько гибок, что даже смартфоны на базе iOS могут выступать в качестве беспроводной веб-камеры,
или обычные игровые джойстики могут быть использованы в качестве PTZ-пульта управления.
В апреле 2016 г. состоялся релиз версии 1.0. Разработчики продолжают совершенствовать его до сих пор. На момент публикации актуальная версия — 4.5.
Последние обновления включают:
Существующие продукты, работающие с SDI или IP, могут быть легко адаптированы под NDI.
NDI не претендует заменить собой SMPTE 2022, ASPEN, VSF TR-03, а наоборот, расширяет их возможности и сферы использования, тем самым существенно подталкивая развитие IP-технологий.
NewTek предлагает различные десктопные приложения для работы:
Преимущества использования
Когда вы используете продукты с поддержкой NDI, вам не нужно запоминать IP-адреса или адреса портов. Вы просто входите в TriCaster и выбираете «обнаружить источник». Система автоматически сообщит вам, какие PTZ-устройства доступны в вашей сети — аналогично тому, как ваш телефон подключается к источнику Wi-Fi или Bluetooth. Кодеки NDI отличаются высоким качеством и низкой задержкой. По одному кабелю 1GigE вы можете доставить 2 потока 2160p60 или до 7 потоков 1080p60 — это уменьшает количество кабелей, необходимых для каждой камеры или источника. По сравнению с SMPTE 2110 и SMPTE 2022, NDI требует на 90% меньшей скорости передачи данных для обеспечения того же разрешения 4K. Алгоритм кодирования не зависит от разрешения и частоты кадров, поддерживает сигналы формата 4K, наряду с 16 и более каналами плавающего звука. Протокол также включает инструменты по вставке авторских прав на видео, группировке двунаправленных метаданных, IP-команд, tally.
В каталоге Unitsolutions представлен широкий выбор PTZ-камер с поддержкой NDI.
Мы рекомендуем камеры Clevermic:
Если у вас есть вопросы, нужна консультация касательно выбора оборудования или установки, специалисты Unitsolutions помогут подобрать решение для ваших задач.
Русские Блоги
Использование Java для вызова сетевого SDK устройства Hikvision в Linux
1. Введение
2 вопроса, требующие внимания
2.1 Скачать
Пожалуйста, перейдите на официальный сайт Hikvision, чтобы загрузить устройство.Сетевой SDK_V6.0.2.35 (для Linux64)
2.2 Структура каталогов
2.3 readme.txt
Этот файл является загрузочным документом Linux для вызова сетевого SDK устройства. Конкретное содержимое выглядит следующим образом:
Следует отметить, что при загрузке каталога вышеуказанных файлов в путь поиска динамической библиотеки три метода одной схемы являются параллельными, пока реализован один, нет необходимости реализовывать все три метода. Когда был запущен проект моментального снимка, файл конфигурации / etc / profile был изменен, чтобы он действовал для всех пользователей. Чтобы узнать о конкретном процессе настройки, см. Настройка LD_LIBRARY_PATH.
2.4 Снимок устройства
3 Реализация исходного кода
3.1 Настроить LD_LIBRARY_PATH
3.1.1 Зависимость
3.1.2 Переменные среды
Если не включать / home / sqh / lib и / home / sqh / lib / HCNetSDKCom
необходимо настроить переменные среды.
Используйте пользователя root для изменения файла конфигурации / etc / profile
Добавьте в конце следующий контент:
Затем выполните команду
Указывает, что настройка переменной среды выполнена успешно
3.2 Изменение HCNetSDK.java
Файл интерфейса сопоставления JNA находится в каталоге src в LinuxJavaDemo. Файл HCNetSDK.java необходимо импортировать в проект. Автор импортировал пакет.
Необходимо настроить Native.loadLibrary («hcnetsdk», HCNetSDK.class), первый параметр, гарантирующий, что LD_LIBRARY_PATH настроен правильно и вступает в силу. В настоящее время вы можете использовать hcnetsdk в имени файла libhcnetsdk.so для завершения загрузки файла so.
3.2.1 Native.loadLibrary
Интерфейс HCNetSDK, определенный в файле HCNetSDK.java, унаследован от библиотеки. Если функция в библиотеке динамической компоновки основана на StdCallLibrary, например на библиотеке kernel32, она наследует StdCallLibrary и наследует библиотеку по умолчанию.
3.2.2 Внутреннее определение интерфейса
Интерфейсу нужна общедоступная статическая константа: через эту константу можно получить экземпляр этого интерфейса, чтобы можно было использовать метод интерфейса, то есть вызывается функция внешней dll / so.
3.2.3 Непроверенный метод
(В соответствии с именем папки, соответствующим классу com.sun.jna.Platform)
3.3 Кодирование для захвата времени
Поскольку платформа iSC не предоставляет функциональный интерфейс для непосредственного захвата изображения с определенной камеры, необходимо вызвать библиотеку динамической компоновки через Java, чтобы напрямую управлять устройством для захвата изображения.
В качестве примера рассмотрим подключение устройства. Блок-схема программы выглядит следующим образом:
Отключение устройства аналогично, поэтому повторяться не буду.
3.3.1 Screenshot.java Controller
Этот файл отвечает за получение запроса.При подключении устройства соответствующее устройство начинает захват изображения, а при разрыве соединения захват отменяется.
3.3.2 Класс выполнения асинхронной задачи AsyncTask
Этот тип в основном отвечает за асинхронный захват изображений и сохранение их в указанном каталоге, а затем сообщает третьей стороне о сопоставленных ресурсах изображений через HTTP-запросы.
3.3.3 Device Model
Класс Device используется для моделирования устройства камеры, которое содержит основные поведения, включая подключение устройства и отключение устройства. Реализация этого класса выглядит следующим образом:
3.3.4 WebMvcConfiger отображает изображения в классы реализации статических ресурсов
Таким образом, захваченные файлы могут быть сопоставлены со статическими ресурсами HTTP. Когда другие люди выполняют анализ алгоритма, им нужно только отправить почтовый запрос через httpclient, а затем передать URL-адрес изображения другой стороне, чтобы другая сторона могла использовать URL-адрес. Картинка переносится на локальный и затем программа анализа алгоритма продолжается, что выходит за рамки данной статьи и повторяться не будет.
4 резюме
В документе в основном описывается конкретный процесс использования Java для вызова файла so в среде Linux. Демонстрационная ссылка использует возможность захвата камеры. Общий процесс заключается в получении запросов REST через Spring Boot, запуске захвата изображения при подключении устройства и затем в захвате встречи. Сохраните серию изображений в локальный каталог, а затем сопоставьте каталог с ресурсами HTTP для тех, кому нужно использовать изображения для использования.
Особенно важно отметить, что алгоритм подробно описывает использование сетевого SDK устройства Hikvision и объясняет структуру каталогов сетевого SDK устройства на основе функции захвата камеры. Импортируйте проект Шаги, подробный процесс интеграции JNA. Надеюсь помочь сценариям с такими же требованиями к разработке.