دوربین Avigilon جدید

 وقتی دوربین Avigilon اومد هیچ SDKیی همراهش نبود. نیاز بود motion رو از خود دوربین بگیریم و برای ارتباط برقرار کردن با اون تنها راه، استفاده از پروتکل Onvif بود. تقریباً یک ماه وقت گذاشتم و کلاس مستقلی برای ارتباط برقرار کردن با این دوربین نوشتم. کلاً چهار راه برای دریافت notification messageها از دوربین در دسته. از جمله اونها، چیزی که ما لازم داریم، دریافت وضعیت حرکت (motion state) است:

  1. pull point
  2. subscription policy
  3. pausable subscription manager interface
  4. بعضی از دوربینها موقعی که دارند تصویر رو به دست میدند یک data stream هم علاوه بر video stream و احیاناً audio stream حاوی اطلاعات حرکت و غیره رو با اون همراه میکنند.
در مورد این دوربین روش دوم پیاده شده بود و هیچ کدی که بتونه چنین ارتباطی رو با دوربین برقرار کنه زده نشده بود. در کلاس avigilon camera این کد آماده شد و از اون به بعد تونستیم از این دوربین motion رو هم بگیریم. طبعاً اطلاعات مربوط به video stream url هم به صورت hard code در این کلاس قرار گرفت.

گذشت تا نوبت به دوربین KDT رسید. این دوربین برای ارسال اطلاعات (meta data) از روش اول استفاده میکنه. برای این دوربین هم کد مستقلی در کلاسی مربوط به این دوربین زدم و کلاسش رو به به نما اضافه کردم.

تا اینجای کار مشکلی نبود. چون یک مدل Avigilon اضافه شد و یک مدل KDT و کاری هم به کار هم نداشتند. اما دوربین سومی از نوع Hikvision اومد که اون هم از روش اول برای ارسال meta data استفاده میکرد. منتها یک جای کار ایراد داشت. تا قبل از Avigilon دوربینی با این برند در به نما معرفی نشده بود. تا قبل از KDT هم همینطور. اما Hikvision معمولی (غیر Onvif support) رو در به نما داشتیم. وقتی تو database این برند رو پیدا میکرد میرفت و طبق الگوهای تعریف شده در جداول MonitorPresets و CameraModels عمل میکرد و اون رو سعی میکرد از این طریق بشناسه. نمیرفت سراغ Onvif و سعی کنه از کلاس onvif camera برای این دوربین استفاده کنه. در عین حال مدلی از Hikvision به دستمون رسیده بود و قرار بود به به نما اضافه بشه که تو لیست دوربینهای شناخته شده به نما یعنی در این دو جدول نبود. پس دچار یک دوگانگی میشدیم.

همونطور که شاید قبلاً هم گفته‌ام برای این دوربین خاص یک branch جدا درست کردم که موقتاً اون رو در database اضافه کنه و براش یک کلاس جدا هم درست کردم. یه خرده با ساختار به نما مغایرت پیدا کرد. راه درستش این نبود. اما برای اینکه مشکل سریعتر حل بشه این راه حل موقتی خوبی بود. اما لازم بود این دوربین از database حذف بشه و به عنوان یک دوربین onvif مورد شناسایی قرار بگیره و پارامترهای اون از طریق onvif به دست بیاد. این رو در برنامه گذاشته بودم، تا اینکه دوربین دیگری از نوع Avigilon درخواست داده شد که به به نما اضافه بشه. وقتی بررسی کردم دیدم هیچکدوم از روشهای اول تا چهارم رو پشتیبانی نمیکنه، مگر روش سوم رو. خوب، حالا این کارها رو در پیش دارم:

  1. کلاس onvif camera تنها روش چهارم رو برای دریافت اطلاعات مربوط به حرکت پیاده کرده. پس لازمه کلاس کاملتری بشه تا روشهایی که در مورد دوربینهای Avigilon قبلی و KDT، یعنی روشهای اول و دوم پیاده کرده‌ام و کدش رو زده‌ام رو هم شامل باشه. همچنین این کلاس باید با queryیی که به دوربین میزنه enumerate کنه که دوربین از کدوم روش میتونه اطلاعات مربوط به حرکت رو به دست ما برسونه. این اطلاعات توسط وب سرویس GetCapabilities قابل به دست اومدنه.
  2. توسط همین وب سرویس لازمه urlی که به عنوان end point برای وب سرویسهای بخش events مطرحند رو به دست بیاریم. این الان در توابعی از onvif_event.cpp که توسط دو کلاس KDT camera و Avigilon camera مورد استفاده قرار میگیرند به صورت hard code قرار گرفته. بعضی وقتها Events هست و بعضی وقتها event_service. در حالی که این وب سرویس به ما میگه که کدوم درسته. الان چون مشکلی پیش نیومده داره درست کار میکنه. اما اگر یه دوربینی بیارند که فرق داشته باشه داستان میشه. این رو باید اصلاحش کنم.
  3. mThis در دو کلاس مذکور به صورت static تعریف شده و این اشتباهه. اگر دو دوربین Avigilon یا KDT داشته باشیم خراب کار خواهد کرد. لازمه کلاس httplib::Server اصلاح بشه که بتونه یک void * رو به عنوان user data بگیره و به توابع call backی که معرفی میشن اون رو هم پاس کنه. اونوقت this رو موقع construction به constructor این کلاس بدیم که بدونه باید وضعیت حرکت رو در کدوم instance به روز کنه.
  4. خوب که روشهای اول، دوم و چهارم رو به کلاس onvif camera منتقل کردیم و تست شد و درست کار کرد، تازه به این نقطه میرسیم که از این به بعد این کلاس میتونه برای اضافه کردن همه دوربینهای جدیدی که از این روشها برای ارسال اطلاعات مربوط به حرکت به به نما استفاده میکنند مورد استفاده قرار بگیره. این گام بلندی است که دست من رو باز میکنه که دیگه لازم نباشه برای هر دوربین جدیدی که معرفی میشه کلاس جدیدی بنویسم. طبعاً به خاطر تفاوتهای مختصری که دوربینها با هم دارند لازم خواهد بود در این کلاس یا توابعی از onvif_event.cpp که این کلاس از اونها استفاده میکنه تغییراتی صورت بگیره. اما دیگه کلاسهای متفاوت و مستقل از هم که هم زمان زیادی خواهد گرفت و هم باعث ایجاد کدهای مشترک خواهد شد رو نخواهیم داشت.
  5. بعد که این کار هم انجام شد تازه وقت اون میشه که برم با روش سوم آشنا بشم و ببینم اصولاً این پروتکل چطور عمل میکنه و با دوربین در این روش چطور باید صحبت کرد. طبعاً این روش رو هم باید به همین کلاس onvif camera اضافه کنم.
هر کدوم از این مراحل خودش یه کار جداگانه است که لازمه روشون وقت بذارم و به نتیجه برسونم.
من الله التوفیق

نظرات

پست‌های معروف از این وبلاگ

مقدمه

تغییرات داده شده در database در ارتباط با دوربین Hikvision DS-2CD1123G0E-I