|
@@ -9,7 +9,8 @@ import boto3
|
|
import requests
|
|
import requests
|
|
|
|
|
|
from django.views import View
|
|
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 base64 import b64encode, encodebytes
|
|
from Controller.DeviceConfirmRegion import Device_Region
|
|
from Controller.DeviceConfirmRegion import Device_Region
|
|
from Model.models import Device_User, Device_Info, iotdeviceInfoModel, UIDCompanySerialModel, \
|
|
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)
|
|
return self.create_keys_and_certificate(request_dict, response, request)
|
|
elif operation == 'requestPublishMessage':
|
|
elif operation == 'requestPublishMessage':
|
|
return self.request_publish_message(request_dict, response, request)
|
|
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':
|
|
elif operation == 'thingRegroup':
|
|
return self.thing_regroup(request_dict, response, request)
|
|
return self.thing_regroup(request_dict, response, request)
|
|
else:
|
|
else:
|
|
@@ -280,6 +283,107 @@ class IotCoreView(View):
|
|
# print(e)
|
|
# print(e)
|
|
return response.json(500, repr(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):
|
|
def rsa_sign(self, Token):
|
|
# 私钥签名Token
|
|
# 私钥签名Token
|
|
private_key_file = '''-----BEGIN RSA PRIVATE KEY-----
|
|
private_key_file = '''-----BEGIN RSA PRIVATE KEY-----
|