chenshibin 3 жил өмнө
parent
commit
23f62a4f6e

+ 7 - 0
Ansjer/config.py

@@ -136,6 +136,13 @@ AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA = 'ap-southeast-1'
 AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE = 'eu-west-1'
 AWS_IOT_SES_ACCESS_FOREIGN_ROLE = 'arn:aws:iam::697864307463:role/Ansjer_Iot_Admin'
 
+# Iot 获取上传S3日志 key国外
+AWS_IOT_GETS3_PULL_FOREIGN_ID = 'AKIA2E67UIMDZSLTUD22'
+AWS_IOT_GETS3_PULL_FOREIGN_SECRET = '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'
+
+# Iot 获取上传S3日志 key国内
+AWS_IOT_GETS3_PULL_CHINA_ID = 'AKIA2MMWBR4D3F4IEZE5'
+AWS_IOT_GETS3_PULL_CHINA_SECRET = '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'
 
 # Iot Core国内
 AWS_IOT_SES_ACCESS_CHINA_ID = 'AKIA2MMWBR4DUUYPCFNJ'

+ 105 - 1
Controller/IotCoreController.py

@@ -9,7 +9,8 @@ import boto3
 import requests
 
 from django.views import View
-from Ansjer.config import BASE_DIR
+from Ansjer.config import BASE_DIR, 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
 from base64 import b64encode, encodebytes
 from Controller.DeviceConfirmRegion import Device_Region
 from Model.models import Device_User, Device_Info, iotdeviceInfoModel, UIDCompanySerialModel, \
@@ -44,6 +45,8 @@ class IotCoreView(View):
             return self.create_keys_and_certificate(request_dict, response, request)
         elif operation == 'requestPublishMessage':
             return self.request_publish_message(request_dict, response, request)
+        elif operation == 'getS3PullKey':
+            return self.get_s3_pull_key(request_dict, response, request)
         elif operation == 'thingRegroup':
             return self.thing_regroup(request_dict, response, request)
         else:
@@ -280,6 +283,107 @@ class IotCoreView(View):
             # print(e)
             return response.json(500, repr(e))
 
+    def request_publish_mqtt(self, request_dict, response, request):
+        # 通用发布主题通知
+        UID = request_dict.get('UID', None)
+        MSG = request_dict.get('MSG', None)
+        return_topic_name = request_dict.get('return_topic_name', None)
+        if not all([UID, MSG]):
+            return response.json(444)
+
+        try:
+            # 获取检查uid的序列号,如果没有序列号,不使用MQTT下发消息
+            device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
+            if not device_info_qs.exists():
+                return response.json(10043)
+            uid = device_info_qs[0]['UID']
+            serial_number = device_info_qs[0]['serial_number']
+            # 如果device_info表的serial_number不为空,物品名为'Ansjer_Device_序列号'
+            thing_name_suffix = serial_number if serial_number != '' else uid
+            # 获取数据组织将要请求的url
+            iot = iotdeviceInfoModel.objects.filter(thing_name__contains=thing_name_suffix).values('thing_name',
+                                                                                                   'endpoint',
+                                                                                                   'token_iot_number')
+            if not iot.exists():
+                return response.json(10043)
+            thing_name = iot[0]['thing_name'][14:]  # IoT core上的物品名: Ansjer_Device_ + 序列号+企业编码/uid
+            endpoint = iot[0]['endpoint']
+            Token = iot[0]['token_iot_number']
+            # Token = '297a601b3925e04daab5a60280650e09'
+            topic_name = thing_name + return_topic_name     # MQTT主题
+            if return_topic_name == 'get_s3_key_return':
+                MSG = self.get_s3_key_return_msg(endpoint)
+
+            # 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
+            # post请求url来发布MQTT消息
+            url = 'https://{}/topics/{}'.format(endpoint, topic_name)
+            authorizer_name = 'Ansjer_Iot_Auth'
+            signature = self.rsa_sign(Token)  # Token签名
+            headers = {'x-amz-customauthorizer-name': authorizer_name, 'Token': Token,
+                       'x-amz-customauthorizer-signature': signature}
+            params = {'command': MSG}
+            r = requests.post(url=url, headers=headers, json=params, timeout=2)
+            if r.status_code == 200:
+                res = r.json()
+                if res['message'] == 'OK':
+                    return response.json(0)
+                return response.json(10044)
+            else:
+                # print('发布失败')
+                return response.json(10044)
+        except Exception as e:
+            # print(e)
+            return response.json(500, repr(e))
+
+    def get_s3_pull_key(self, request_dict, response, request):
+        # 通用发布主题通知
+        UID = request_dict.get('UID', None)
+        if not all([UID]):
+            return response.json(444)
+
+        try:
+            # 获取检查uid的序列号,如果没有序列号,不使用MQTT下发消息
+            device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
+            if not device_info_qs.exists():
+                return response.json(10043)
+            uid = device_info_qs[0]['UID']
+            serial_number = device_info_qs[0]['serial_number']
+            # 如果device_info表的serial_number不为空,物品名为'Ansjer_Device_序列号'
+            thing_name_suffix = serial_number if serial_number != '' else uid
+            # 获取数据组织将要请求的url
+            iot = iotdeviceInfoModel.objects.filter(thing_name__contains=thing_name_suffix).values('thing_name',
+                                                                                                   'endpoint',
+                                                                                                   'token_iot_number')
+            if not iot.exists():
+                return response.json(10043)
+            endpoint = iot[0]['endpoint']
+            MSG = self.get_s3_key_return_msg(endpoint)
+
+            return response.json(MSG)
+        except Exception as e:
+            # print(e)
+            return response.json(500, repr(e))
+
+    def get_s3_key_return_msg(self,endpoint):
+        MSG = {}
+        if endpoint == 'cn-northwest-1':
+            key = AWS_IOT_GETS3_PULL_CHINA_ID
+            secret = AWS_IOT_GETS3_PULL_CHINA_SECRET
+            arn = AWS_ARN[0]
+        else:
+            key = AWS_IOT_GETS3_PULL_FOREIGN_ID
+            secret = AWS_IOT_GETS3_PULL_FOREIGN_SECRET
+            arn = AWS_ARN[1]
+
+        MSG['AccessKeyId'] = key
+        MSG['AccessKeySecret'] = secret
+        MSG['endpoint'] = endpoint
+        MSG['bucket_name'] = 'asj-log'
+        MSG['arn'] = arn
+        return MSG
+
+
     def rsa_sign(self, Token):
         # 私钥签名Token
         private_key_file = '''-----BEGIN RSA PRIVATE KEY-----