كيف يساعد Userful المؤسسات على دمج الكاميرات الحرارية | الجزء 2

في الجزء الأول من هذه المدونة ، وصفنا كيف ستصبح الكاميرات الحرارية والتقنيات الجديدة الأخرى طبيعة ثانية في عالم ما بعد COVID. في هذا الجزء ، سنعرض مثالاً للإعداد.

استخدمنا خادم إدارة الفيديو (VMS) مع نظام أساسي برمجي يتكامل مع الكاميرات من مئات البائعين المختلفين - بما في ذلك الكاميرات التي تدعم التحليلات داخل الكاميرا و / أو التصوير الحراري. يمكن للمستخدمين تكوين الأحداث داخل منصة VMS أو داخل محرك قواعد الكاميرا الذكية. يمكن أن تكون هذه الأحداث محفزات لمسافات الأجسام (أي اكتشاف الأجسام بمسافة أقل من 1.5 متر بينها) ، أو محفزات عد الأجسام (أي اكتشاف عدد معين من الزوار داخل الموقع) أو محفزات درجة الحرارة (أي اكتشاف الأجسام ذات درجة الحرارة فوق 38 درجة مئوية).

يمكن لأي من هذه الأحداث تشغيل مكالمة HTTP إلى Userful API ، مما يسمح لخادم Userful بتغيير المحتوى تلقائيًا على حائط فيديو أو عرض فردي أو مجموعة من العروض. ما مدى سهولة نشر هذا؟ لا يستغرق الأمر سوى ثلاث خطوات:

  1. تكوين الأحداث على محرك التحليلات المدمج في الكاميرا أو على منصة VMS القائمة على البرامج.
  2. تكوين مستمع HTTP ؛ لمراقبة مكالمات HTTP الواردة من أجهزة استشعار خارجية.
  3. تكوين محول المصدر ؛ مجموعة من التعليمات البرمجية لـ Userful API حول المحتوى الذي سيتم عرضه على الشاشات المختلفة بناءً على المشغل الخارجي. يمكن أن يكون هذا تحذيرات نصية أو فيديو تعليمي أو خلاصات كاميرا مباشرة أو شريحة باوربوينت أو أي نوع آخر من المحتوى يقرر العميل عرضه.

النتيجة النهائية (باستخدام Python) تحتوي على 26 سطرًا من التعليمات البرمجية في التطبيق الرئيسي:

if __name__ == '__main__': # ربط المقبس بمنفذ المنفذ = socket.socket (socket.AF_INET، socket.SOCK_STREAM) server_address = ('192.168.1.100'، 8081) طباعة ('بدء التشغيل على٪ s port٪ s '٪ server_address) sock.bind (server_address) # استمع للاتصالات الواردة sock.listen (1) أثناء True: # انتظر اتصال قادم من طباعة مستشعر خارجي (' انتظار الاتصال ') ، client_address = sock.accept () try: print ('connection from'، client_address) # استقبل البيانات في أجزاء صغيرة واقرأها بينما True: data = connection.recv (512) إذا كانت البيانات: # استخرج البيانات الواردة من مكالمة HTTP للكاميرا. camera = extract (data) # تسجيل الدخول إلى Userful Server لاسترداد ملف تعريف ارتباط المصادقة session_header = login () # تحديد ما يتم تشغيله حاليًا على شاشات العرض current_source = is_playing (session_header، 'Shop-Floor') # تبديل المحتوى على شاشات العرض إلى التكوين المسبق المصدر (في # هذا المثال رسالة تحذير HTML switch_source (session_header، 'shop-Floor'، 'HTML Warning') # انتظر لمدة 5 ثوانٍ. النوم (5) # التبديل مرة أخرى إلى المحتوى الذي كان في الأصل يشغل switch_source (session_header ، 'Shop-Floor'، current_source) #delete_source (session_header، 'PIP_Dynamic') time.sleep (5) break else: print (sys.stderr، 'no more data from'، client_address) أخيرًا: # تنظيف اتصال الاتصال .أغلق()
 

لذلك دعونا نجري خطوة خطوة للمشروع.

الخطوة 1: تكوين الأحداث على الكاميراعصر أو VMS

في هذا المثال ، نستخدم محرك التحليلات المدمج لمنصة VMS التابعة لجهة خارجية التي تتلقى وتسجيل خلاصات الكاميرا من كاميرات متعددة. يمكن للمسؤولين تكوين أحداث مختلفة داخل محرك قاعدة الكاميرا ... يمكن أن يكون هذا مشغل حركة أو مشغل تحليلات حيث يقوم برنامج VMS بتحليل خلاصات الفيديو الواردة واكتشاف الأحداث لكل كاميرا ، على سبيل المثال:

  1. شخص يدخل منطقة معينة من النافذة المسجلة.
  2. شخص يعبر خطًا افتراضيًا من A -> B (عداد الزوار)
  3. شخص يعبر خطًا افتراضيًا من B -> A (عداد الزوار)
  4. ارتفاع درجة حرارة الجسم (> 38 درجة)

كل حدث له دعوة للعمل ؛ على سبيل المثال ، طلب HTTP إلى مستمع الويب الخاص بنا على 192.168.1.100:8081 مع محتويات الرسالة مثل اسم الكاميرا وتأهيل الحدث. يتم عرض قاعدة حدث مثال في الصورة أدناه.

الخطوة 2: مستمع HTTP

خادم الويب HTTP هو عملية بسيطة تعمل على جهازك وتقوم بأمرين بالضبط:

  1. يستمع لطلبات HTTP الواردة على عنوان مقبس TCP محدد (عنوان IP ورقم منفذ)
  2. يعالج هذا الطلب ويتصرف عند تلقي رسالة على عنوان مأخذ التوصيل.

في هذا المثال؛ يستمع مستمعنا إلى المنفذ 8081 على واجهة Ethernet الخارجية على عنوان IP 192.168.1.100. إذا تم الكشف عن الاتصالات الواردة ، فإن البيانات التي يتم تلقيها في رسالة HTTP يتم جمعها ومعالجتها بموجب إجراء <الحث على اتخاذ إجراء>. هذا هو الروتين الذي يرشد خادم Userful بما يجب فعله.أدخل النص هنا ...


# ربط المقبس بمقبس استيراد المنفذ sock = socket.socket (socket.AF_INET، socket.SOCK_STREAM) server_address = ('192.168.1.100'، 8081) طباعة ('بدء التشغيل على منفذ٪ s المنفذ٪ s'٪ server_address) .bind (server_address) # استمع إلى الاتصالات الواردة sock.listen (1) بينما True: # انتظر الاتصال القادم من اتصال طباعة مستشعر خارجي ('انتظار الاتصال') ، client_address = sock.accept () try: print ('connection from'، client_address) # تلقي البيانات في أجزاء صغيرة وقراءتها بينما True: data = connection.recv (512) إذا كانت البيانات: <CALL TO ACTION> آخر: طباعة (sys.stderr ، 'لا مزيد من البيانات من '، client_address) أخيرًا: # تنظيف اتصال الاتصال. close ()
 

قبل تبديل مصدرنا على الشاشات ، نتحقق من المصدر الذي يتم تشغيله حاليًا في منطقة (أي مجموعة من الشاشات). بهذه الطريقة يمكننا العودة إلى المحتوى الأصلي بمجرد مرور الحدث. سيكشف الرمز أدناه اسم مصدر التشغيل الحالي (أي اسم لاعب اللافتات ، أو غيره). عند استدعاء هذه الوظيفة ، نمرر ملف تعريف ارتباط المصادقة واسم المنطقة.

def is_playing (session_header، zone): get_url = api_url_base + '/ api / Regions / byname /' + zone response = customers.get (url = get_url، headers = session_header) إذا response.status_code == 200: data = response.content dict = json.loads (data) sourceID = dict ['playSourceId'] sourceName = get_source_info (session_header، sourceID) print (sourceName، 'is play') other: print (response.status_code) return sourceName def get_source_info (session_header، sourceID) : get_url = api_url_base + '/ api / sources /' + sourceID response = طلبات.get (url = get_url، headers = session_header) إذا response.status_code == 200: data = response.content dict = json.loads (data) آخر : print (response.status_code) ترجع الإملاء ['sourceName'] 

الآن بعد أن حددنا اسم المصدر الذي يتم تشغيله حاليًا ، يمكننا تغيير مصدر هذه المنطقة:

def switch_source (session_header، zone_name، source_name): post_url = api_url_base + '/ api / Regions / byname /' + zone_name + '/ switch؟ destinationSourceName =' + source_name response = طلبات.put (url = post_url، headers = session_header) = False if response.status_code == 200: data = response.content value = json.loads (data) ["isPlaying"] print ('Source Switched') other: print (response.status_code) value return 

وهذا هو عليه…. يصبح <CALL TO ACTION> في مستمع HTTP الخاص بنا: (1) استرداد ملف تعريف ارتباط AUTH لخادم المستخدم ، (2) اكتشاف تشغيل المصدر الحالي في منطقة معينة ، (3) تبديل المحتوى على شاشات العرض إلى "تحذير HTML" 'المخزنة على الخادم المحلي (4) إيقاف مؤقت لبعض الوقت ، (5) التبديل مرة أخرى إلى المصدر الأصلي.

# تسجيل الدخول إلى Userful Server لاسترداد ملف تعريف ارتباط المصادقة session_header = login () # تحديد ما يتم تشغيله حاليًا على مصدر العرض = is_playing (session_header، 'Zone-3') # تبديل المحتوى على شاشات العرض إلى مصدر التكوين المسبق (في هذا المثال رسالة تحذير HTML switch_source (session_header، 'Zone-3'، 'HTML Warning') # انتظر لمدة 5 ثوانٍ. النوم (5) # التبديل إلى المحتوى الذي كان يشغل في الأصل switch_source (session_header، 'Zone-3'، source ) #delete_source (session_header، 'PIP_Dynamic') time.sleep (5) break 

يمكننا توسيع هذا النص البرمجي من خلال النظر فعليًا إلى البيانات التي تم تلقيها في مكالمة HTTP الواردة من الكاميرا أو النظام الأساسي VMS. يمكن أن تحتوي هذه البيانات على معلومات حول الكاميرا و / أو مصدر الزناد ويمكن استخدام هذه المعلومات لعرض أنواع مختلفة من المحتوى. فكر في خلاصات الكاميرا الحية أو - إذا كانت الكاميرا تحسب الأشخاص - تعرض عدد العملاء في المتجر وعدد العملاء الإضافيين الذين يمكنهم دخول المتجر.

مع بساطة REST-API ، يمكن للعملاء ومتكاملي النظام نشر حلول بسيطة لبعض الميزات المذهلة تقنيًا. لا حاجة إلى حلول نقطة من البائعين المختلفين. فقط القليل من الخيال جنبًا إلى جنب مع مهارات الترميز المحدودة يمكن أن يجعلك بعيدًا. آمل أن أثارنا اهتمامك ونتطلع إلى الانخراط في مزيد من تبادل الأفكار والأمثلة.


روبرت Huijsmans

نائب الرئيس لحلول الهندسة

شركة مفيدة ، INC.

تأثير COVID-19 على العمليات التجارية
كيف يساعد Userful المؤسسات على دمج ...
تم قفل التعليق على هذا المنشور من قبل المشرف.

التعليقات

بقبولك ، ستتمكن من الوصول إلى خدمة مقدمة من طرف ثالث خارجي إلى https://userful.com/