소스 검색

修改网关推送接口

locky 2 년 전
부모
커밋
b3a906b866
1개의 변경된 파일320개의 추가작업 그리고 132개의 파일을 삭제
  1. 320 132
      Controller/gatewayController.py

+ 320 - 132
Controller/gatewayController.py

@@ -10,15 +10,14 @@ import time
 from django.views.generic.base import View
 
 from AnsjerPush.Config.gatewaySensorConfig import SENSOR_TYPE, EVENT_TYPE
-from Model.models import SensorRecord, GatewaySubDevice, GatewayPush, Device_Info, SceneLog, SmartScene
+from Model.models import SensorRecord, GatewaySubDevice, GatewayPush, Device_Info, SceneLog, SmartScene, CountryModel
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.HuaweiPushService.HuaweiPushService import HuaweiPushObject
 from Service.PushService import PushObject
-
-LOGGER = logging.getLogger('info')
+from AnsjerPush.config import LOGGER
 
 
 class GatewayView(View):
@@ -43,47 +42,54 @@ class GatewayView(View):
         else:
             return response.json(414)
 
-    @staticmethod
-    def gateway_push(request_dict, response):
+    @classmethod
+    def gateway_push(cls, request_dict, response):
         """
         网关推送
         @param request_dict: 请求参数
         @request_dict serial_number: 序列号
+        @request_dict dev_class: 设备大类
+        @request_dict dev_type: 设备小类
         @request_dict ieee_addr: 长地址
-        @request_dict src_addr: 短地址
-        @request_dict sensor_type: 传感器类型
-        @request_dict event_type: 事件类型
-        @request_dict alarm: 消息内容
-        @request_dict defense: 防御状态,0:撤防,1:防御
-        @request_dict sensor_status: 拆动状态,拆动时传参
+        @request_dict param: 事件参数
+        @request_dict defense: 防御状态,0:撤防,1:布防
         @param response: 响应对象
         @return: response
         """
-        logger = logging.getLogger('info')
+        LOGGER.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
         serial_number = request_dict.get('serial_number', None)
+        dev_class = int(request_dict.get('dev_class', None))
+        dev_type = int(request_dict.get('dev_type', None))
         ieee_addr = request_dict.get('ieee_addr', None)
-        src_addr = request_dict.get('src_addr', None)
-        sensor_type = int(request_dict.get('sensor_type', None))
-        event_type = int(request_dict.get('event_type', None))
-        alarm = request_dict.get('alarm', None)
+        param = eval(request_dict.get('param', None))
         defense = int(request_dict.get('defense', None))
-        sensor_status = request_dict.get('sensor_status', None)
-        logger.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
-        if not all([serial_number, ieee_addr, src_addr, sensor_type, event_type, alarm]):
+
+        if not all([serial_number, dev_class, dev_type, ieee_addr, param]):
             return response.json(444)
 
         n_time = int(time.time())
 
         try:
+            # 根据dev_class和dev_type确定sensor_type,param确定event_type列表
+            sensor_type, event_type_list = cls.confirm_sensor_type_and_event_type(dev_class, dev_type, param)
+
             # 查询子设备表id
             gateway_sub_device_qs = GatewaySubDevice.objects.filter(device__serial_number=serial_number,
-                                                                    device_type=sensor_type, ieee_addr=ieee_addr,
-                                                                    src_addr=src_addr).values('id', 'nickname')
+                                                                    device_type=sensor_type, ieee_addr=ieee_addr).\
+                values('id', 'nickname', 'device__userID__region_country')
             if not gateway_sub_device_qs.exists():
                 return response.json(173)
-            else:
-                gateway_sub_device_id = gateway_sub_device_qs[0]['id']
-                nickname = gateway_sub_device_qs[0]['nickname']
+
+            country_id = gateway_sub_device_qs[0]['device__userID__region_country']
+            lang = cls.confirm_lang(country_id)
+            event_type_and_alarm_dict = cls.get_event_type_and_alarm_dict(lang, event_type_list)
+            gateway_sub_device_id = gateway_sub_device_qs[0]['id']
+            nickname = gateway_sub_device_qs[0]['nickname']
+
+            for_times = 0
+            dict_len = len(event_type_and_alarm_dict)
+            for event_type, alarm in event_type_and_alarm_dict.items():
+                for_times += 1
                 sensor_record_dict = {
                     'gateway_sub_device_id': gateway_sub_device_id,
                     'alarm': alarm,
@@ -101,107 +107,279 @@ class GatewayView(View):
 
                 SensorRecord.objects.create(**sensor_record_dict)
 
-                # (门磁,烟雾,人体)传感器被拆动/拆动恢复,修改拆动状态
-                if sensor_status:
-                    if sensor_type != SENSOR_TYPE['smart_button']:  # 智能按钮不更新
-                        gateway_sub_device_qs.update(is_tampered=1)
-                elif sensor_type == SENSOR_TYPE['door_magnet'] or sensor_type == SENSOR_TYPE['smoke_sensor'] or \
-                        sensor_type == SENSOR_TYPE['body_sensor']:
+                # 门磁传感器被拆动/拆动恢复,修改拆动状态
+                if event_type == 2152:
+                    gateway_sub_device_qs.update(is_tampered=1)
+                elif event_type == 2156:
                     gateway_sub_device_qs.update(is_tampered=0)
 
-            # 撤防状态不推送
-            if defense == 0:
-                return response.json(0)
+                # 撤防状态,且完成遍历,不推送
+                if defense == 0 and for_times == dict_len:
+                    return response.json(0)
 
-            device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('userID_id')
-            if not device_info_qs.exists():
-                return response.json(173)
+                device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('userID_id')
+                if not device_info_qs.exists():
+                    return response.json(173)
 
-            equipment_info_list = []
-
-            for device_info in device_info_qs:
-                user_id = device_info['userID_id']
-
-                # 组织存储数据
-                local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
-                equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
-                    local_date_time,
-                    add_time=n_time,
-                    event_time=n_time,
-                    receive_time=n_time,
-                    device_uid=serial_number,
-                    device_nick_name=nickname,
-                    alarm=alarm,
-                    event_type=event_type,
-                    device_user_id=user_id,
-                ))
-                if equipment_info_list:
-                    # 根据日期获得星期几
-                    week = LocalDateTimeUtil.date_to_week(local_date_time)
-                    EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
-
-                # 查询推送配置数据
-                gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
-                    values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang', 'm_code',
-                           'tz')
-                if not gateway_push_qs.exists():
-                    continue
-
-                kwargs = {
-                    'n_time': n_time,
-                    'event_type': event_type,
-                    'nickname': nickname,
-                }
+                equipment_info_list = []
+
+                # 推送到每个添加了网关的账号
+                for device_info in device_info_qs:
+                    user_id = device_info['userID_id']
 
-                # 推送到每台登录账号的手机
-                for gateway_push in gateway_push_qs:
-                    app_bundle_id = gateway_push['app_bundle_id']
-                    push_type = gateway_push['push_type']
-                    token_val = gateway_push['token_val']
-                    lang = gateway_push['lang']
-                    tz = gateway_push['tz'] if gateway_push['tz'] else 0
-
-                    # 获取推送所需数据
-                    msg_title = PushObject.get_msg_title(nickname)
-                    msg_text = PushObject.get_gateway_msg_text(n_time, tz, lang, alarm)
-
-                    kwargs['msg_title'] = msg_title
-                    kwargs['msg_text'] = msg_text
-                    kwargs['app_bundle_id'] = app_bundle_id
-                    kwargs['token_val'] = token_val
-
-                    try:
-                        # 推送消息
-                        if push_type == 0:  # ios apns
-                            PushObject.ios_apns_push(**kwargs)
-                        elif push_type == 1:  # android gcm
-                            PushObject.android_fcm_push(**kwargs)
-                        elif push_type == 2:  # android 极光推送
-                            PushObject.android_jpush(**kwargs)
-                        elif push_type == 3:
-                            huawei_push_object = HuaweiPushObject()
-                            huawei_push_object.send_push_notify_message(**kwargs)
-                        elif push_type == 4:  # android 小米推送
-                            channel_id = 104551
-                            PushObject.android_xmpush(channel_id=channel_id, **kwargs)
-                        elif push_type == 5:  # android vivo推送
-                            PushObject.android_vivopush(**kwargs)
-                        elif push_type == 6:  # android oppo推送
-                            channel_id = 'DEVICE_REMINDER'
-                            PushObject.android_oppopush(channel_id=channel_id, **kwargs)
-                        elif push_type == 7:  # android 魅族推送
-                            PushObject.android_meizupush(**kwargs)
-                    except Exception as e:
-                        logger.info('网关推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                    # 组织存储数据
+                    local_date_time = CommonService.get_now_time_str(n_time=n_time, tz=0, lang='cn')[:10]
+                    equipment_info_list.append(EquipmentInfoService.get_equipment_info_obj(
+                        local_date_time,
+                        add_time=n_time,
+                        event_time=n_time,
+                        receive_time=n_time,
+                        device_uid=serial_number,
+                        device_nick_name=nickname,
+                        alarm=alarm,
+                        event_type=event_type,
+                        device_user_id=user_id,
+                    ))
+                    if equipment_info_list:
+                        # 根据日期获得星期几
+                        week = LocalDateTimeUtil.date_to_week(local_date_time)
+                        EquipmentInfoService.equipment_info_bulk_create(week, equipment_info_list)
+
+                    # 查询推送配置数据
+                    gateway_push_qs = GatewayPush.objects.filter(user_id=user_id, logout=False). \
+                        values('user_id', 'app_bundle_id', 'app_type', 'push_type', 'token_val', 'm_code', 'lang',
+                               'm_code', 'tz')
+                    if not gateway_push_qs.exists():
                         continue
 
+                    kwargs = {
+                        'n_time': n_time,
+                        'event_type': event_type,
+                        'nickname': nickname,
+                    }
+
+                    # 推送到每台登录账号的手机
+                    for gateway_push in gateway_push_qs:
+                        app_bundle_id = gateway_push['app_bundle_id']
+                        push_type = gateway_push['push_type']
+                        token_val = gateway_push['token_val']
+                        lang = gateway_push['lang']
+                        tz = gateway_push['tz'] if gateway_push['tz'] else 0
+
+                        # 获取推送所需数据
+                        msg_title = PushObject.get_msg_title(nickname)
+                        msg_text = PushObject.get_gateway_msg_text(n_time, tz, lang, alarm)
+
+                        kwargs['msg_title'] = msg_title
+                        kwargs['msg_text'] = msg_text
+                        kwargs['app_bundle_id'] = app_bundle_id
+                        kwargs['token_val'] = token_val
+
+                        try:
+                            # 推送消息
+                            cls.push_msg(push_type, **kwargs)
+                        except Exception as e:
+                            LOGGER.info('网关推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+                            continue
+
             return response.json(0)
         except Exception as e:
-            logger.info('---网关推送接口异常--- {}'.format(repr(e)))
+            LOGGER.info('---网关推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))
 
     @staticmethod
-    def scene_log_push(request_dict, response):
+    def confirm_sensor_type_and_event_type(dev_class, dev_type, param):
+        """
+        根据dev_class和dev_type确定sensor_type,param确定event_type
+        @param dev_class: 设备大类(开关量传感器、温湿度、灯)
+        @param dev_type: 设备小类(传感器类型、灯类型、温湿度类型)
+        @param param: 事件参数
+        @return: sensor_type, event_type_list
+        """
+        sensor_type, event_type_list = 0, []
+        if dev_class == 0:      # 灯,待定
+            sensor_type = 0
+        elif dev_class == 1:    # 网关
+            sensor_type = 200
+        elif dev_class == 2:    # 开关类传感器
+            if dev_type == 13:  # 人体红外
+                sensor_type = 219
+            elif dev_type == 22:    # 门磁
+                sensor_type = 215
+            elif dev_type == 42:    # 水浸
+                sensor_type = 217
+            elif dev_type == 44:    # 智能按钮
+                sensor_type = 216
+        elif dev_class == 3:    # 测量类传感器
+            if dev_type == 1:   # 温湿度
+                sensor_type = 220
+            elif dev_type == 2:    # 亮度,待定
+                sensor_type = 0
+        elif dev_class == 5:  # 智能锁
+            if dev_type == 1:   # 门锁,待定
+                sensor_type = 0
+        elif dev_class == 6:  # 电机类设备
+            if dev_type == 1:   # 窗帘,待定
+                sensor_type = 0
+
+        if sensor_type == 215:  # 门磁
+            if param['alarm'] == 1:     # 门磁开
+                event_type_list.append(2150)
+            elif param['alarm'] == 0:     # 门磁关
+                event_type_list.append(2151)
+            if param['tamper'] == 1:    # 拆动
+                event_type_list.append(2152)
+            if param['tamper'] == 0:    # 拆动恢复
+                event_type_list.append(2156)
+            if param['battery'] == 1:    # 低电量
+                event_type_list.append(2153)
+
+        elif sensor_type == 216:    # 智能按钮
+            if param['alarm'] == 1:     # 按下
+                event_type_list.append(2160)
+            if param['smrt_btn'] == 1:     # 单击
+                event_type_list.append(2161)
+            elif param['smrt_btn'] == 2:     # 双击
+                event_type_list.append(2162)
+            elif param['smrt_btn'] == 3:     # 三击
+                event_type_list.append(2163)
+            if param['battery'] == 1:     # 低电量
+                event_type_list.append(2164)
+
+        elif sensor_type == 217:    # 水浸
+            if param['alarm'] == 1:     # 水浸触发
+                event_type_list.append(2170)
+            elif param['alarm'] == 0:     # 水浸恢复
+                event_type_list.append(2171)
+            if param['battery'] == 1:    # 低电量
+                event_type_list.append(2172)
+
+        elif sensor_type == 219:    # 人体红外
+            if param['alarm'] == 1:     # 有人移动
+                event_type_list.append(2190)
+            elif param['alarm'] == 0:     # 无人移动
+                event_type_list.append(2191)
+            if param['battery'] == 1:    # 低电量
+                event_type_list.append(2193)
+
+        return sensor_type, event_type_list
+
+    @staticmethod
+    def confirm_lang(country_id):
+        """
+        根据country_id确定语言
+        @param country_id: 国家id
+        @return lang: 语言
+        """
+        country_qs = CountryModel.objects.filter(id=country_id).values('country_code')
+        if not country_qs.exists():
+            lang = 'NA'
+        else:
+            lang = country_qs[0]['country_code']
+        return lang
+
+    @staticmethod
+    def get_event_type_and_alarm_dict(lang, event_type_list):
+        """
+        获取事件类型和提示字典数据
+        @param lang: 语言
+        @param event_type_list: 事件类型列表
+        @return event_type_and_alarm_dict: 事件类型字典
+        """
+        alarm = ''
+        event_type_and_alarm_dict = {}
+        if lang == 'CN':
+            for event_type in event_type_list:
+                # 门磁
+                if event_type == 2150:
+                    alarm = '门磁开'
+                elif event_type == 2151:
+                    alarm = '门磁关'
+                elif event_type == 2152:
+                    alarm = '被拆动'
+                elif event_type == 2156:
+                    alarm = '拆动恢复'
+
+                # 智能按钮
+                elif event_type == 2160:
+                    alarm = '紧急按钮按下'
+                elif event_type == 2161:
+                    alarm = '按钮已按1下'
+                elif event_type == 2162:
+                    alarm = '按钮已按2下'
+                elif event_type == 2163:
+                    alarm = '按钮已按3下'
+
+                # 水浸
+                elif event_type == 2170:
+                    alarm = '水浸触发'
+                elif event_type == 2171:
+                    alarm = '水浸恢复'
+
+                # 烟雾
+                elif event_type == 2180:
+                    alarm = '烟雾触发'
+                elif event_type == 2181:
+                    alarm = '烟雾恢复'
+
+                # 人体红外
+                elif event_type == 2190:
+                    alarm = '有人移动'
+                elif event_type == 2191:
+                    alarm = '无人移动'
+
+                # 低电量
+                elif event_type in (2153, 2164, 2172, 2182, 2193):
+                    alarm = '低电量'
+                event_type_and_alarm_dict[event_type] = alarm
+        else:
+            for event_type in event_type_list:
+                # 门磁
+                if event_type == 2150:
+                    alarm = 'Door magnetic opening'
+                elif event_type == 2151:
+                    alarm = 'Door magnetic closing'
+                elif event_type == 2152:
+                    alarm = 'Be dismantled'
+                elif event_type == 2156:
+                    alarm = 'Dismantling recovery'
+
+                # 智能按钮
+                elif event_type == 2160:
+                    alarm = 'Emergency button pressed'
+                elif event_type == 2161:
+                    alarm = 'Button pressed once'
+                elif event_type == 2162:
+                    alarm = 'The button has been pressed twice'
+                elif event_type == 2163:
+                    alarm = 'The button has been pressed 3 times'
+
+                # 水浸
+                elif event_type == 2170:
+                    alarm = 'Water immersion trigger'
+                elif event_type == 2171:
+                    alarm = 'Water immersion recovery'
+
+                # 烟雾
+                elif event_type == 2180:
+                    alarm = 'Smoke triggering'
+                elif event_type == 2181:
+                    alarm = 'Smoke recovery'
+
+                # 人体红外
+                elif event_type == 2190:
+                    alarm = 'Someone moving'
+                elif event_type == 2191:
+                    alarm = 'Unmanned movement'
+
+                # 低电量
+                elif event_type in (2153, 2164, 2172, 2182, 2193):
+                    alarm = 'LOW BATTERY'
+                event_type_and_alarm_dict[event_type] = alarm
+        return event_type_and_alarm_dict
+
+    @classmethod
+    def scene_log_push(cls, request_dict, response):
         """
         网关智能场景日志推送
         @param request_dict: 请求参数
@@ -275,25 +453,7 @@ class GatewayView(View):
 
                         try:
                             # 推送消息
-                            if push_type == 0:  # ios apns
-                                PushObject.ios_apns_push(**kwargs)
-                            elif push_type == 1:  # android gcm
-                                PushObject.android_fcm_push(**kwargs)
-                            elif push_type == 2:  # android 极光推送
-                                PushObject.android_jpush(**kwargs)
-                            elif push_type == 3:
-                                huawei_push_object = HuaweiPushObject()
-                                huawei_push_object.send_push_notify_message(**kwargs)
-                            elif push_type == 4:  # android 小米推送
-                                channel_id = 104551
-                                PushObject.android_xmpush(channel_id=channel_id, **kwargs)
-                            elif push_type == 5:  # android vivo推送
-                                PushObject.android_vivopush(**kwargs)
-                            elif push_type == 6:  # android oppo推送
-                                channel_id = 'DEVICE_REMINDER'
-                                PushObject.android_oppopush(channel_id=channel_id, **kwargs)
-                            elif push_type == 7:  # android 魅族推送
-                                PushObject.android_meizupush(**kwargs)
+                            cls.push_msg(push_type, **kwargs)
                         except Exception as e:
                             logger.info('场景日志推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
                             continue
@@ -302,6 +462,34 @@ class GatewayView(View):
             logger.info('---场景日志推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))
 
+    @staticmethod
+    def push_msg(push_type, **kwargs):
+        """
+        发送推送消息
+        @param push_type: 推送类型
+        @param kwargs: 推送参数
+        @return: None
+        """
+        if push_type == 0:  # ios apns
+            PushObject.ios_apns_push(**kwargs)
+        elif push_type == 1:  # android gcm
+            PushObject.android_fcm_push(**kwargs)
+        elif push_type == 2:  # android 极光推送
+            PushObject.android_jpush(**kwargs)
+        elif push_type == 3:
+            huawei_push_object = HuaweiPushObject()
+            huawei_push_object.send_push_notify_message(**kwargs)
+        elif push_type == 4:  # android 小米推送
+            channel_id = 104551
+            PushObject.android_xmpush(channel_id=channel_id, **kwargs)
+        elif push_type == 5:  # android vivo推送
+            PushObject.android_vivopush(**kwargs)
+        elif push_type == 6:  # android oppo推送
+            channel_id = 'DEVICE_REMINDER'
+            PushObject.android_oppopush(channel_id=channel_id, **kwargs)
+        elif push_type == 7:  # android 魅族推送
+            PushObject.android_meizupush(**kwargs)
+
     @classmethod
     def socket_msg_push(cls, request_dict, response):
         """