浏览代码

Merge branch 'test' into lang

lang 3 年之前
父节点
当前提交
25fd778b31

+ 1 - 1
AdminController/SerialManageController.py

@@ -182,7 +182,7 @@ class SerialView(View):
             if not company_serial_qs.exists():
                 return response.json(0, {'list': '', 'total': 0})
             total = company_serial_qs.count()
-            serial_number_page = company_serial_qs.order_by('-add_time')[(page - 1) * line:page * line].\
+            serial_number_page = company_serial_qs.order_by('-serial_number')[(page - 1) * line:page * line].\
                 values('serial_number', 'company__name', 'status', 'add_time', 'update_time')
             return response.json(0, {'list': list(serial_number_page), 'total': total})
         except Exception as e:

+ 3 - 2
Controller/CloudStorage.py

@@ -91,7 +91,8 @@ class CloudStorageView(View):
         return self.validation(request.POST, request, operation)
 
     def validation(self, request_dict, request, operation):
-        response = ResponseObject()
+        lang = request_dict.get('lang', 'en')
+        response = ResponseObject(lang)
         if operation is None:
             return response.json(444, 'error path')
         elif operation == 'dopaypalcallback':  # paypal支付回调
@@ -120,7 +121,7 @@ class CloudStorageView(View):
             token = request_dict.get('token', None)
             # 设备主键uid
             tko = TokenObject(token)
-            response.lang = tko.lang
+            # response.lang = tko.lang
             if tko.code != 0:
                 return response.json(tko.code)
             userID = tko.userID

+ 11 - 5
Controller/EquipmentOTA.py

@@ -1,4 +1,7 @@
+import hashlib
 import os
+import uuid
+
 import simplejson as json
 import time
 from django.utils import timezone
@@ -311,14 +314,17 @@ class EquipmentVersionView(View):
             url = SERVER_DOMAIN + 'OTA/downloads/' + path
         elif file_path.find('static/otapack') != -1:
             file_path = file_path
+            param_url = "ansjer/" + CommonService.RandomStr(6) + "/" + file_path
+            data = {'Url': param_url, 'user_id': '', 'uid': uid, 'serial_number': '', 'old_version': '',
+                    'new_version': '', 'mci': ''}
+            dvr_ota_key = 'ASJ:SERVER:VERSION:{}'.format(uid)
+            dvr_ota_value = json.dumps(data)
+            expire = 3600 * 24 * 2 + 600
+            redisObject.set_data(dvr_ota_key, dvr_ota_value, expire)
             # 创建url的token
             tko = UrlTokenObject()
-            file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
-
+            file_path = tko.generate(data={'uid': uid})
             url = SERVER_DOMAIN + 'dlotapack/' + file_path
-        else:
-            return response.json(900, '2')
-        # http: // 192.168.136.39:8000 / EquipmentVersion / checkVer?code = 20D20410010
 
         res = {
             "url": url,

+ 59 - 20
Controller/OTAEquipment.py

@@ -1,12 +1,12 @@
 import hashlib
+import logging
 import os
-import simplejson as json
 import time
 import traceback
-
 from wsgiref.util import FileWrapper
 from zlib import crc32
 
+import simplejson as json
 from django.http import HttpResponse
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
@@ -14,7 +14,6 @@ from django.views.generic import TemplateView
 
 from Ansjer.config import BASE_DIR
 from Ansjer.config import SERVER_DOMAIN
-from Ansjer.config import SERVER_TYPE
 from Model.models import Device_User, EquipmentVersionLimitModel, CountryIPModel, DeviceOTAUpgradeRecord
 from Model.models import Equipment_Version
 from Object.RedisObject import RedisObject
@@ -23,6 +22,7 @@ from Object.TokenObject import TokenObject
 from Object.UrlTokenObject import UrlTokenObject
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
+import uuid
 
 
 def downloadUrl(fileType, fileCode, fileVersion, fileName):
@@ -494,7 +494,7 @@ def getNewVerInterface(request):
     else:
         equipmentValid = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by(
             '-data_joined')
-
+    logger = logging.getLogger('info')
     if equipmentValid.exists():
         equipment = equipmentValid[0]
         redisObject = RedisObject()
@@ -533,14 +533,32 @@ def getNewVerInterface(request):
         ver = equipment.softwareVersion
         max_ver = equipment.max_ver
         print(now_ver <= max_ver)
+
+        now_stamp = int(time.time())
         if now_ver <= max_ver:
             # 创建url的token
+            param_url = "ansjer/" + CommonService.RandomStr(6) + "/" + file_path
+            data = {'Url': param_url, 'user_id': tko.userID,
+                    'uid': uid, 'serial_number': serial_number, 'old_version': "V" + now_ver + "." + code,
+                    'new_version': version, 'mci': mci}
+            device_info_value = json.dumps(data)
+            expire = 3600 * 24 * 2 + 600
+
+            str_uuid = str(tko.userID)
+            if serial_number and serial_number != 'null':
+                str_uuid += serial_number
+            elif uid and uid != 'null':
+                str_uuid += uid
+            str_uuid += now_ver
+            device_info_key = 'ASJ:SERVER:VERSION:{}'.format(str_uuid)
+            logger.info('缓存key={}'.format(device_info_key))
+            redisObject.set_data(device_info_key, device_info_value, expire)
+
             url_tko = UrlTokenObject()
-            file_path = url_tko.generate(
-                data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path, 'user_id': tko.userID,
-                      'uid': uid, 'serial_number': serial_number, 'old_version': "V" + now_ver + "." + code,'new_version': version, 'mci': mci})
+            file_path = url_tko.generate(data={'uid': str_uuid})
+
             url = SERVER_DOMAIN + 'dlotapack/' + file_path
-            print(url)
+            logger.info('<<<<<<<URL={}'.format(url))
             # if SERVER_TYPE == 'Ansjer.formal_settings':
             #     url = SERVER_DOMAIN + 'dlotapack/' + file_path
             # else:
@@ -549,11 +567,13 @@ def getNewVerInterface(request):
             #     url = 'http://www.zositech.xyz/dlotapack/' + file_path
             # else:
             #     url = SERVER_DOMAIN + 'dlotapack/' + file_path
-            return response.json(0, {
+            result = {
                 'ver': ver,
                 'url': url,
                 "Description": equipment.Description,
-            })
+            }
+            logger.info('<<<<<响应结果{}'.format(result))
+            return response.json(0, result)
         else:
             return response.json(902)
     else:
@@ -666,14 +686,32 @@ def downloadOTAInterfaceV2(request, fullPath, *callback_args, **callback_kwargs)
     # 解密url的token
     url_token = UrlTokenObject(fullPath)
 
-    fp = url_token.Url
-    serial_number = url_token.serial_number
-    uid = url_token.uid
-    user_id = url_token.user_id
-    mci = url_token.mci
-    old_version = url_token.old_version
-    new_version = url_token.new_version
-
+    # fp = url_token.Url
+    # serial_number = url_token.serial_number
+    # uid = url_token.uid
+    # user_id = url_token.user_id
+    # mci = url_token.mci
+    # old_version = url_token.old_version
+    # new_version = url_token.new_version
+    str_uuid = url_token.uid
+    logger = logging.getLogger('info')
+    logger.info('<<<<<进入OTA下载')
+    redis_object = RedisObject()
+    logger.info(str_uuid)
+    device_key = 'ASJ:SERVER:VERSION:{}'.format(str_uuid)
+    device_value = redis_object.get_data(device_key)
+    logger.info(device_value)
+    if not device_value:
+        return res.json(907)
+    device_dist = json.loads(device_value)
+    logger.info('<<<<<解析={}'.format(device_dist))
+    fp = device_dist['Url']
+    serial_number = device_dist['serial_number']
+    uid = device_dist['uid']
+    user_id = device_dist['user_id']
+    mci = device_dist['mci']
+    old_version = device_dist['old_version']
+    new_version = device_dist['new_version']
     if '' == fp:
         return res.json(907)
 
@@ -692,7 +730,7 @@ def downloadOTAInterfaceV2(request, fullPath, *callback_args, **callback_kwargs)
                 response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
                 response['Content-Error'] = res.formal(0)
 
-                #设备下载OTA包,记录数据库
+                # 设备下载OTA包,记录数据库
                 # 记录设备OTA升级
                 createdTime = int(time.time())
                 DeviceOTAUpgradeRecord.objects.create(
@@ -704,6 +742,8 @@ def downloadOTAInterfaceV2(request, fullPath, *callback_args, **callback_kwargs)
                     uid=uid,
                     mci=mci,
                 )
+                del_data = redis_object.del_data(device_key)
+                logger.info('删除缓存={}'.format(del_data))
                 return response
             except Exception as e:
                 return res.json(906, repr(e))
@@ -782,4 +822,3 @@ def checkMaxVersion(request):
     }
 
     return response.json(0, res)
-

+ 1 - 4
Object/UrlTokenObject.py

@@ -34,10 +34,7 @@ class UrlTokenObject:
             if self.token is None:
                 return False
             res = jwt.decode(token, '12345', algorithms='HS256')
-            Url = res.get('Url', None)
-            if not Url:
-                return False
-            self.Url = Url
+            self.Url = res.get('Url', 'null')
             self.mci = res.get('mci', 'null')
             self.user_id = res.get('user_id', 'null')
             self.uid = res.get('uid', 'null')

+ 44 - 4
SensorGateway/SensorGatewayController.py

@@ -11,6 +11,7 @@ import string
 from django.views import View
 
 from Object.ResponseObject import ResponseObject
+from Service.CommonService import CommonService
 
 
 class SensorGateway(View):
@@ -27,14 +28,53 @@ class SensorGateway(View):
     def validation(self, request_dict, request, operation):
         response = ResponseObject()
         if operation == 'getSensorId':  # 返回唯一标识id给设备
-            return self.getSensorId(response)
+            return self.getSensorId(request_dict, response)
+        elif operation == 'registerToAWSIoTCore':  # 注册到AWS IoT Core
+            return self.registerToAWSIoTCore(request_dict, response)
         else:
             return response.json(404)
 
     @staticmethod
-    def getSensorId(response):
+    def getSensorId(request_dict, response):
+        """
+        传感器设备获取设备id
+        @param request_dict: 请求参数
+        @time_stamp: 时间戳
+        @time_stamp_token: 时间戳token
+        @param response: 响应对象
+        @return: sensorId 六位的随机id
+        """
+        time_stamp = request_dict.get('time_stamp', None)
+        time_stamp_token = request_dict.get('time_stamp_token', None)
+
+        if not all([time_stamp, time_stamp_token]):
+            return response.json(444, {'param': 'time_stamp, time_stamp_token'})
+        try:
+            # 时间戳token校验
+            if not CommonService.check_time_stamp_token_without_distance(time_stamp, time_stamp_token):
+                return response.json(13)
+
+            sensor_id = ''.join(random.sample(string.ascii_letters + string.digits, 6))
+            return response.json(0, {'sensor_id': sensor_id})
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    @staticmethod
+    def registerToAWSIoTCore(request_dict, response):
+        """
+        传感器设备注册到AWS IoT Core
+        @param request_dict: 请求参数
+        @request_dict sensor_id: 设备id
+        @param response: 响应对象
+        @return: res iot证书等数据
+        """
+        sensor_id = request_dict.get('sensor_id', None)
+        time_stamp = request_dict.get('time_stamp', None)
+        time_stamp_token = request_dict.get('time_stamp_token', None)
+
+        if not all([sensor_id, time_stamp, time_stamp_token]):
+            return response.json(444, {'param': 'sensor_id, time_stamp, time_stamp_token'})
         try:
-            sensorId = ''.join(random.sample(string.ascii_letters + string.digits, 6))
-            return response.json(0, {'sensorId': sensorId})
+            return response.json(0)
         except Exception as e:
             return response.json(500, repr(e))

+ 20 - 0
Service/CommonService.py

@@ -454,6 +454,26 @@ class CommonService:
             print(e)
             return False
 
+    @staticmethod
+    def check_time_stamp_token_without_distance(time_stamp, time_stamp_token):
+        """
+        用于没有RTC设备的时间戳token校验
+        @param time_stamp: 时间戳
+        @param time_stamp_token: 时间戳token
+        @return: boolean True/False
+        """
+
+        if not all([time_stamp, time_stamp_token]):
+            return False
+        try:
+            token = CommonService.decode_data(time_stamp_token)
+            if token != time_stamp:
+                return False
+            return True
+        except Exception as e:
+            print(e)
+            return False
+
     @staticmethod
     def req_publish_mqtt_msg(thing_name, topic_name, msg):
         # 通用发布MQTT消息函数

+ 9 - 6
Service/ModelService.py

@@ -1,12 +1,12 @@
-import logging
+import json
 import time
 
 import requests
+from django.db.models import Q
 
 from Ansjer.config import BASE_DIR
 from Model.models import *
-import json
-from django.db.models import Q
+from Service.EquipmentInfoService import EquipmentInfoService
 
 
 # 针对模型封装的复用性代码
@@ -149,7 +149,6 @@ class ModelService:
         else:
             return True
 
-
     # 通过用户名获取userIDLIST
     @staticmethod
     def get_user_list_by_username(username):
@@ -162,6 +161,11 @@ class ModelService:
         notify_alexa_delete(userID, uid)
         ei_qs = Equipment_Info.objects.filter(userID_id=userID, devUid=uid)
         ei_qs.delete()
+        for i in range(1, 8):
+            eq_list = EquipmentInfoService.get_equipment_info_model('', i)
+            eq_list = eq_list.filter(device_user_id=userID, device_uid=uid)
+            if eq_list.exists():
+                eq_list.delete()
         # ei_count = ei_qs.count()
         # while (ei_count > 1000):
         #     ei_qs[0:1000].delete()
@@ -174,7 +178,6 @@ class ModelService:
         uid_list = Device_Info.objects.filter(userID_id=userID).values_list('UID', flat=True)
         return list(uid_list)
 
-
     @staticmethod
     def notify_alexa_add(uid, userID, nickname, encrypt_pwd):
         url = 'https://www.zositech.xyz/deviceStatus/addOrUpdate'
@@ -194,7 +197,7 @@ class ModelService:
         file_path = '/'.join((BASE_DIR, 'static/delete_device.log'))
         file = open(file_path, 'a+')
         file.write(ip + "; username:" + userID + "; time:" + time.strftime(
-                "%Y-%m-%d %H:%M:%S", time.localtime()) + "; " + operation)
+            "%Y-%m-%d %H:%M:%S", time.localtime()) + "; " + operation)
         file.write('\n')
         file.flush()
         file.close()