Procházet zdrojové kódy

创建/删除信号通道接口

locky před 1 měsícem
rodič
revize
7e15046d61

+ 47 - 23
Controller/AWS/KVSController.py

@@ -265,10 +265,12 @@ class KVSView(View):
             return self.update_data_retention(request_dict, response)
         elif operation == 'get-sts-token':  # 获取临时token
             return self.get_sts_token(request_dict, response)
-        elif operation == 'create-signaling-channel':  # 新增通道
-            return self.create_signaling_channel(request_dict, response)
+        elif operation == 'createSignalChannel':  # 创建通道
+            return self.create_signal_channel(request_dict, response)
         elif operation == 'SendAlexaOfferToMaster':  # 发送Alexa offer
             return self.send_alexa_offer_to_master(request_dict, response)
+        elif operation == 'deleteSignalChannel':  # 删除通道
+            return self.delete_signal_channel(request_dict, response)
         else:
             # tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
             # if tko.code != 0:
@@ -520,27 +522,31 @@ class KVSView(View):
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
-    def create_signaling_channel(request_dict, response):
+    def create_signal_channel(request_dict, response):
         """
-        获取临时token
+        创建信号通道
         @param request_dict: 请求参数
-        @request_dict uid: 设备uid
+        @request_dict serial: 序列号
         @param response: 响应对象
         @return: response
         """
-        uid = request_dict.get('uid', None)
-        if not all([uid]):
+        serial = request_dict.get('serial', None)
+        if not all([serial]):
             return response.json(444)
         try:
-            sts_client_conn = AmazonKinesisVideoObject(
+            kinesis_video_obj = AmazonKinesisVideoObject(
                 aws_access_key_id=ACCESS_KEY_ID,
                 secret_access_key=SECRET_ACCESS_KEY,
                 region_name=KVS_REGION
             )
-            sts_client_conn.create_signaling_channel(channel_name=uid)
+            channel_arn = kinesis_video_obj.create_signaling_channel(channel_name=serial)
+            now_time = int(time.time())
+            KVS.objects.create(
+                channel_name=serial, channel_arn=channel_arn, channel_ttl=60,
+                created_time=now_time, updated_time=now_time
+            )
             return response.json(0)
         except Exception as e:
-            print(e)
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @classmethod
@@ -565,22 +571,12 @@ class KVSView(View):
                 return response.json(173)
             channel_arn = kvs_qs[0]['channel_arn']
 
-            client = boto3.client(
-                'kinesisvideo',
+            kinesis_video_obj = AmazonKinesisVideoObject(
                 aws_access_key_id=ACCESS_KEY_ID,
-                aws_secret_access_key=SECRET_ACCESS_KEY,
-                config=botocore.client.Config(signature_version='s3v4'),
+                secret_access_key=SECRET_ACCESS_KEY,
                 region_name=KVS_REGION
             )
-            res = client.get_signaling_channel_endpoint(
-                ChannelARN=channel_arn,
-                SingleMasterChannelEndpointConfiguration={
-                    'Protocols': ['HTTPS'],
-                    'Role': 'MASTER'
-                }
-            )
-            print(res)
-            endpoint = res['ResourceEndpointList'][0]['ResourceEndpoint']
+            endpoint = kinesis_video_obj.get_signaling_channel_endpoint(channel_arn)
             url = '{}/v1/send-alexa-offer-to-master'.format(endpoint)
             # 构造请求 body
             client_id = hashlib.md5((str(uuid.uuid1()) + str(int(time.time()))).encode('utf-8')).hexdigest()
@@ -637,3 +633,31 @@ class KVSView(View):
     def base64_to_dict(encoded_str: str) -> dict:
         decoded_bytes = base64.b64decode(encoded_str)
         return json.loads(decoded_bytes.decode('utf-8'))
+
+    @staticmethod
+    def delete_signal_channel(request_dict, response):
+        """
+        删除信号通道
+        @param request_dict: 请求参数
+        @request_dict serial: 序列号
+        @param response: 响应对象
+        @return: response
+        """
+        serial = request_dict.get('serial', None)
+        if not all([serial]):
+            return response.json(444)
+        try:
+            kvs = KVS.objects.filter(channel_name=serial).first()
+            if not kvs:
+                return response.json(173)
+            channel_arn = kvs.channel_arn
+            kinesis_video_obj = AmazonKinesisVideoObject(
+                aws_access_key_id=ACCESS_KEY_ID,
+                secret_access_key=SECRET_ACCESS_KEY,
+                region_name=KVS_REGION
+            )
+            kinesis_video_obj.delete_signaling_channel(channel_arn=channel_arn)
+            kvs.delete()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 25 - 1
Object/AWS/AmazonKinesisVideoUtil.py

@@ -78,9 +78,33 @@ class AmazonKinesisVideoObject:
         """
         创建通道
         @param channel_name: 通道名称
+        """
+        res = self.client_conn.create_signaling_channel(ChannelName=channel_name)
+        channel_arn = res['ChannelARN']
+        return channel_arn
+
+    def get_signaling_channel_endpoint(self, channel_arn):
+        """
+        创建通道
+        @param channel_arn: 通道arn
         @return stream_info: 视频流信息数据
         """
-        return self.client_conn.create_signaling_channel(ChannelName=channel_name)
+        res = self.client_conn.get_signaling_channel_endpoint(
+            ChannelARN=channel_arn,
+            SingleMasterChannelEndpointConfiguration={
+                'Protocols': ['HTTPS'],
+                'Role': 'MASTER'
+            }
+        )
+        endpoint = res['ResourceEndpointList'][0]['ResourceEndpoint']
+        return endpoint
+
+    def delete_signaling_channel(self, channel_arn):
+        """
+        删除通道
+        @return channel_arn: 通道ARN
+        """
+        self.client_conn.delete_signaling_channel(ChannelARN=channel_arn)
 
 
 class AmazonKVAMObject: