Selaa lähdekoodia

设备重新分组兼容使用region_id确认地区

locky 3 vuotta sitten
vanhempi
commit
b9ace12d08
2 muutettua tiedostoa jossa 62 lisäystä ja 52 poistoa
  1. 42 52
      Controller/IotCoreController.py
  2. 20 0
      Service/CommonService.py

+ 42 - 52
Controller/IotCoreController.py

@@ -1,30 +1,24 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
-import logging
-import os
 import hashlib
-import json
+import logging
 import time
 import uuid
-import boto3
-import requests
 
+import requests
 from django.views import View
-from Ansjer.config import BASE_DIR, AWS_IOT_GETS3_PULL_CHINA_ID, AWS_IOT_GETS3_PULL_CHINA_SECRET, \
+
+from Ansjer.config import AWS_IOT_GETS3_PULL_CHINA_ID, AWS_IOT_GETS3_PULL_CHINA_SECRET, \
     AWS_IOT_GETS3_PULL_FOREIGN_ID, AWS_IOT_GETS3_PULL_FOREIGN_SECRET, AWS_ARN, AWS_IOT_SES_ACCESS_CHINA_REGION, \
     AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA, AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE, \
-    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA, SERVER_TYPE
-from base64 import b64encode, encodebytes
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
 from Controller.DeviceConfirmRegion import Device_Region
-from Model.models import Device_User, Device_Info, iotdeviceInfoModel, UIDCompanySerialModel, \
-    SerialNumberModel
+from Model.models import Device_Info, iotdeviceInfoModel, SerialNumberModel, UidSetModel
 from Object.IOTCore.IotObject import IOTClient
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 
-import OpenSSL.crypto as ct
-
 
 class IotCoreView(View):
 
@@ -51,7 +45,7 @@ class IotCoreView(View):
         elif operation == 'getS3PullKey':
             return self.get_s3_pull_key(request_dict, response, request)
         elif operation == 'thingRegroup':
-            return self.thing_regroup(request_dict, response, request)
+            return self.thing_regroup(request_dict, response)
         elif operation == 'pcGetIotInfo':
             return self.pcGetIotInfo(request_dict, response)
         else:
@@ -92,8 +86,8 @@ class IotCoreView(View):
 
             uid = request_dict.get('uid', '')
             uid_code = request_dict.get('uid_code', None)
-            companyMark = '11A'
-            if not uid:     # 传序列号
+            company_mark = '11A'
+            if not uid:  # 传序列号
                 serial_number = request_dict.get('serial_number', None)
                 serial_number_code = request_dict.get('serial_number_code', None)
                 if not all([serial_number, serial_number_code]):
@@ -105,22 +99,22 @@ class IotCoreView(View):
                     return response.json(404)
 
                 serial = serial_number[0:6]
-                companyMark = serial_number[-3:]
+                company_mark = serial_number[-3:]
                 try:
                     SerialNumberModel.objects.get(serial_number=serial)
                 except:
                     return response.json(444)
 
-                ThingNameSuffix = serial_number  # 物品名后缀
+                thing_name_suffix = serial_number  # 物品名后缀
                 iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
-            else:       # 传uid
+            else:  # 传uid
                 # uid编码解码校验
                 uid_code = CommonService.decode_data(uid_code)
                 if uid != uid_code:
                     return response.json(404)
 
-                serial = ''     # iot_deviceInfo表写入serial_number为''
-                ThingNameSuffix = uid     # 物品名后缀
+                serial = ''  # iot_deviceInfo表写入serial_number为''
+                thing_name_suffix = uid  # 物品名后缀
                 iot_device_info_qs = iotdeviceInfoModel.objects.filter(uid=uid)
             # 判断设备是否已注册过
             if iot_device_info_qs.exists():
@@ -144,14 +138,9 @@ class IotCoreView(View):
                 iotClient = IOTClient(region_id)
 
                 # 拼接物品名
-                if companyMark == '11A':
-                    ThingName = 'Ansjer_Device_' + ThingNameSuffix
-                elif companyMark == '11L':
-                    ThingName = 'Loocam_Device_' + ThingNameSuffix
-                else:
-                    ThingName = ThingNameSuffix
+                thingName = CommonService.get_thing_name(company_mark, thing_name_suffix)
                 thingGroup = device_version + '_' + language
-                res = iotClient.register_to_iot_core(ThingName, thingGroup, response)
+                res = iotClient.register_to_iot_core(thingName, thingGroup, response)
 
                 token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(int(time.time()))).encode('utf-8')).hexdigest()
                 iotdeviceInfoModel.objects.create(uid=uid,
@@ -177,36 +166,40 @@ class IotCoreView(View):
             print(e)
             return response.json(500, repr(e))
 
-    def thing_regroup(self, request_dict, response, request):
+    @staticmethod
+    def thing_regroup(request_dict, response):
         # 物品重新分组
         uid = request_dict.get('uid', '')
         token = request_dict.get('token', None)
         language = request_dict.get('language', None)
+        region_id = request_dict.get('region_id', None)
         time_stamp = request_dict.get('time_stamp', None)
         device_version = request_dict.get('device_version', None)
 
-        if not all([token, language, time_stamp, device_version]):
-            return response.json(444, {'param: token, language, time_stamp, device_version'})
+        if not all([token, language, region_id, time_stamp, device_version]):
+            return response.json(444)
 
         # 时间戳token校验
         if not CommonService.check_time_stamp_token(token, time_stamp):
             return response.json(13)
 
-        ip = CommonService.get_ip_address(request)
-        region_id = Device_Region().get_device_region(ip)
-        iotClient = IOTClient(region_id)
-
-        ThingNameSuffix = uid
+        company_mark = '11A'
+        thing_name_suffix = uid
         if not uid:
             # 使用序列号
             serial_number = request_dict.get('serial_number', None)
             if not serial_number:
                 return response.json(444)
-            ThingNameSuffix = serial_number
-        thingName = 'Ansjer_Device_' + ThingNameSuffix
+            company_mark = serial_number[-3:]
+            thing_name_suffix = serial_number
+            uid = CommonService.query_uid_with_serial(serial_number)
+
+        uid_set_qs = UidSetModel.objects.filter(uid=uid)
+        thingName = CommonService.get_thing_name(company_mark, thing_name_suffix)
         new_thingGroupName = (device_version + '_' + language).replace('.', '_')  # 物品组命名不能包含'.'
 
         try:
+            iotClient = IOTClient(int(region_id))
             # 获取旧物品组
             list_groups_res = iotClient.client.list_thing_groups_for_thing(thingName=thingName, maxResults=1)
             old_thingGroupName = list_groups_res['thingGroups'][0]['groupName']
@@ -231,10 +224,7 @@ class IotCoreView(View):
                                                            , thingGroupsToRemove=[old_thingGroupName])
 
             # 更新设备版本信息
-            if uid:
-                Device_Info.objects.filter(UID=uid).update(version=device_version)
-            else:
-                Device_Info.objects.filter(serial_number=serial_number).update(version=device_version)
+            uid_set_qs.update(version=device_version)
             return response.json(0)
         except Exception as e:
             print(e)
@@ -281,7 +271,7 @@ class IotCoreView(View):
             Token = iot[0]['token_iot_number']
             # Token = '297a601b3925e04daab5a60280650e09'
             topic_suffix = '_power_topic' if 'Turn' in MSG else '_rtsp_topic'
-            topic_name = thing_name + topic_suffix     # MQTT主题
+            topic_name = thing_name + topic_suffix  # MQTT主题
 
             # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
             # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
@@ -329,14 +319,14 @@ class IotCoreView(View):
             endpoint = iot[0]['endpoint']
             MSG = self.get_s3_key_return_msg(endpoint)
 
-            return response.json(0,MSG)
+            return response.json(0, MSG)
         except Exception as e:
             # print(e)
             return response.json(500, repr(e))
 
-    def get_s3_key_return_msg(self,endpoint):
+    def get_s3_key_return_msg(self, endpoint):
         MSG = {}
-        if 'cn-northwest-1' in endpoint :
+        if 'cn-northwest-1' in endpoint:
             key = AWS_IOT_GETS3_PULL_CHINA_ID
             secret = AWS_IOT_GETS3_PULL_CHINA_SECRET
             arn = AWS_ARN[0]
@@ -345,11 +335,11 @@ class IotCoreView(View):
             key = AWS_IOT_GETS3_PULL_FOREIGN_ID
             secret = AWS_IOT_GETS3_PULL_FOREIGN_SECRET
             arn = AWS_ARN[1]
-            if 'ap-southeast-1' in endpoint :
+            if 'ap-southeast-1' in endpoint:
                 region_name = AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA
-            if 'eu-west-1' in endpoint :
+            if 'eu-west-1' in endpoint:
                 region_name = AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE
-            if 'us-east-1' in endpoint :
+            if 'us-east-1' in endpoint:
                 region_name = AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
 
         MSG['AccessKeyId'] = key
@@ -369,10 +359,10 @@ class IotCoreView(View):
         try:
             if serial_number:
                 serial_number = serial_number[0:6]
-                iot_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial_number).\
+                iot_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial_number). \
                     values('endpoint', 'token_iot_number')
             else:
-                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid).\
+                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid). \
                     values('endpoint', 'token_iot_number')
 
             if not iot_info_qs.exists():
@@ -395,10 +385,10 @@ class IotCoreView(View):
         try:
             if serial_number:
                 serial_number = serial_number[0:6]
-                iot_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial_number).\
+                iot_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial_number). \
                     values('endpoint', 'token_iot_number')
             else:
-                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid).\
+                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid). \
                     values('endpoint', 'token_iot_number')
 
             if not iot_info_qs.exists():

+ 20 - 0
Service/CommonService.py

@@ -571,3 +571,23 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             if serial_number:
                 return serial_number
         return uid
+
+    # 根据序列号查询uid,存在则返回uid,否则返回序列号
+    @staticmethod
+    def query_uid_with_serial(serial_number):
+        device_info_qs = Device_Info.objects.filter(serial_number=serial_number).values('UID')
+        if device_info_qs.exists():
+            uid = device_info_qs[0]['UID']
+            if uid:
+                return uid
+        return serial_number
+
+    # 根据企业标识返回物品名
+    @staticmethod
+    def get_thing_name(company_mark, thing_name_suffix):
+        if company_mark == '11A':
+            return 'Ansjer_Device_' + thing_name_suffix
+        elif company_mark == '11L':
+            return 'Loocam_Device_' + thing_name_suffix
+        else:
+            return thing_name_suffix