Explorar o código

Merge remote-tracking branch 'origin/bin' into bin

lhq %!s(int64=4) %!d(string=hai) anos
pai
achega
07493b2c31

+ 1 - 0
Controller/DetectController.py

@@ -30,6 +30,7 @@ from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
+from Service.ModelService import ModelService
 
 '''
 http://test.push.dvema.com/notify/push?uidToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJUNEFaM0NVS0NFUkg5RlpBMTExQSJ9.GtrXeq5gb2Z9M3mKECxi9eNQbPxqC-6PtgJkOOg6PwI&n_time=1598456451&channel=1&event_type=1&is_st=1

+ 1 - 1
Controller/EquipmentManagerV3.py

@@ -76,7 +76,7 @@ class EquipmentManagerV3(View):
             response.lang = tko.lang
             if tko.code == 0:
                 userID = tko.userID
-                re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
+                re_uid = re.compile(r'^[A-Za-z0-9]{14,20}$')
                 if re_uid.match(UID):
                     is_exist = Device_Info.objects.filter(UID=UID, userID_id=userID)
                     if is_exist:

+ 51 - 0
Controller/IotCoreController.py

@@ -1,5 +1,6 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
+import json
 import time
 
 import boto3
@@ -31,9 +32,12 @@ class IotCoreView(View):
 
         if operation == 'createProvisioningClaim':
             return self.create_provisioning_claim(request_dict, response)
+        elif operation == 'createKeysAndCertificate':
+            return self.create_keys_and_certificate(request_dict, response)
         else:
             return response.json(404)
 
+    #即时预置注册  :已放弃
     def create_provisioning_claim(self, request_dict, response):
         uid = request_dict.get('uid', None)
         token = request_dict.get('token', None)
@@ -60,6 +64,7 @@ class IotCoreView(View):
 
                 if user_region.region_id == 1:
                     iotClient = ChinaIOTClient()
+
                     return response.json(0, {'res': iotClient.create_provisioning_claim('Ansjer_Iot_Queue')})
                 elif user_region.region_id == 2:
                     iotClient = AsiaIOTClient()
@@ -72,3 +77,49 @@ class IotCoreView(View):
                     return response.json(0, {'res': iotClient.create_provisioning_claim('Ansjer_Iot_Queue')})
         else:
             return response.json(444)
+
+    # CVM注册  :正使用
+    def create_keys_and_certificate(self, request_dict, response):
+        uid = request_dict.get('uid', None)
+        uid_code = request_dict.get('uid_code', None)
+        token = request_dict.get('token', None)
+        time_stamp = request_dict.get('time_stamp', None)
+
+        if uid and token and time_stamp and uid_code:
+            uid_code = CommonService.decode_data(uid_code)
+            token = int(CommonService.decode_data(token))
+            time_stamp = int(time_stamp)
+
+            now_time = int(time.time())
+            distance = now_time - time_stamp
+
+            # if token != time_stamp and distance > 600: 暂时去掉延时
+            #if token != time_stamp or uid != uid_code or distance > 600 :
+                #return response.json(404)
+
+            region_country_qs = Device_Info.objects.filter(UID=uid).values('userID__region_country')
+            if not region_country_qs.exists():
+                return response.json(173)
+
+            region_country_qs = RegionCountryModel.objects.filter(
+                number=region_country_qs[0]['userID__region_country'])
+            if region_country_qs.exists():
+                user_region = region_country_qs[0]
+
+                if user_region.region_id == 1:
+                    iotClient = ChinaIOTClient()
+
+                elif user_region.region_id == 2:
+                    iotClient = AsiaIOTClient()
+
+                elif user_region.region_id == 3:
+                    iotClient = EuropeIOTClient()
+
+                else:
+                    iotClient = AmericaIOTClient()
+
+                res = iotClient.create_keys_and_certificate(uid)
+
+                return response.json(0, {'res': res})
+        else:
+            return response.json(444)

+ 67 - 44
Controller/UserController.py

@@ -861,6 +861,7 @@ class v2registerView(TemplateView):
         authcode = request_dict.get('authcode', None)
         lang = request_dict.get('lang', None)
         unique = request_dict.get('unique', None)
+        number = request_dict.get('number', None)
         if unique:
             delete_local_account(unique)
         response = ResponseObject(lang)
@@ -871,13 +872,13 @@ class v2registerView(TemplateView):
         if authcode is None:
             return response.json(444, 'identifyingCode')
         if phone is not None:
-            return self.do_phone_register(phone, password, authcode, response)
+            return self.do_phone_register(phone, password, authcode, number, response)
         elif email is not None:
-            return self.do_email_register(email, password, authcode, response)
+            return self.do_email_register(email, password, authcode, number, response)
         else:
             return response.json(444, 'phone or email')
 
-    def do_phone_register(self, phone, password, authcode, response):
+    def do_phone_register(self, phone, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.mobile_validate(phone) is not True:
             return response.json(100)
@@ -896,15 +897,19 @@ class v2registerView(TemplateView):
         if phone_qs.exists():
             return response.json(101)
         try:
-            users = Device_User.objects.create(
-                username=phone,
-                NickName=phone,
-                phone=phone,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": phone,
+                "NickName": phone,
+                "phone": phone,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+
+            users = Device_User.objects.create(**create_data)
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -943,7 +948,7 @@ class v2registerView(TemplateView):
         print(res)
         return response.json(0, res)
 
-    def do_email_register(self, email, password, authcode, response):
+    def do_email_register(self, email, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.email_validate(email) is not True:
             return response.json(105)
@@ -962,15 +967,18 @@ class v2registerView(TemplateView):
         if email_qs.exists():
             return response.json(103)
         try:
-            users = Device_User.objects.create(
-                username=email,
-                NickName=email,
-                userEmail=email,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": email,
+                "NickName": email,
+                "userEmail": email,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+            users = Device_User.objects.create(**create_data)
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -1004,6 +1012,8 @@ class v3registerView(TemplateView):
         authcode = request_dict.get('authcode', None)
         lang = request_dict.get('lang', None)
         unique = request_dict.get('unique', None)
+        number = request_dict.get('number', None)
+
         if unique:
             delete_local_account(unique)
         response = ResponseObject(lang)
@@ -1050,13 +1060,13 @@ class v3registerView(TemplateView):
             if authcode is None:
                 return response.json(444, 'identifyingCode')
             if phone is not None:
-                return self.do_phone_register(phone, password, authcode, response)
+                return self.do_phone_register(phone, password, authcode, number, response)
             elif email is not None:
-                return self.do_email_register(email, password, authcode, response)
+                return self.do_email_register(email, password, authcode, number, response)
             else:
                 return response.json(444, 'phone or email')
 
-    def do_phone_register(self, phone, password, authcode, response):
+    def do_phone_register(self, phone, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.mobile_validate(phone) is not True:
             return response.json(100)
@@ -1075,15 +1085,20 @@ class v3registerView(TemplateView):
         if phone_qs.exists():
             return response.json(101)
         try:
-            users = Device_User.objects.create(
-                username=phone,
-                NickName=phone,
-                phone=phone,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": phone,
+                "NickName": phone,
+                "phone": phone,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+
+            users = Device_User.objects.create(**create_data)
+
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -1121,7 +1136,7 @@ class v3registerView(TemplateView):
         res['phone'] = user_list[0]["phone"] if user_list[0]["phone"] is not None else ''
         return response.json(0, res)
 
-    def do_email_register(self, email, password, authcode, response):
+    def do_email_register(self, email, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.email_validate(email) is not True:
             return response.json(105)
@@ -1135,20 +1150,25 @@ class v3registerView(TemplateView):
         # 验证码是否正确
         if authcode != identifyingCode:
             return response.json(121)
+
         email_qs = Device_User.objects.filter(Q(userEmail=email) | Q(username=email))
         # 是否已存在
         if email_qs.exists():
             return response.json(103)
         try:
-            users = Device_User.objects.create(
-                username=email,
-                NickName=email,
-                userEmail=email,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": email,
+                "NickName": email,
+                "userEmail": email,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+            users = Device_User.objects.create(**create_data)
+
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -2918,6 +2938,7 @@ class Image_Code_RegisterView(TemplateView):
         response = ResponseObject(lang)
         valid_code = request_dict.get('id_v_code', None)
         unique = request_dict.get('unique', None)
+        number = request_dict.get('number', None)
         if unique:
             delete_local_account(unique)
         if not all([userEmail, password, lang, imageCodeId, valid_code]):
@@ -2994,6 +3015,8 @@ class Image_Code_RegisterView(TemplateView):
             "is_active": True,
             "user_isValid": True,
         }
+        if number:
+            create_data["region_country"] = number
         users = Device_User.objects.create(**create_data)
         return self.do_login(email_qs, response)
 

+ 265 - 0
Object/IOTCore/IotObject.py

@@ -1,5 +1,6 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
+import json
 from abc import ABCMeta,abstractmethod
 
 import boto3
@@ -15,6 +16,10 @@ class IOTObject(metaclass=ABCMeta):
     def create_provisioning_claim(self, templateName):
         pass
 
+    @abstractmethod
+    def create_keys_and_certificate(self, uid):
+        pass
+
 
 class ChinaIOTClient(IOTObject):
 
@@ -34,7 +39,72 @@ class ChinaIOTClient(IOTObject):
             'privateKey': result['keyPair']['PrivateKey'],
             'endpoint': 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
         }
+        return res
+
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
 
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
         return res
 
 
@@ -56,7 +126,72 @@ class AmericaIOTClient(IOTObject):
             'privateKey': result['keyPair']['PrivateKey'],
             'endpoint': 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
         }
+        return res
 
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
+
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
         return res
 
 
@@ -77,7 +212,72 @@ class AsiaIOTClient(IOTObject):
             'privateKey': result['keyPair']['PrivateKey'],
             'endpoint': 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
         }
+        return res
+
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
 
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
         return res
 
 
@@ -98,5 +298,70 @@ class EuropeIOTClient(IOTObject):
             'privateKey': result['keyPair']['PrivateKey'],
             'endpoint': 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
         }
+        return res
+
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
 
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
         return res