浏览代码

修改网关推送接口

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 django.views.generic.base import View
 
 
 from AnsjerPush.Config.gatewaySensorConfig import SENSOR_TYPE, EVENT_TYPE
 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.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.HuaweiPushService.HuaweiPushService import HuaweiPushObject
 from Service.HuaweiPushService.HuaweiPushService import HuaweiPushObject
 from Service.PushService import PushObject
 from Service.PushService import PushObject
-
-LOGGER = logging.getLogger('info')
+from AnsjerPush.config import LOGGER
 
 
 
 
 class GatewayView(View):
 class GatewayView(View):
@@ -43,47 +42,54 @@ class GatewayView(View):
         else:
         else:
             return response.json(414)
             return response.json(414)
 
 
-    @staticmethod
-    def gateway_push(request_dict, response):
+    @classmethod
+    def gateway_push(cls, request_dict, response):
         """
         """
         网关推送
         网关推送
         @param request_dict: 请求参数
         @param request_dict: 请求参数
         @request_dict serial_number: 序列号
         @request_dict serial_number: 序列号
+        @request_dict dev_class: 设备大类
+        @request_dict dev_type: 设备小类
         @request_dict ieee_addr: 长地址
         @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: 响应对象
         @param response: 响应对象
         @return: response
         @return: response
         """
         """
-        logger = logging.getLogger('info')
+        LOGGER.info('---调用网关推送接口--- request_dict:{}'.format(request_dict))
         serial_number = request_dict.get('serial_number', None)
         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)
         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))
         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)
             return response.json(444)
 
 
         n_time = int(time.time())
         n_time = int(time.time())
 
 
         try:
         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
             # 查询子设备表id
             gateway_sub_device_qs = GatewaySubDevice.objects.filter(device__serial_number=serial_number,
             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():
             if not gateway_sub_device_qs.exists():
                 return response.json(173)
                 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 = {
                 sensor_record_dict = {
                     'gateway_sub_device_id': gateway_sub_device_id,
                     'gateway_sub_device_id': gateway_sub_device_id,
                     'alarm': alarm,
                     'alarm': alarm,
@@ -101,107 +107,279 @@ class GatewayView(View):
 
 
                 SensorRecord.objects.create(**sensor_record_dict)
                 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)
                     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
                         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)
             return response.json(0)
         except Exception as e:
         except Exception as e:
-            logger.info('---网关推送接口异常--- {}'.format(repr(e)))
+            LOGGER.info('---网关推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))
             return response.json(500, repr(e))
 
 
     @staticmethod
     @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: 请求参数
         @param request_dict: 请求参数
@@ -275,25 +453,7 @@ class GatewayView(View):
 
 
                         try:
                         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:
                         except Exception as e:
                             logger.info('场景日志推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
                             logger.info('场景日志推送消息异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
                             continue
                             continue
@@ -302,6 +462,34 @@ class GatewayView(View):
             logger.info('---场景日志推送接口异常--- {}'.format(repr(e)))
             logger.info('---场景日志推送接口异常--- {}'.format(repr(e)))
             return response.json(500, 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
     @classmethod
     def socket_msg_push(cls, request_dict, response):
     def socket_msg_push(cls, request_dict, response):
         """
         """