Forráskód Böngészése

发送Alexa offer接口

locky 2 hónapja
szülő
commit
e90027cfe3
2 módosított fájl, 84 hozzáadás és 12 törlés
  1. 13 9
      Ansjer/cn_config/config_test.py
  2. 71 3
      Controller/AWS/KVSController.py

+ 13 - 9
Ansjer/cn_config/config_test.py

@@ -10,15 +10,16 @@ AWS相关
 """
 # ======================================================================================================================
 # aws api key
-# AWS_ARN_S3 = 'arn:aws-cn:s3'
-# REGION_NAME = 'cn-northwest-1'
-# ACCESS_KEY_ID = 'AKIA2MMWBR4DSFG67DTG'
-# SECRET_ACCESS_KEY = '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'
-AWS_ARN_S3 = 'arn:aws:s3'
-REGION_NAME = 'us-east-1'
-REGION_NAME2 = 'us-west-1'
-ACCESS_KEY_ID = 'AKIA2E67UIMD45Y3HL53'
-SECRET_ACCESS_KEY = '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'
+AWS_ARN_S3 = 'arn:aws-cn:s3'
+REGION_NAME = 'cn-northwest-1'
+REGION_NAME2 = 'cn-north-1'
+ACCESS_KEY_ID = 'AKIA2MMWBR4DSFG67DTG'
+SECRET_ACCESS_KEY = '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'
+# AWS_ARN_S3 = 'arn:aws:s3'
+# REGION_NAME = 'us-east-1'
+# REGION_NAME2 = 'us-west-1'
+# ACCESS_KEY_ID = 'AKIA2E67UIMD45Y3HL53'
+# SECRET_ACCESS_KEY = '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'
 
 # 存储桶
 PUSH_BUCKET = 'foreignpush'  # 推送存储桶
@@ -44,6 +45,9 @@ DETECT_PUSH_DOMAIN_JIUAN = 'http://jiuan.push.dvema.com/'
 DETECT_PUSH_DOMAINS_JIUAN = 'https://jiuan.push.dvema.com/'
 TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
 
+# AWS域名节点
+KVS_ENDPOINT = 'kinesisvideo.cn-north-1.amazonaws.com.cn'
+
 # token的secret
 OAUTH_ACCESS_TOKEN_SECRET = 'test_a+jbgnw%@1%zy^=@dn62%'
 OAUTH_REFRESH_TOKEN_SECRET = 'test_r+jbgnw%@1%zy^=@dn62%'

+ 71 - 3
Controller/AWS/KVSController.py

@@ -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)))