浏览代码

修复设备注册到IoT core接口问题

locky 3 年之前
父节点
当前提交
ad05c61796
共有 2 个文件被更改,包括 86 次插入101 次删除
  1. 82 81
      Controller/IotCoreController.py
  2. 4 20
      Object/IOTCore/IotObject.py

+ 82 - 81
Controller/IotCoreController.py

@@ -79,87 +79,88 @@ class IotCoreView(View):
         if not all([token, time_stamp, device_version, language]):
         if not all([token, time_stamp, device_version, language]):
             return response.json(444, {'param': 'token, uid_code, time_stamp, device_version, language'})
             return response.json(444, {'param': 'token, uid_code, time_stamp, device_version, language'})
 
 
-        # 时间戳token校验
-        if not CommonService.check_time_stamp_token(token, time_stamp):
-            return response.json(13)
-
-        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]):
-                return response.json(444, {'param': 'serial_number, serial_number_code'})
-
-            # 序列号编码解码校验
-            serial_number_code = CommonService.decode_data(serial_number_code)
-            if serial_number != serial_number_code:
-                return response.json(404)
-
-            serial = serial_number[0:6]
-            try:
-                SerialNumberModel.objects.get(serial_number=serial)
-            except:
-                return response.json(444)
-
-            ThingNameSuffix = serial_number  # 物品名后缀
-            iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
-        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     # 物品名后缀
-            iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=uid)
-        # 判断设备是否已注册证书
-        if not iotdeviceInfo_qs.exists():
-            thingGroup = device_version + '_' + language
-            # 设备模拟国外环境测试
-            # if SERVER_TYPE == 'Ansjer.us_config.formal_settings':  # 国外正式配置使用固定ip进行测试
-            #     ip = '67.220.90.13'
-            # else:
-            #     ip = CommonService.get_ip_address(request)
-            ip = CommonService.get_ip_address(request)
-            region_id = Device_Region().get_device_region(ip)
-            logger = logging.getLogger('info')
-            logger.info('---设备注册到IoT Core接口--- ip:{},region_id:{}'.format(ip, region_id))
-
-            iotClient = IOTClient(region_id)
-            res = iotClient.register_to_iot_core(ThingNameSuffix, thingGroup, response)
-            token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(int(time.time()))).encode('utf-8')).hexdigest()
-
-            iotdeviceInfoModel.objects.create(uid=uid,
-                                              serial_number=serial,
-                                              endpoint=res[0]['endpoint'],
-                                              certificate_id=res[0]['certificateId'],
-                                              certificate_pem=res[0]['certificatePem'],
-                                              public_key=res[0]['publicKey'],
-                                              private_key=res[0]['privateKey'],
-                                              thing_name=res[1]['ThingName'],
-                                              thing_groups=res[1]['thingGroupName'],
-                                              token_iot_number=token_iot_number
-                                              )
-            res = {
-                'certificateId': res[0]['certificateId'],
-                'certificatePem': res[0]['certificatePem'],
-                'publicKey': res[0]['publicKey'],
-                'privateKey': res[0]['privateKey'],
-                'endpoint': res[0]['endpoint']
-            }
-            return response.json(0, {'res': res})
-        else:
-            iot = iotdeviceInfo_qs[0]
-            res = {
-                'certificateId': iot.certificate_id,
-                'certificatePem': iot.certificate_pem,
-                'publicKey': iot.public_key,
-                'privateKey': iot.private_key,
-                'endpoint': iot.endpoint
-            }
-            # print('此设备已注册证书')
-            return response.json(0, {'res': res})
+        try:
+            # 时间戳token校验
+            if not CommonService.check_time_stamp_token(token, time_stamp):
+                return response.json(13)
+
+            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]):
+                    return response.json(444, {'param': 'serial_number, serial_number_code'})
+
+                # 序列号编码解码校验
+                serial_number_code = CommonService.decode_data(serial_number_code)
+                if serial_number != serial_number_code:
+                    return response.json(404)
+
+                serial = serial_number[0:6]
+                try:
+                    SerialNumberModel.objects.get(serial_number=serial)
+                except:
+                    return response.json(444)
+
+                ThingNameSuffix = serial_number  # 物品名后缀
+                iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
+            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     # 物品名后缀
+                iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=uid)
+            # 判断设备是否已注册证书
+            if not iotdeviceInfo_qs.exists():
+                thingGroup = device_version + '_' + language
+                # 设备模拟国外环境测试
+                # if SERVER_TYPE == 'Ansjer.us_config.formal_settings':  # 国外正式配置使用固定ip进行测试
+                #     ip = '67.220.90.13'
+                # else:
+                #     ip = CommonService.get_ip_address(request)
+                ip = CommonService.get_ip_address(request)
+                region_id = Device_Region().get_device_region(ip)
+
+                iotClient = IOTClient(region_id)
+                res = iotClient.register_to_iot_core(ThingNameSuffix, thingGroup, response)
+                token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(int(time.time()))).encode('utf-8')).hexdigest()
+
+                iotdeviceInfoModel.objects.create(uid=uid,
+                                                  serial_number=serial,
+                                                  endpoint=res[0]['endpoint'],
+                                                  certificate_id=res[0]['certificateId'],
+                                                  certificate_pem=res[0]['certificatePem'],
+                                                  public_key=res[0]['publicKey'],
+                                                  private_key=res[0]['privateKey'],
+                                                  thing_name=res[1]['ThingName'],
+                                                  thing_groups=res[1]['thingGroupName'],
+                                                  token_iot_number=token_iot_number
+                                                  )
+                res = {
+                    'certificateId': res[0]['certificateId'],
+                    'certificatePem': res[0]['certificatePem'],
+                    'publicKey': res[0]['publicKey'],
+                    'privateKey': res[0]['privateKey'],
+                    'endpoint': res[0]['endpoint']
+                }
+                return response.json(0, {'res': res})
+            else:
+                iot = iotdeviceInfo_qs[0]
+                res = {
+                    'certificateId': iot.certificate_id,
+                    'certificatePem': iot.certificate_pem,
+                    'publicKey': iot.public_key,
+                    'privateKey': iot.private_key,
+                    'endpoint': iot.endpoint
+                }
+                return response.json(0, {'res': res})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
 
 
     def thing_regroup(self, request_dict, response, request):
     def thing_regroup(self, request_dict, response, request):
         # 物品重新分组
         # 物品重新分组

+ 4 - 20
Object/IOTCore/IotObject.py

@@ -1,7 +1,6 @@
 #!/usr/bin/env python3
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 import json
 import json
-from abc import ABCMeta,abstractmethod
 
 
 import boto3
 import boto3
 
 
@@ -11,21 +10,8 @@ from Ansjer.config import AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_CH
     AWS_IOT_SES_ACCESS_FOREIGN_ROLE
     AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
 
 
 
-class IOTObject(metaclass=ABCMeta):
-
-    @abstractmethod
-    def create_provisioning_claim(self, templateName):
-        pass
-
-    @abstractmethod
-    def create_keys_and_certificate(self, uid):
-        pass
-
-
-class IOTClient(IOTObject):
-
+class IOTClient:
     def __init__(self, region_id=1):
     def __init__(self, region_id=1):
-
         if region_id == 1:
         if region_id == 1:
             # 中国宁夏
             # 中国宁夏
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_CHINA_REGION,
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_CHINA_REGION,
@@ -35,7 +21,7 @@ class IOTClient(IOTObject):
             self.endpoint = 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
             self.endpoint = 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
             self.iotrole = AWS_IOT_SES_ACCESS_CHINA_ROLE
             self.iotrole = AWS_IOT_SES_ACCESS_CHINA_ROLE
 
 
-        if region_id == 2:
+        elif region_id == 2:
             # 亚太新加坡
             # 亚太新加坡
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA,
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
@@ -43,7 +29,7 @@ class IOTClient(IOTObject):
             self.endpoint = 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
             self.endpoint = 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
 
-        if region_id == 3:
+        elif region_id == 3:
             # 美东弗吉尼亚
             # 美东弗吉尼亚
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA,
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
@@ -51,7 +37,7 @@ class IOTClient(IOTObject):
             self.endpoint = 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
             self.endpoint = 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
 
-        if region_id == 4:
+        elif region_id == 4:
             # 西欧爱尔兰
             # 西欧爱尔兰
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE,
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
@@ -59,8 +45,6 @@ class IOTClient(IOTObject):
             self.endpoint = 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
             self.endpoint = 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
 
-
-
     def create_provisioning_claim(self, templateName):
     def create_provisioning_claim(self, templateName):
 
 
         result = self.client.create_provisioning_claim(templateName=templateName)
         result = self.client.create_provisioning_claim(templateName=templateName)