Преглед на файлове

网关设备添加移除版本号,新增loocam首页设备查询接口

zhangdongming преди 3 години
родител
ревизия
123a925dfb
променени са 2 файла, в които са добавени 301 реда и са изтрити 4 реда
  1. 2 2
      Ansjer/urls.py
  2. 299 2
      SensorGateway/EquipmentFamilyManager.py

+ 2 - 2
Ansjer/urls.py

@@ -26,7 +26,7 @@ from Controller.Cron import CronTaskController
 from AdminController import UserManageController, RoleController, MenuController, TestServeController, \
     ServeManagementController, LogManagementController, DeviceManagementController, VersionManagementController, \
     AiServeController, SurveysManageController, SerialManageController
-from SensorGateway import SensorGatewayController,EquipmentFamilyManager
+from SensorGateway import SensorGatewayController, EquipmentFamilyManager
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -363,7 +363,7 @@ urlpatterns = [
     url(r'^api/surveys/(?P<operation>.*)$', CloudStorageController.CloudStorageView.as_view()),
 
     # 网关家庭模块
-    url(r'^api/sensor/gateway/(?P<operation>.*)$', EquipmentFamilyManager.EquipmentFamilyManager.as_view()),
+    url(r'^app/sensor/gateway/(?P<operation>.*)$', EquipmentFamilyManager.EquipmentFamilyManager.as_view()),
 
     # 传感器网关
     re_path('sensorGateway/(?P<operation>.*)', SensorGatewayController.SensorGateway.as_view()),

+ 299 - 2
SensorGateway/EquipmentFamilyManager.py

@@ -7,6 +7,7 @@
 @Software: PyCharm
 """
 
+import base64
 import time
 
 import oss2
@@ -15,6 +16,7 @@ from django.db.models import Q
 from django.views.generic.base import View
 
 from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
+from Controller.CheckUserData import RandomStr
 from Controller.DeviceConfirmRegion import Device_Region
 from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
     iotdeviceInfoModel, UIDModel
@@ -23,6 +25,7 @@ from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 
 
+# 家庭设备管理
 class EquipmentFamilyManager(View):
 
     def get(self, request, *args, **kwargs):
@@ -54,6 +57,8 @@ class EquipmentFamilyManager(View):
             return self.do_save(user_id, request_dict, response, request)
         if operation == 'page':
             return self.do_device_page(user_id, request_dict, response)
+        if operation == 'query':
+            return self.do_device_query(user_id, request_dict, response)
         else:
             return response.json(414)
 
@@ -70,7 +75,6 @@ class EquipmentFamilyManager(View):
         nick_name = request_dict.get('nickName', None)
         serial_number = request_dict.get('serialNumber', None)
         device_type = request_dict.get('deviceType', None)
-        version = request_dict.get('version', None)
         # type 可能为0
         if not all([nick_name, serial_number, device_type]):
             return response.json(444, {'param': 'nick_name, serial_number, device_type'})
@@ -104,7 +108,6 @@ class EquipmentFamilyManager(View):
                         'updTime': n_time,
                         'ip': CommonService.get_ip_address(request_dict),
                         'nickname': nick_name,
-                        'version': version,
                         'region_alexa': region_alexa,
                     }
                     UidSetModel.objects.create(**uid_set_create_dict)
@@ -148,7 +151,301 @@ class EquipmentFamilyManager(View):
             })
         return response.json(0, {'list': data, 'total': total})
 
+    @classmethod
+    def do_device_query(cls, user_id, request_dict, response):
+        """
+        查询用户设备信息
+        @param user_id: 用户id
+        @param request_dict: 请求参数
+        @param response: 响应对象
+        @return: response
+        """
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+        nick_name = request_dict.get('NickName', None)
+
+        page = int(page)
+        line = int(line)
+        uid = request_dict.get('uid', None)
+        device_start = time.time()
+        device_info_list = cls.get_device_info_list(user_id, nick_name, uid,
+                                                    page, line)
+        device_end = time.time()
+        print("设备信息代码执行时间")
+        print(device_end - device_start)
+        uid_list = []
+        # 判断是否是主用户 isPrimaryUser=0:否,1:是
+        for dvl in device_info_list:
+            if dvl['primaryUserID'] and dvl['id'] == dvl['primaryUserID']:
+                dvl['isPrimaryUser'] = 1
+            else:
+                dvl['isPrimaryUser'] = 0
+            uid_list.append(dvl['UID'])
+        print(uid_list)
+        # 设备关联套餐,设备预览图
+        bucket_start = time.time()
+        uid_bucket_qs, uid_preview_qs = cls.get_bucket_and_preview_by_uid(uid_list)
+        bucket_end = time.time()
+        print("设备套餐代码执行时间")
+        print(bucket_end - bucket_start)
+        # 设备配置信息
+        uid_set_start = time.time()
+        uid_set_dict = cls.get_uid_set_dict(uid_list)
+        uid_set_end = time.time()
+        print("设备配置详情代码执行时间")
+        print(uid_set_end - uid_set_start)
+        # 设备详情信息
+        details_start = time.time()
+        result = cls.get_device_details(device_info_list, uid_bucket_qs, uid_preview_qs, uid_set_dict)
+        details_end = time.time()
+        print("设备uid详情代码执行时间")
+        print(details_end - details_start)
+        # print('NickName搜索缓存')
+        # print('缓存分页')
+        items = []
+        pwd_start = time.time()
+        for index, item in enumerate(result):
+            # 加密
+            if item['View_Password']:
+                item['View_Password'] = cls.encrypt_pwd(item['View_Password'])
+            items.append(item)
+        pwd_end = time.time()
+        print("加密代码执行时间")
+        print(pwd_end - pwd_start)
+        return response.json(0, items)
+
+    @classmethod
+    def get_device_info_list(cls, user_id, nick_name, uid, page, line):
+        """
+        根据用户id获取设备信息
+        @param uid: uid
+        @param nick_name: 设备名称
+        @param line: 条数
+        @param page: 页数
+        @param user_id: 用户id
+        @return: device_info_list 设备信息列表
+        """
+        # 获取用户设备信息
+        device_info_qs = Device_Info.objects.filter(userID_id=user_id)
+        # 过滤已重置的设备
+        device_info_qs = device_info_qs.filter(~Q(isExist=2))
+        if nick_name:
+            device_info_qs = device_info_qs.filter(NickName__icontains=nick_name)
+        if uid:
+            device_info_qs.filter(UID=uid)
+        device_info_values = device_info_qs.values('id', 'userID', 'NickName', 'UID', 'View_Account', 'View_Password',
+                                                   'ChannelIndex',
+                                                   'Type', 'isShare', 'primaryUserID', 'primaryMaster', 'data_joined',
+                                                   'vodPrimaryUserID',
+                                                   'vodPrimaryMaster', 'userID__userEmail', 'version', 'isVod',
+                                                   'isExist', 'NotificationMode',
+                                                   'isCameraOpenCloud', 'serial_number')
+        device_info_values = device_info_values[(page - 1) * line:page * line]
+        device_info_list = CommonService.qs_to_list(device_info_values)
+        return device_info_list
+
+    @classmethod
+    def get_bucket_and_preview_by_uid(cls, uid_list):
+        """
+        根据uid列表查询套餐
+        @param uid_list: uid列表
+        @return: uid_bucket_qs
+        """
+        uid_bucket_qs = UID_Bucket.objects.filter(uid__in=uid_list).values('bucket__content', 'status', 'channel',
+                                                                           'endTime', 'uid')
+        uid_preview_qs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
+        return uid_bucket_qs, uid_preview_qs
+
+    @classmethod
+    def get_uid_set_dict(cls, uid_list):
+        """
+
+        @param uid_list: uid列表
+        @return: uid_set_dict uid配置信息
+        """
+        uid_set_qs = UidSetModel.objects.filter(uid__in=uid_list) \
+            .values('id', 'uid', 'version', 'nickname', 'ucode',
+                    'detect_status', 'detect_group',
+                    'detect_interval',
+                    'region_alexa', 'is_alexa', 'deviceModel',
+                    'TimeZone', 'TimeStatus', 'SpaceUsable',
+                    'SpaceSum', 'MirrorType', 'RecordType',
+                    'OutdoorModel', 'WIFIName', 'isDetector',
+                    'DetectorRank', 'is_human', 'is_custom_voice',
+                    'is_ptz', 'double_wifi', 'is_ai')
+        uid_set_dict = {}
+        for us in uid_set_qs:
+            uid_set_dict[us['uid']] = {
+                'version': us['version'],
+                'nickname': us['nickname'],
+                'ucode': us['ucode'],
+                'detect_interval': us['detect_interval'],
+                'detect_group': us['detect_group'],
+                'detect_status': us['detect_status'],
+                'region_alexa': us['region_alexa'],
+                'is_alexa': us['is_alexa'],
+                'deviceModel': us['deviceModel'],
+                'TimeZone': us['TimeZone'],
+                'TimeStatus': us['TimeStatus'],
+                'SpaceUsable': us['SpaceUsable'],
+                'SpaceSum': us['SpaceSum'],
+                'MirrorType': us['MirrorType'],
+                'RecordType': us['RecordType'],
+                'OutdoorModel': us['OutdoorModel'],
+                'WIFIName': us['WIFIName'],
+                'isDetector': us['isDetector'],
+                'DetectorRank': us['DetectorRank'],
+                'is_human': us['is_human'],
+                'is_custom_voice': us['is_custom_voice'],
+                'is_ptz': us['is_ptz'],
+                'double_wifi': us['double_wifi'],
+                'is_ai': us['is_ai']
+            }
+            # 从uid_channel里面取出通道配置信息
+            uid_channel_set_qs = UidChannelSetModel.objects.filter(uid__id=us['id']) \
+                .values('channel', 'channel_name',
+                        'pir_audio', 'mic_audio',
+                        'battery_status',
+                        'battery_level',
+                        'sleep_status',
+                        'sleep_time',
+                        'light_night_model',
+                        'light_alarm_type',
+                        'light_alarm_level',
+                        'light_alarm_man_en',
+                        'light_alarm_vol',
+                        'light_long_light'
+                        )
+            channels_list = []
+            for ucs in uid_channel_set_qs:
+                channels_dict = {
+                    'channel': ucs['channel'],
+                    'channel_name': ucs['channel_name'],
+                    'pir_audio': ucs['pir_audio'],
+                    'mic_audio': ucs['mic_audio'],
+                    'battery_status': ucs['battery_status'],
+                    'battery_level': ucs['battery_level'],
+                    'sleep_status': ucs['sleep_status'],
+                    'sleep_time': ucs['sleep_time'],
+                    'light_night_model': ucs['light_night_model'],
+                    'light_alarm_type': ucs['light_alarm_type'],
+                    'light_alarm_level': ucs['light_alarm_level'],
+                    'light_alarm_man_en': ucs['light_alarm_man_en'],
+                    'light_alarm_vol': ucs['light_alarm_vol'],
+                    'light_long_light': ucs['light_long_light']
+                }
+                channels_list.append(channels_dict)
+            uid_set_dict[us['uid']]['channels'] = channels_list
+        return uid_set_dict
+
+    @classmethod
+    def get_device_details(cls, device_info_list, uid_bucket_qs, uid_preview_qs, uid_set_dict):
+        """
+        设备详情
+        @param device_info_list: 设备信息列表
+        @param uid_bucket_qs: 套餐对象
+        @param uid_preview_qs:
+        @param uid_set_dict:
+        @return:
+        """
+        now_time = int(time.time())
+        data = []
+        for p in device_info_list:
+            # 获取iotDeviceInfo表的endpoint和tokenIotNumber
+            p['iot'] = []
+            if p['serial_number']:  # 存在序列号根据序列号查询
+                iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=p['serial_number'][0:6])
+            else:  # 根据uid查询
+                iot_device_info_qs = iotdeviceInfoModel.objects.filter(uid=p['UID'])
+            if iot_device_info_qs.exists():
+                iot_device_Info = iot_device_info_qs.values('endpoint', 'token_iot_number')
+                p['iot'].append({
+                    'endpoint': iot_device_Info[0]['endpoint'],
+                    'token_iot_number': iot_device_Info[0]['token_iot_number']
+                })
+
+            p['vod'] = []
+            for dm in uid_bucket_qs:
+                if p['UID'] == dm['uid']:
+                    if dm['endTime'] > now_time:
+                        p['vod'].append(dm)
+            p['preview'] = []
+
+            auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+            bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
 
+            for up in uid_preview_qs:
+                if p['UID'] == up['uid']:
+                    obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
+                    img_sign = bucket.sign_url('GET', obj, 300)
+                    p['preview'].append(img_sign)
+
+            p_uid = p['UID']
+
+            # 返回设备初始化字符
+            uid_qs = UIDModel.objects.filter(uid=p_uid).values('platform', 'init_string', 'init_string_app')
+            if uid_qs.exists():
+                p['platform'] = uid_qs[0]['platform']
+                p['initString'] = uid_qs[0]['init_string']
+                p['initStringApp'] = uid_qs[0]['init_string_app']
+
+            if p_uid in uid_set_dict:
+                # 设备版本号
+                uidversion = uid_set_dict[p_uid]['version']
+                if len(uidversion) > 6:
+                    uidversion = uidversion[0: uidversion.rfind('.')]
+                p['uid_version'] = uidversion
+                p['ucode'] = uid_set_dict[p_uid]['ucode']
+                p['detect_interval'] = uid_set_dict[p_uid]['detect_interval']
+                p['detect_status'] = uid_set_dict[p_uid]['detect_status']
+                p['detect_group'] = uid_set_dict[p_uid]['detect_group']
+                p['region_alexa'] = uid_set_dict[p_uid]['region_alexa']
+                p['is_alexa'] = uid_set_dict[p_uid]['is_alexa']
+                p['deviceModel'] = uid_set_dict[p_uid]['deviceModel']
+                p['TimeZone'] = uid_set_dict[p_uid]['TimeZone']
+                p['TimeStatus'] = uid_set_dict[p_uid]['TimeStatus']
+                p['SpaceUsable'] = uid_set_dict[p_uid]['SpaceUsable']
+                p['SpaceSum'] = uid_set_dict[p_uid]['SpaceSum']
+                p['MirrorType'] = uid_set_dict[p_uid]['MirrorType']
+                p['RecordType'] = uid_set_dict[p_uid]['RecordType']
+                p['OutdoorModel'] = uid_set_dict[p_uid]['OutdoorModel']
+                p['WIFIName'] = uid_set_dict[p_uid]['WIFIName']
+                p['isDetector'] = uid_set_dict[p_uid]['isDetector']
+                p['DetectorRank'] = uid_set_dict[p_uid]['DetectorRank']
+                p['is_human'] = uid_set_dict[p_uid]['is_human']
+                p['is_custom_voice'] = uid_set_dict[p_uid]['is_custom_voice']
+                p['is_ptz'] = uid_set_dict[p_uid]['is_ptz']
+                p['channels'] = uid_set_dict[p_uid]['channels']
+                p['double_wifi'] = uid_set_dict[p_uid]['double_wifi']
+                p['is_ai'] = uid_set_dict[p_uid]['is_ai']
+                # 设备昵称 调用影子信息昵称,先阶段不可
+                if uid_set_dict[p_uid]['nickname']:
+                    p['NickName'] = uid_set_dict[p_uid]['nickname']
+            else:
+                # 设备版本号
+                p['uid_version'] = ''
+                p['ucode'] = ''
+            data.append(p)
+        return data
+
+    @classmethod
+    def encrypt_pwd(cls, user_pwd):
+        """
+        用户密码加密
+        @param user_pwd:用户密码
+        @return: user_pwd 加密后的pwd
+        """
+        for i in range(1, 4):
+            if i == 1:
+                user_pwd = RandomStr(3, False) + user_pwd + RandomStr(3, False)
+                user_pwd = base64.b64encode(str(user_pwd).encode("utf-8")).decode('utf8')
+            if i == 2:
+                user_pwd = RandomStr(2, False) + str(user_pwd) + RandomStr(2, False)
+                user_pwd = base64.b64encode(str(user_pwd).encode("utf-8")).decode('utf8')
+            if i == 3:
+                user_pwd = RandomStr(1, False) + str(user_pwd) + RandomStr(1, False)
+                user_pwd = base64.b64encode(str(user_pwd).encode("utf-8")).decode('utf8')
+        return user_pwd
 
     # @classmethod
     # def family_save(cls, user_id, save_type, lang):