كيف يساعد Userful المؤسسات على دمج الكاميرات الحرارية - الجزء 2
المزود الرائد للمركبات كخدمة (AVaaS)
في الجزء 1 من هذا بلوق ، وصفنا كيف الكاميرات الحرارية وغيرها من التكنولوجيات الجديدة ستصبح طبيعة ثانية في عالم ما بعد COVID. لهذا الجزء سوف نعرض مثال الإعداد.
استخدمنا خادم إدارة الفيديو (VMS) مع منصة برمجية تتكامل مع الكاميرات من مئات البائعين المختلفين - بما في ذلك الكاميرات التي تدعم التحليلات داخل الكاميرا و / أو التصوير الحراري. يمكن للمستخدمين تكوين الأحداث داخل النظام الأساسي VMS أو داخل محرك قاعدة الكاميرا الذكية. ويمكن أن تكون هذه الأحداث مشغلات لمسافة جسم (أي الكشف عن أجسام تبعد مسافة أقل من 1.5 متر بينها)، أو مشغلات عد الأجسام (أي اكتشاف عدد معين من الزوار داخل الموقع) أو مشغلات درجة الحرارة (أي الكشف عن الأشياء التي تزيد درجة حرارتها عن 38 درجة مئوية).
يمكن لأي من هذه الأحداث تشغيل استدعاء HTTP إلى واجهة برمجة تطبيقات المستخدم، مما يسمح لخادم المستخدم بتغيير المحتوى تلقائيا على جدار فيديو أو شاشة عرض فردية أو مجموعة من شاشات العرض. ما مدى بساطة نشر هذا؟ يستغرق ثلاث خطوات فقط:
- قم بتكوين الأحداث على محرك التحليلات المدمج في الكاميرا أو على منصة VMS المستندة إلى البرامج.
- تكوين وحدة إصغاء HTTP; لمراقبة مكالمات HTTP الواردة القادمة من أجهزة الاستشعار الخارجية.
- تكوين محول مصدر; مجموعة من إرشادات البرامج لواجهة برمجة تطبيقات المستخدم حول المحتوى الذي سيتم عرضه على شاشات مختلفة استنادا إلى المشغل الخارجي. يمكن أن يكون هذا تحذيرات نصية أو فيديو تعليمات أو موجز ويب للكاميرا المباشرة أو شريحة powerpoint أو أي نوع آخر من المحتوى يقرر العميل عرضه.
النتيجة النهائية (باستخدام Python) يحتوي على 26 أسطر من التعليمات البرمجية في التطبيق الرئيسي:
إذا __name__ == '__main__':
# ربط مأخذ التوصيل إلى المنفذ
جورب = socket.socket(socket.AF_INET، مأخذ. SOCK_STREAM)
server_address = ('192.168.1.100'، 8081)
الطباعة ('بدء التشغيل على ٪s المنفذ ٪s٪ server_address)
sock.bind(server_address)
# الاستماع لاتصالات واردة
sock.listen(1)
بينما صحيح:
# انتظر اتصال قادم من جهاز استشعار خارجي
الطباعة ('انتظار اتصال')
اتصال، client_address = sock.accept()
حاول:
الطباعة ('الاتصال من'، client_address)
# تلقي البيانات في قطع صغيرة وقراءتها
بينما صحيح:
البيانات = connection.recv(512)
إذا كانت البيانات:
# استخراج البيانات القادمة من مكالمة HTTP الكاميرا.
الكاميرا = استخراج (بيانات)
# تسجيل الدخول إلى خادم المستخدم لاسترداد ملف تعريف الارتباط المصادقة
session_header = تسجيل الدخول()
# تحديد ما هو قيد التشغيل حاليا على شاشات العرض
current_source = is_playing(session_header، "متجر الكلمة")
# تبديل المحتوى على شاشات العرض إلى مصدر التكوين المسبق (في
# هذا المثال رسالة تحذير HTML
switch_source(session_header،'متجر الكلمة'، 'HTML تحذير')
# انتظر لمدة 5 ثوان
time.sleep(5)
# التبديل مرة أخرى إلى المحتوى الذي كان يلعب أصلا
switch_source(session_header، "متجر الكلمة"، current_source)
#delete_source(session_header،'PIP_Dynamic')
time.sleep(5)
كسر
اخر:
طباعة (sys.stderr ، 'لا مزيد من البيانات من' ، client_address)
كسر
أخيرا:
# تنظيف الاتصال
الاتصال.إغلاق()
لذلك دعونا تشغيل من خلال هذه الخطوة المشروع خطوة بخطوة.
الخطوة 1: تكوين الأحداث علىعصر كامأو VMS
في هذا المثال نستخدم محرك التحليلات المتكامل لمنصة VMS التابعة لجهة خارجية التي تتلقى وتسجل يغذي الكاميرا من كاميرات متعددة. يمكن للمسؤولين تكوين أحداث مختلفة داخل مشغل قاعدة الكاميرا... يمكن أن يكون هذا مشغل حركة أو مشغل تحليلات يقوم من خلال برنامج VMS بتحليل موجزات الفيديو الواردة واكتشاف الأحداث لكل كاميرا ، على سبيل المثال:
- شخص يدخل منطقة معينة من النافذة المسجلة.
- شخص يعبر خطا افتراضيا من A-> B (عداد الزوار)
- شخص يعبر خطا افتراضيا من B -> A (عداد الزوار)
- شخص مع ارتفاع درجة حرارة الجسم (> 38 درجة)
كل حدث لديه دعوة إلى العمل; على سبيل المثال طلب HTTP إلى موزع الرسائل على الويب على 192.168.1.100:8081 مع محتويات الرسالة مثل اسم الكاميرا ومؤهلات الحدث. يتم عرض قاعدة حدث مثال في الصورة أدناه.
الخطوة 2: المستمع HTTP
خادم ويب HTTP هو عملية بسيطة تعمل على جهازك ويفعل شيئين بالضبط:
- الاستماع لطلبات http الواردة على عنوان مأخذ توصيل TCP محدد (عنوان IP ورقم منفذ)
- يعالج هذا الطلب ويعمل عند تلقي رسالة على عنوان مأخذ التوصيل.
In this example; our listener is listening to port 8081 on it's external Ethernet interface on IP address 192.168.1.100. If incoming connections are detected, the data received in the HTTP message is collected and processed under a <call to action> routine. This is the routine of instructing the Userful server what to do. Enter your text here ...
# ربط مأخذ التوصيل إلى المنفذ
مأخذ توصيل الاستيراد
جورب = socket.socket(socket.AF_INET، مأخذ. SOCK_STREAM)
server_address = ('192.168.1.100'، 8081)
الطباعة ('بدء التشغيل على ٪s المنفذ ٪s٪ server_address)
sock.bind(server_address)
# الاستماع لاتصالات واردة
sock.listen(1)
بينما صحيح:
# انتظر اتصال قادم من جهاز استشعار خارجي
الطباعة ('انتظار اتصال')
اتصال، client_address = sock.accept()
حاول:
الطباعة ('الاتصال من'، client_address)
# تلقي البيانات في قطع صغيرة وقراءتها
بينما صحيح:
البيانات = connection.recv(512)
إذا كانت البيانات:
اخر:
طباعة (sys.stderr ، 'لا مزيد من البيانات من' ، client_address)
كسر
أخيرا:
# تنظيف الاتصال
الاتصال.إغلاق()
قبل أن نبدل مصدرنا على الشاشات، نتحقق من المصدر الذي يتم تشغيله حاليا في منطقة (أي مجموعة من الشاشات). وبهذه الطريقة يمكننا العودة إلى المحتوى الأصلي بمجرد مرور الحدث. سوف يكشف الرمز أدناه عن اسم مصدر التشغيل الحالي (أي اسم مشغل اللافتات أو غير ذلك). عند استدعاء هذه الوظيفة، نقوم بتمرير ملف تعريف الارتباط الخاص بنا واسم المنطقة.
ديف is_playing (session_header، المنطقة):
get_url = api_url_base + '/api/المناطق/الاسم المستعار/' + المنطقة
الاستجابة = requests.get(url=get_url، الرؤوس=session_header)
إذا response.status_code == 200:
البيانات = الرد.المحتوى
dict = json.loads(بيانات)
المصدر = dict ['playingSourceId']
المصدر = get_source_info(session_header،sourceID)
طباعة(المصدرName، 'قيد التشغيل')
اخر:
طباعة (response.status_code)
مصدر الإرجاعName
ديف get_source_info (session_header، sourceID):
get_url = api_url_base + '/api/sources/' + معرف المصدر
الاستجابة = requests.get(url=get_url، الرؤوس=session_header)
إذا response.status_code == 200:
البيانات = الرد.المحتوى
dict = json.loads(بيانات)
اخر:
طباعة (response.status_code)
إرجاع dict ['المصدرName']
الآن بعد أن حددنا اسم المصدر الذي يلعب حاليا ، يمكننا تغيير مصدر تلك المنطقة:
switch_source (session_header، zone_name، source_name):
post_url = api_url_base + '/api/zones/byname/' + zone_name + '/switch?destinationSourceName=' + source_name
الاستجابة = requests.put(url=post_url، الرؤوس=session_header)
القيمة = خطأ
إذا response.status_code == 200:
البيانات = الرد.المحتوى
القيمة = json.loads(البيانات)["isPlaying"]
طباعة('المصدر تبديل')
اخر:
طباعة (response.status_code)
إرجاع القيمة
And that is it…. The <CALL TO ACTION> in our HTTP Listener becomes: (1) retrieve the AUTH cookie for the Userful Server, (2) Detect current source playing in a particular zone, (3) Switch the content on the displays to a 'HTML Warning' message stored on the local server (4) Pause for some time, (5) Switch back to the original source.
# تسجيل الدخول إلى خادم المستخدم لاسترداد ملف تعريف الارتباط المصادقة
session_header = تسجيل الدخول()
# تحديد ما هو قيد التشغيل حاليا على شاشات العرض
المصدر = is_playing(session_header، 'المنطقة-3')
# تبديل المحتوى على شاشات العرض إلى مصدر التكوين المسبق (في هذا المثال رسالة تحذير HTML
switch_source(session_header،'المنطقة-3'،'تحذير HTML')
# انتظر لمدة 5 ثوان
time.sleep(5)
# التبديل مرة أخرى إلى المحتوى الذي كان يلعب أصلا
switch_source(session_header، 'المنطقة-3'، المصدر)
#delete_source(session_header،'PIP_Dynamic')
time.sleep(5)
كسر
يمكننا توسيع هذا السيناريو من خلال النظر في الواقع في البيانات التي وردت في مكالمة HTTP القادمة من الكاميرا أو منصة VMS. يمكن أن تحتوي هذه البيانات على معلومات حول الكاميرا و/أو مصدر المشغل ويمكن استخدام هذه المعلومات لعرض أنواع مختلفة من المحتوى. فكر في موجزات الكاميرا المباشرة أو - إذا كانت الكاميرا تعد الأشخاص - عرض عدد العملاء في المتجر وعدد العملاء الإضافيين الذين يمكنهم دخول المتجر.
مع بساطة REST-API، يمكن للعملاء ومدمجي النظام نشر حلول بسيطة لبعض الميزات المذهلة تقنيا. لا حاجة لحلول نقطة من مختلف البائعين. مجرد القليل من الخيال جنبا إلى جنب مع مهارات الترميز محدودة يمكن أن تجلب لك بعيدا. وآمل أن نكون قد أثارنا اهتمامكم ونتطلع إلى الانخراط في مزيد من تبادل الأفكار والأمثلة.
مفيد
المزود الرائد للمركبات كخدمة (AVaaS)