Browse Source

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

locky 3 years ago
parent
commit
b9ace12d08
2 changed files with 62 additions and 52 deletions
  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
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
-import logging
-import os
 import hashlib
 import hashlib
-import json
+import logging
 import time
 import time
 import uuid
 import uuid
-import boto3
-import requests
 
 
+import requests
 from django.views import View
 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_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_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 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.IOTCore.IotObject import IOTClient
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 
 
-import OpenSSL.crypto as ct
-
 
 
 class IotCoreView(View):
 class IotCoreView(View):
 
 
@@ -51,7 +45,7 @@ class IotCoreView(View):
         elif operation == 'getS3PullKey':
         elif operation == 'getS3PullKey':
             return self.get_s3_pull_key(request_dict, response, request)
             return self.get_s3_pull_key(request_dict, response, request)
         elif operation == 'thingRegroup':
         elif operation == 'thingRegroup':
-            return self.thing_regroup(request_dict, response, request)
+            return self.thing_regroup(request_dict, response)
         elif operation == 'pcGetIotInfo':
         elif operation == 'pcGetIotInfo':
             return self.pcGetIotInfo(request_dict, response)
             return self.pcGetIotInfo(request_dict, response)
         else:
         else:
@@ -92,8 +86,8 @@ class IotCoreView(View):
 
 
             uid = request_dict.get('uid', '')
             uid = request_dict.get('uid', '')
             uid_code = request_dict.get('uid_code', None)
             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 = request_dict.get('serial_number', None)
                 serial_number_code = request_dict.get('serial_number_code', None)
                 serial_number_code = request_dict.get('serial_number_code', None)
                 if not all([serial_number, serial_number_code]):
                 if not all([serial_number, serial_number_code]):
@@ -105,22 +99,22 @@ class IotCoreView(View):
                     return response.json(404)
                     return response.json(404)
 
 
                 serial = serial_number[0:6]
                 serial = serial_number[0:6]
-                companyMark = serial_number[-3:]
+                company_mark = serial_number[-3:]
                 try:
                 try:
                     SerialNumberModel.objects.get(serial_number=serial)
                     SerialNumberModel.objects.get(serial_number=serial)
                 except:
                 except:
                     return response.json(444)
                     return response.json(444)
 
 
-                ThingNameSuffix = serial_number  # 物品名后缀
+                thing_name_suffix = serial_number  # 物品名后缀
                 iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
                 iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
-            else:       # 传uid
+            else:  # 传uid
                 # uid编码解码校验
                 # uid编码解码校验
                 uid_code = CommonService.decode_data(uid_code)
                 uid_code = CommonService.decode_data(uid_code)
                 if uid != uid_code:
                 if uid != uid_code:
                     return response.json(404)
                     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)
                 iot_device_info_qs = iotdeviceInfoModel.objects.filter(uid=uid)
             # 判断设备是否已注册过
             # 判断设备是否已注册过
             if iot_device_info_qs.exists():
             if iot_device_info_qs.exists():
@@ -144,14 +138,9 @@ class IotCoreView(View):
                 iotClient = IOTClient(region_id)
                 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
                 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()
                 token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(int(time.time()))).encode('utf-8')).hexdigest()
                 iotdeviceInfoModel.objects.create(uid=uid,
                 iotdeviceInfoModel.objects.create(uid=uid,
@@ -177,36 +166,40 @@ class IotCoreView(View):
             print(e)
             print(e)
             return response.json(500, repr(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', '')
         uid = request_dict.get('uid', '')
         token = request_dict.get('token', None)
         token = request_dict.get('token', None)
         language = request_dict.get('language', None)
         language = request_dict.get('language', None)
+        region_id = request_dict.get('region_id', None)
         time_stamp = request_dict.get('time_stamp', None)
         time_stamp = request_dict.get('time_stamp', None)
         device_version = request_dict.get('device_version', 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校验
         # 时间戳token校验
         if not CommonService.check_time_stamp_token(token, time_stamp):
         if not CommonService.check_time_stamp_token(token, time_stamp):
             return response.json(13)
             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:
         if not uid:
             # 使用序列号
             # 使用序列号
             serial_number = request_dict.get('serial_number', None)
             serial_number = request_dict.get('serial_number', None)
             if not serial_number:
             if not serial_number:
                 return response.json(444)
                 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('.', '_')  # 物品组命名不能包含'.'
         new_thingGroupName = (device_version + '_' + language).replace('.', '_')  # 物品组命名不能包含'.'
 
 
         try:
         try:
+            iotClient = IOTClient(int(region_id))
             # 获取旧物品组
             # 获取旧物品组
             list_groups_res = iotClient.client.list_thing_groups_for_thing(thingName=thingName, maxResults=1)
             list_groups_res = iotClient.client.list_thing_groups_for_thing(thingName=thingName, maxResults=1)
             old_thingGroupName = list_groups_res['thingGroups'][0]['groupName']
             old_thingGroupName = list_groups_res['thingGroups'][0]['groupName']
@@ -231,10 +224,7 @@ class IotCoreView(View):
                                                            , thingGroupsToRemove=[old_thingGroupName])
                                                            , 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)
             return response.json(0)
         except Exception as e:
         except Exception as e:
             print(e)
             print(e)
@@ -281,7 +271,7 @@ class IotCoreView(View):
             Token = iot[0]['token_iot_number']
             Token = iot[0]['token_iot_number']
             # Token = '297a601b3925e04daab5a60280650e09'
             # Token = '297a601b3925e04daab5a60280650e09'
             topic_suffix = '_power_topic' if 'Turn' in MSG else '_rtsp_topic'
             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
             # 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
             # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
@@ -329,14 +319,14 @@ class IotCoreView(View):
             endpoint = iot[0]['endpoint']
             endpoint = iot[0]['endpoint']
             MSG = self.get_s3_key_return_msg(endpoint)
             MSG = self.get_s3_key_return_msg(endpoint)
 
 
-            return response.json(0,MSG)
+            return response.json(0, MSG)
         except Exception as e:
         except Exception as e:
             # print(e)
             # print(e)
             return response.json(500, repr(e))
             return response.json(500, repr(e))
 
 
-    def get_s3_key_return_msg(self,endpoint):
+    def get_s3_key_return_msg(self, endpoint):
         MSG = {}
         MSG = {}
-        if 'cn-northwest-1' in endpoint :
+        if 'cn-northwest-1' in endpoint:
             key = AWS_IOT_GETS3_PULL_CHINA_ID
             key = AWS_IOT_GETS3_PULL_CHINA_ID
             secret = AWS_IOT_GETS3_PULL_CHINA_SECRET
             secret = AWS_IOT_GETS3_PULL_CHINA_SECRET
             arn = AWS_ARN[0]
             arn = AWS_ARN[0]
@@ -345,11 +335,11 @@ class IotCoreView(View):
             key = AWS_IOT_GETS3_PULL_FOREIGN_ID
             key = AWS_IOT_GETS3_PULL_FOREIGN_ID
             secret = AWS_IOT_GETS3_PULL_FOREIGN_SECRET
             secret = AWS_IOT_GETS3_PULL_FOREIGN_SECRET
             arn = AWS_ARN[1]
             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
                 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
                 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
                 region_name = AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
 
 
         MSG['AccessKeyId'] = key
         MSG['AccessKeyId'] = key
@@ -369,10 +359,10 @@ class IotCoreView(View):
         try:
         try:
             if serial_number:
             if serial_number:
                 serial_number = serial_number[0:6]
                 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')
                     values('endpoint', 'token_iot_number')
             else:
             else:
-                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid).\
+                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid). \
                     values('endpoint', 'token_iot_number')
                     values('endpoint', 'token_iot_number')
 
 
             if not iot_info_qs.exists():
             if not iot_info_qs.exists():
@@ -395,10 +385,10 @@ class IotCoreView(View):
         try:
         try:
             if serial_number:
             if serial_number:
                 serial_number = serial_number[0:6]
                 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')
                     values('endpoint', 'token_iot_number')
             else:
             else:
-                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid).\
+                iot_info_qs = iotdeviceInfoModel.objects.filter(uid=uid). \
                     values('endpoint', 'token_iot_number')
                     values('endpoint', 'token_iot_number')
 
 
             if not iot_info_qs.exists():
             if not iot_info_qs.exists():

+ 20 - 0
Service/CommonService.py

@@ -571,3 +571,23 @@ GCqvlyw5dfxNA+EtxNE2wCW/LW7ENJlACgcfgPlBZtpLheWoZB/maw4=
             if serial_number:
             if serial_number:
                 return serial_number
                 return serial_number
         return uid
         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