|
@@ -5,11 +5,15 @@
|
|
|
@File :KVSController.py
|
|
|
"""
|
|
|
import hashlib
|
|
|
+import json
|
|
|
import time
|
|
|
import uuid
|
|
|
import datetime
|
|
|
|
|
|
import boto3
|
|
|
+import botocore
|
|
|
+import requests
|
|
|
+from botocore.awsrequest import AWSRequest
|
|
|
from django.http import HttpResponse
|
|
|
from django.views import View
|
|
|
|
|
@@ -17,8 +21,11 @@ from Model.models import KVS, Device_User, Device_Info
|
|
|
from Object.AWS.AmazonKinesisVideoUtil import AmazonKinesisVideoObject, AmazonKVAMObject
|
|
|
from Object.RedisObject import RedisObject
|
|
|
from Object.ResponseObject import ResponseObject
|
|
|
-from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN
|
|
|
+from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN, KVS_ENDPOINT, LOGGER
|
|
|
from Object.TokenObject import TokenObject
|
|
|
+from botocore.auth import SigV4Auth
|
|
|
+from botocore.awsrequest import AWSRequest
|
|
|
+from botocore.credentials import Credentials
|
|
|
|
|
|
|
|
|
class UserRelatedView(View):
|
|
@@ -258,6 +265,8 @@ class KVSView(View):
|
|
|
return self.get_sts_token(request_dict, response)
|
|
|
elif operation == 'create-signaling-channel': # 新增通道
|
|
|
return self.create_signaling_channel(request_dict, response)
|
|
|
+ elif operation == 'SendAlexaOfferToMaster': # 发送Alexa offer
|
|
|
+ return self.send_alexa_offer_to_master(request_dict, response)
|
|
|
else:
|
|
|
# tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
|
|
|
# if tko.code != 0:
|
|
@@ -323,7 +332,7 @@ class KVSView(View):
|
|
|
try:
|
|
|
kvs_qs = KVS.objects.filter(stream_name=serial_number)
|
|
|
if not kvs_qs.exists():
|
|
|
- return response.json(174)
|
|
|
+ return response.json(173)
|
|
|
kinesis_video_obj = AmazonKinesisVideoObject(
|
|
|
aws_access_key_id=ACCESS_KEY_ID,
|
|
|
secret_access_key=SECRET_ACCESS_KEY,
|
|
@@ -508,7 +517,6 @@ class KVSView(View):
|
|
|
print(e)
|
|
|
return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
|
|
|
-
|
|
|
@staticmethod
|
|
|
def create_signaling_channel(request_dict, response):
|
|
|
"""
|
|
@@ -532,3 +540,63 @@ class KVSView(View):
|
|
|
except Exception as e:
|
|
|
print(e)
|
|
|
return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def send_alexa_offer_to_master(request_dict, response):
|
|
|
+ """
|
|
|
+ 发送Alexa offer
|
|
|
+ @param request_dict: 请求参数
|
|
|
+ @request_dict serial: 序列号
|
|
|
+ @param response: 响应对象
|
|
|
+ @return: response
|
|
|
+ """
|
|
|
+ serial = request_dict.get('serial', None)
|
|
|
+ sdp_offer = request_dict.get('sdp_offer', None)
|
|
|
+ if not all([serial, sdp_offer]):
|
|
|
+ return response.json(444)
|
|
|
+ try:
|
|
|
+ kvs_qs = KVS.objects.filter(stream_name=serial).values('channel_arn')
|
|
|
+ if not kvs_qs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ channel_arn = kvs_qs[0]['channel_arn']
|
|
|
+
|
|
|
+ client = boto3.client(
|
|
|
+ 'kinesisvideo',
|
|
|
+ aws_access_key_id=ACCESS_KEY_ID,
|
|
|
+ aws_secret_access_key=SECRET_ACCESS_KEY,
|
|
|
+ config=botocore.client.Config(signature_version='s3v4'),
|
|
|
+ region_name='cn-north-1'
|
|
|
+ )
|
|
|
+ res = client.get_signaling_channel_endpoint(
|
|
|
+ ChannelARN=channel_arn,
|
|
|
+ SingleMasterChannelEndpointConfiguration={
|
|
|
+ 'Protocols': ['HTTPS'],
|
|
|
+ 'Role': 'VIEWER'
|
|
|
+ }
|
|
|
+ )
|
|
|
+ print(res)
|
|
|
+ endpoint = res['ResourceEndpointList'][0]['ResourceEndpoint']
|
|
|
+ url = '{}/v1/send-alexa-offer-to-master'.format(endpoint)
|
|
|
+ # 构造请求 body
|
|
|
+ payload = {
|
|
|
+ 'ChannelARN': channel_arn,
|
|
|
+ 'SenderClientId': 'alexa-client-id', # 任意唯一标识
|
|
|
+ 'MessagePayload': sdp_offer
|
|
|
+ }
|
|
|
+
|
|
|
+ # 构造 AWSRequest 并签名
|
|
|
+ url = f'{endpoint}/v1/send-alexa-offer-to-master'
|
|
|
+ req = AWSRequest(method='POST', url=url, data=json.dumps(payload))
|
|
|
+ credentials = Credentials(ACCESS_KEY_ID, SECRET_ACCESS_KEY)
|
|
|
+ SigV4Auth(credentials, 'kinesisvideo', 'cn-north-1').add_auth(req)
|
|
|
+
|
|
|
+ # 使用 requests 发送签名后的请求
|
|
|
+ headers = dict(req.headers)
|
|
|
+ headers['Content-Type'] = 'application/json'
|
|
|
+
|
|
|
+ r = requests.post(url, headers=headers, data=json.dumps(payload))
|
|
|
+ assert r.status_code == 200
|
|
|
+ LOGGER.info('SendAlexaOfferToMaster响应: {}'.format(r.json()))
|
|
|
+ return response.json(0)
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|