Преглед изворни кода

更新新版算法小店推送接口

zhangdongming пре 2 година
родитељ
комит
50fbb465cd

+ 36 - 0
AnsjerPush/Config/aiConfig.py

@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+"""
+@Author : Rocky
+@Time : 2022/12/2 9:51
+@File :aiConfig.py
+"""
+
+# 标签
+LABEL_DICT = {
+    '1': ['Person', 'Human'],  # 人
+    '2': ['Pet', 'Dog', 'Canine', 'Animal', 'Puppy', 'Cat'],  # 动物
+    '3': ['Vehicle', 'Car', 'Transportation', 'Automobile', 'Bus'],  # 车
+    '4': ['Package', 'Carton', 'Cardboard', 'Package Delivery']  # 包裹
+}
+
+# AI识别标签
+AI_IDENTIFICATION_TAGS_DICT = {
+    '1': 'Person',
+    '2': 'Pet',
+    '3': 'Vehicle',
+    '4': 'Package'
+}
+
+DEVICE_EVENT_TYPE = {
+    1: 51,
+    2: 57,
+    4: 58,
+    16: 59,
+    8: 60,
+    32: 61,
+    64: 62,
+    128: 63,
+    256: 64,
+    512: 65,
+    1024: 66
+}

+ 2 - 1
Controller/DetectController.py

@@ -126,7 +126,8 @@ class NotificationView(View):
             }
             params = {'nickname': nickname, 'uid': uid, 'kwag_args': kwag_args, 'is_st': is_st,
                       'is_sys_msg': is_sys_msg, 'channel': channel, 'event_type': event_type, 'n_time': n_time,
-                      'electricity': '', 'bucket': bucket, 'app_push': '', 'storage_location': 1}
+                      'electricity': '', 'bucket': bucket, 'app_push': '', 'storage_location': 1, 'ai_type': 0,
+                      'dealings_type': 0}
             #  推送以及报警消息存库
             result = DevicePushService.save_msg_push(uid_set_push_list=uid_push_list, **params)
             if result['code_date'] is None:

+ 13 - 7
Controller/DetectControllerV2.py

@@ -7,7 +7,6 @@ import boto3
 import botocore
 import jpush as jpush
 from botocore import client
-from django.db import transaction
 from django.http import JsonResponse
 from django.views.generic.base import View
 from pyfcm import FCMNotification
@@ -55,6 +54,8 @@ class NotificationV2View(View):
         electricity = request_dict.get('electricity', '')
         time_token = request_dict.get('time_token', None)
         uid = request_dict.get('uid', None)
+        # 往来检测 1:来,2:离开
+        dealings_type = request_dict.get('dealingsType', 0)
 
         if not all([channel, n_time]):
             return JsonResponse(status=200, data={
@@ -96,7 +97,6 @@ class NotificationV2View(View):
                 logger.info('消息推送-uid_push 数据不存在')
                 return JsonResponse(status=200, data={'code': 176, 'msg': 'no uid_push data'})
             ai_type = uid_push_qs.first()['uid_set__ai_type']
-            event_type = self.get_combo_msg_type(ai_type, event_type)  # 解析消息事件类型看是否多类型组合
             # 将uid_set以及uid_push 转数组列表
             uid_set_push_list = DevicePushService.cache_uid_push(uid_push_qs)
             nickname = uid_set_push_list[0]['uid_set__nickname']
@@ -124,7 +124,8 @@ class NotificationV2View(View):
             params = {'nickname': nickname, 'uid': uid, 'kwag_args': kwag_args, 'is_st': is_st, 'region': region,
                       'is_sys_msg': is_sys_msg, 'channel': channel, 'event_type': event_type, 'n_time': n_time,
                       'electricity': electricity, 'bucket': bucket, 'aws_s3_client': aws_s3_client,
-                      'app_push': cache_app_push, 'storage_location': 2}
+                      'app_push': cache_app_push, 'storage_location': 2, 'ai_type': ai_type,
+                      'dealings_type': int(dealings_type)}
             logger.info('已创建s3对象,推送数据为:{}'.format(params))
             # APP消息推送与获取报警消息数据列表
             result = DevicePushService.save_msg_push(uid_set_push_list, **params)
@@ -147,21 +148,26 @@ class NotificationV2View(View):
     @classmethod
     def get_combo_msg_type(cls, ai_type, event_type):
         """
-        获取组合类型,ai_type == 47 支持算法小店,需判断组合类型
+        获取组合类型,需判断组合类型
         """
         logger = logging.getLogger('info')
         try:
-            if ai_type != 47:
+            if ai_type == 0:
                 return event_type
             logger.info('LOG------算法小店组合类型十进制值:{}'.format(event_type))
-            # 如触发一个事件,则匹配已用类型 1替换后变成51代表移动侦测 1:移动侦测,2:人形,4:车型,8:人脸
+            # 设备十进制算法说明:1:移动侦测,2:人形,4:车型,8:人脸,16:宠物,32:异响,64:区域闯入,
+            # 128:区域闯出,256:徘徊检测,512:长时间无人检测
             event_dict = {
                 1: 51,
                 2: 57,
                 4: 58,
                 16: 59,
                 8: 60,
-                32: 61
+                32: 61,
+                64: 62,
+                128: 63,
+                256: 64,
+                512: 65
             }
             event_val = event_dict.get(event_type, 0)
             # event_val == 0 没有匹配到单个值则认为组合类型

+ 21 - 0
Model/models.py

@@ -353,12 +353,15 @@ class EquipmentInfoMonday(models.Model):
                                                   u'702:摄像头休眠,703:摄像头唤醒,'
                                                   u'704:电量过低)')
     status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -384,12 +387,15 @@ class EquipmentInfoTuesday(models.Model):
                                                   u'702:摄像头休眠,703:摄像头唤醒,'
                                                   u'704:电量过低)')
     status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -415,12 +421,15 @@ class EquipmentInfoWednesday(models.Model):
                                                   u'702:摄像头休眠,703:摄像头唤醒,'
                                                   u'704:电量过低)')
     status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -446,12 +455,15 @@ class EquipmentInfoThursday(models.Model):
                                                   u'702:摄像头休眠,703:摄像头唤醒,'
                                                   u'704:电量过低)')
     status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -477,12 +489,15 @@ class EquipmentInfoFriday(models.Model):
                                                   u'702:摄像头休眠,703:摄像头唤醒,'
                                                   u'704:电量过低)')
     status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -508,12 +523,15 @@ class EquipmentInfoSaturday(models.Model):
                                                   u'702:摄像头休眠,703:摄像头唤醒,'
                                                   u'704:电量过低)')
     status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):
@@ -539,12 +557,15 @@ class EquipmentInfoSunday(models.Model):
                                                   u'702:摄像头休眠,703:摄像头唤醒,'
                                                   u'704:电量过低)')
     status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    answer_status = models.BooleanField(default=False, verbose_name='接听状态')  # 0: 未接听,1: 已接听
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
     storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
     border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    # (51,)表示一个事件标签。(51,57,)两个事件标签
+    event_tag = models.CharField(blank=True, default='', db_index=True, max_length=128, verbose_name=u'事件标签')
     add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
 
     def __str__(self):

+ 112 - 3
Service/DevicePushService.py

@@ -18,11 +18,13 @@ import jpush as jpush
 import requests
 from pyfcm import FCMNotification
 
+from AnsjerPush.Config.aiConfig import DEVICE_EVENT_TYPE
 from AnsjerPush.config import CONFIG_INFO, CONFIG_CN
 from AnsjerPush.config import JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, BASE_DIR, APNS_MODE, XMPUSH_CONFIG, OPPOPUSH_CONFIG
 from Model.models import UidPushModel, SysMsgModel, DeviceSharePermission, DeviceChannelUserSet, \
-    DeviceChannelUserPermission
+    DeviceChannelUserPermission, UidSetModel
 from Object.ETkObject import ETkObject
+from Object.RedisObject import RedisObject
 from Object.UidTokenObject import UidTokenObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
@@ -111,6 +113,7 @@ class DevicePushService:
         local_date_time = ''
         push_permission = True
         try:
+            params['event_tag'] = cls.get_event_tag(params['ai_type'], params['event_type'])
             for up in uid_set_push_list:
                 appBundleId = up['appBundleId']
                 token_val = up['token_val']
@@ -123,7 +126,8 @@ class DevicePushService:
                 # 发送内容
                 msg_text = cls.get_msg_text(channel=params['channel'], n_time=params['n_time'], lang=lang,
                                             tz=tz, event_type=params['event_type'],
-                                            electricity=params['electricity'])
+                                            electricity=params['electricity'], dealings_type=params['dealings_type'],
+                                            ai_type=params['ai_type'])
                 kwag_args['appBundleId'] = appBundleId
                 kwag_args['token_val'] = token_val
                 kwag_args['msg_title'] = msg_title
@@ -164,6 +168,58 @@ class DevicePushService:
         except Exception as e:
             LOGGING.info('推送消息或存表异常: errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
+    @classmethod
+    def get_event_tag(cls, ai_type, event_type):
+        """
+        获取事件标签
+        """
+        if ai_type > 0:
+            event_res = DEVICE_EVENT_TYPE.get(event_type, 0)
+            if event_res > 0:
+                return ',' + str(event_res) + ','
+            event_type = cls.dec_to_bin(event_type)
+            types = cls.get_combo_types(event_type)
+            res = ','.join(types) + ','
+            return ',' + res
+        return ',' + str(event_type) + ','
+
+    @classmethod
+    def get_combo_types(cls, event_type):
+        """
+        获取设备算法组合类型
+        51:移动侦测,52:传感器报警,53:影像遗失,54:PIR,55:门磁报警,56:外部发报,57:人型报警(提示:有人出现),58:车型,59:宠物,60:人脸,61:异响,
+        62:区域闯入,63:区域闯出,64:长时间无人检测,65:长时间无人检测,66:往来检测
+        0:代表空字符,702:摄像头休眠,703:摄像头唤醒,704:电量过低
+        AWS AI识别 1:人形,2:车型,3:宠物,4:包裹。云端AI类型
+        @param event_type:
+        @return:
+        """
+        try:
+            types = []
+            combo_types = list(DEVICE_EVENT_TYPE.values())
+            event_type = str(event_type)
+            len_type = len(event_type)
+            for i in range(0, len_type):
+                e_type = int(event_type[len_type - 1 - i])
+                if e_type == 1:
+                    types.append(str(combo_types[i]))
+            return types
+        except Exception as e:
+            print('推送错误异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return event_type
+
+    @staticmethod
+    def dec_to_bin(num):
+        """
+        十进制转二进制
+        """
+        result = ""
+        while num != 0:
+            ret = num % 2
+            num //= 2
+            result = str(ret) + result
+        return result
+
     @classmethod
     def send_app_msg_push(cls, push_type, **param):
         """
@@ -248,6 +304,8 @@ class DevicePushService:
             add_time=int(time.time()),
             storage_location=params['storage_location'],
             border_coords='',
+            event_tag=params['event_tag'],
+            answer_status=True if params['dealings_type'] == 1 else False
         )
 
     @staticmethod
@@ -258,7 +316,8 @@ class DevicePushService:
         return nickname
 
     @staticmethod
-    def get_msg_text(channel, n_time, lang, tz, event_type, electricity='', is_sys=0):
+    def get_msg_text(channel, n_time, lang, tz, event_type, electricity='', is_sys=0, dealings_type=0,
+                     ai_type=0):
         """
         获取消息文本
         """
@@ -273,6 +332,21 @@ class DevicePushService:
                 msg_type = '摄像头唤醒'
             elif etype == 606:
                 msg_type = '有人呼叫,请点击查看'
+            elif ai_type > 0:
+                if etype == 1024 and dealings_type == 1:
+                    msg_type = '有人进入'
+                elif etype == 1024 and dealings_type == 2:
+                    msg_type = '有人离开'
+                elif etype == 512:
+                    msg_type = '长时间无人出现'
+                elif etype == 256:
+                    msg_type = '有人徘徊'
+                elif etype == 128:
+                    msg_type = '区域离开'
+                elif etype == 64:
+                    msg_type = '区域闯入'
+                else:
+                    msg_type = ''
             else:
                 msg_type = ''
             if is_sys:
@@ -288,6 +362,21 @@ class DevicePushService:
                 msg_type = 'Camera wake'
             elif etype == 606:
                 msg_type = 'Someone is calling, please click to view'
+            elif ai_type > 0:
+                if etype == 1024 and int(dealings_type) == 1:
+                    msg_type = 'Someone entered'
+                elif etype == 1024 and int(dealings_type) == 2:
+                    msg_type = 'Someone left'
+                elif etype == 512:
+                    msg_type = 'No one shows up for a long time'
+                elif etype == 256:
+                    msg_type = 'Someone wanders'
+                elif etype == 128:
+                    msg_type = 'Area departure'
+                elif etype == 64:
+                    msg_type = 'Area break-in'
+                else:
+                    msg_type = ''
             else:
                 msg_type = ''
             if is_sys:
@@ -594,3 +683,23 @@ class DevicePushService:
         if not channel_permission_qs.exists():
             return False
         return True
+
+    @classmethod
+    def is_algorithm_type(cls, uid, event_type):
+        """
+        判断是否是算法类型 62、63、64、65、66不限制推送
+        """
+        uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ai_type')
+        if not uid_set_qs.exists():
+            return False
+        if uid_set_qs[0]['ai_type'] == 0:
+            return False
+        event_types = [62, 63, 64, 65, 66]
+        event_res = DEVICE_EVENT_TYPE.get(event_type, 0)
+        if event_res in event_types:
+            return True
+        event_types2 = cls.get_combo_types(event_type)
+        if not event_types2:
+            return False
+        c = [x for x in event_types if x in event_types2]
+        return True if c else False