Bladeren bron

优化创建/删除信令通道代码

locky 1 maand geleden
bovenliggende
commit
5ececb50e2
3 gewijzigde bestanden met toevoegingen van 40 en 10 verwijderingen
  1. 1 1
      Controller/AWS/KVSController.py
  2. 1 1
      Model/models.py
  3. 38 8
      Object/AWS/AmazonKinesisVideoUtil.py

+ 1 - 1
Controller/AWS/KVSController.py

@@ -668,7 +668,7 @@ class KVSView(View):
             return response.json(444)
         try:
             channel_name = 'Ansjer_Device_{}'.format(serial)
-            kvs = KVS.objects.filter(channel_name=serial).first()
+            kvs = KVS.objects.filter(channel_name=channel_name).first()
             if not kvs:
                 return response.json(173)
             channel_arn = kvs.channel_arn

+ 1 - 1
Model/models.py

@@ -4334,7 +4334,7 @@ class KVS(models.Model):
     stream_name = models.CharField(default='', max_length=32, verbose_name='视频流名称')  # 视频流名称,为序列号
     stream_arn = models.CharField(default='', max_length=128, verbose_name='视频流ARN')
     data_retention_in_hours = models.PositiveSmallIntegerField(default=0, verbose_name='数据保留时间')  # 单位: 小时
-    channel_name = models.CharField(default='', max_length=32, verbose_name='信号通道名称')
+    channel_name = models.CharField(default='', max_length=32, unique=True, verbose_name='信号通道名称')
     channel_arn = models.CharField(default='', max_length=128, verbose_name='信号通道ARN')
     channel_ttl = models.PositiveSmallIntegerField(default=0, verbose_name='生存时间')  # 单位: 秒
     created_time = models.IntegerField(default=0, verbose_name='创建时间')

+ 38 - 8
Object/AWS/AmazonKinesisVideoUtil.py

@@ -4,9 +4,9 @@
 @Time : 2022/10/18 17:13
 @File :AmazonKinesisVideoUtil.py
 """
-import datetime
-
 import boto3
+import datetime
+from Ansjer.config import LOGGER
 
 
 class AmazonKinesisVideoObject:
@@ -76,12 +76,28 @@ class AmazonKinesisVideoObject:
 
     def create_signaling_channel(self, channel_name):
         """
-        创建通道
+        创建通道,如果通道已存在则直接返回其ARN
         @param channel_name: 通道名称
+        @return: channel_arn: 通道ARN
         """
-        res = self.client_conn.create_signaling_channel(ChannelName=channel_name)
-        channel_arn = res['ChannelARN']
-        return channel_arn
+        try:
+            # 先检查信令通道是否已存在
+            response = self.client_conn.describe_signaling_channel(ChannelName=channel_name)
+            # 如果通道存在,直接返回其ARN
+            channel_arn = response['ChannelInfo']['ChannelARN']
+            return channel_arn
+        except self.client_conn.exceptions.ResourceNotFoundException:
+            # 通道不存在,创建新通道
+            res = self.client_conn.create_signaling_channel(ChannelName=channel_name)
+            channel_arn = res['ChannelARN']
+            return channel_arn
+        except Exception as e:
+            # 处理其他可能的异常
+            LOGGER.info('创建通道异常,error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            # 尝试创建通道
+            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):
         """
@@ -102,9 +118,23 @@ class AmazonKinesisVideoObject:
     def delete_signaling_channel(self, channel_arn):
         """
         删除通道
-        @return channel_arn: 通道ARN
+        @param channel_arn: 通道ARN
+        @return: True 删除成功,False 删除失败或通道不存在
         """
-        self.client_conn.delete_signaling_channel(ChannelARN=channel_arn)
+        try:
+            # 先检查信令通道是否存在
+            self.client_conn.describe_signaling_channel(ChannelARN=channel_arn)
+            # 通道存在,执行删除操作
+            self.client_conn.delete_signaling_channel(ChannelARN=channel_arn)
+            return True
+        except self.client_conn.exceptions.ResourceNotFoundException:
+            # 通道不存在,记录日志并返回
+            LOGGER.info('删除通道失败:通道不存在,channel_arn: {}'.format(channel_arn))
+            return False
+        except Exception as e:
+            # 处理其他可能的异常
+            LOGGER.info('删除通道异常,error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
 
 
 class AmazonKVAMObject: