locky 2 anni fa
parent
commit
4eb6e4151e

+ 12 - 0
Ansjer/server_urls/kvs_url.py

@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+"""
+@Author : Rocky
+@Time : 2022/10/18 10:23
+@File :kvs_url.py
+"""
+from django.urls import re_path
+from Controller.AWS import KVSController
+
+urlpatterns = [
+    re_path(r'^(?P<operation>.*)$', KVSController.KVSView.as_view()),
+]

+ 2 - 0
Ansjer/urls.py

@@ -356,6 +356,8 @@ urlpatterns = [
     url(r'^unicom/', include("Ansjer.server_urls.unicom_url")),
     # 算法小店
     url(r'^algorithm-shop/', include("Ansjer.server_urls.algorithm_shop_url")),
+    # KVS模块
+    url(r'^kvs/', include("Ansjer.server_urls.kvs_url")),
 
     # 传感器网关
     re_path('sensorGateway/(?P<operation>.*)', SensorGatewayController.SensorGateway.as_view()),

+ 101 - 0
Controller/AWS/KVSController.py

@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+"""
+@Author : Rocky
+@Time : 2022/10/18 9:48
+@File :KVSController.py
+"""
+import time
+
+from django.views import View
+
+from Model.models import KVS
+from Object.AWS.AmazonKVSUtil import AmazonKVSObject
+from Object.AWS.AmazonKinesisVideoUtil import AmazonKinesisVideoObject
+from Object.ResponseObject import ResponseObject
+from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME
+
+class KVSView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        response = ResponseObject()
+        if operation == 'create-media':  # 创建视频流
+            return self.create_media(request_dict, response)
+        elif operation == 'update-data-retention':  # 修改视频流数据保留时间
+            return self.update_data_retention(request_dict, response)
+        else:
+            return response.json(404)
+
+    @staticmethod
+    def create_media(request_dict, response):
+        """
+        创建视频流
+        @param request_dict: 请求参数
+        @request_dict serial_number: 序列号
+        @param response: 响应对象
+        @return: response
+        """
+        serial_number = request_dict.get('serial_number', None)
+
+        try:
+            kvs_qs = KVS.objects.filter(stream_name=serial_number)
+            if kvs_qs.exists():
+                return response.json(174)
+            kinesis_video_obj = AmazonKinesisVideoObject(
+                aws_access_key_id=ACCESS_KEY_ID,
+                secret_access_key=SECRET_ACCESS_KEY,
+                region_name=REGION_NAME
+            )
+            stream_arn = kinesis_video_obj.create_stream(stream_name=serial_number)
+            if stream_arn:
+                now_time = int(time.time())
+                KVS.objects.create(stream_name=serial_number, stream_arn=stream_arn, created_time=now_time,
+                                   updated_time=now_time)
+                return response.json(0)
+            else:
+                return response.json(178)
+        except Exception as e:
+            print(e)
+            return response.json(500)
+
+    @staticmethod
+    def update_data_retention(request_dict, response):
+        """
+        修改视频流数据保留时间
+        @param request_dict: 请求参数
+        @request_dict serial_number: 序列号
+        @request_dict operation: 操作,增加/减少
+        @request_dict data_retention_change_in_hours: 修改的时间
+        @param response: 响应对象
+        @return: response
+        """
+        serial_number = request_dict.get('serial_number', None)
+        operation = request_dict.get('operation', None)
+        data_retention_change_in_hours = request_dict.get('data_retention_change_in_hours', None)
+
+        try:
+            kvs_qs = KVS.objects.filter(stream_name=serial_number)
+            if not kvs_qs.exists():
+                return response.json(174)
+            kinesis_video_obj = AmazonKinesisVideoObject(
+                aws_access_key_id=ACCESS_KEY_ID,
+                secret_access_key=SECRET_ACCESS_KEY,
+                region_name=REGION_NAME
+            )
+            now_time = int(time.time())
+            data_retention_change_in_hours = int(data_retention_change_in_hours)
+            kinesis_video_obj.update_data_retention(stream_name=serial_number, operation=operation,
+                                                    data_retention_change_in_hours=data_retention_change_in_hours)
+            kvs_qs.update(data_retention_in_hours=data_retention_change_in_hours, updated_time=now_time)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500)

+ 1 - 0
Model/models.py

@@ -3011,6 +3011,7 @@ class KVS(models.Model):
     stream_arn = models.CharField(default='', max_length=128, verbose_name='视频流ARN')
     data_retention_in_hours = models.PositiveSmallIntegerField(default=0, verbose_name='数据保留时间')    # 单位: 小时
     created_time = models.IntegerField(default=0, verbose_name='创建时间')
+    updated_time = models.IntegerField(default=0, verbose_name='更新时间')
 
     class Meta:
         db_table = 'kvs'

+ 34 - 0
Object/AWS/AmazonKVSUtil.py

@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+"""
+@Author : Rocky
+@Time : 2022/10/17 16:57
+@File :AmazonKVSUtil.py
+"""
+import boto3
+
+
+class AmazonKVSObject:
+    def __init__(self, aws_access_key_id, secret_access_key, region_name):
+        self.access_id = aws_access_key_id
+        self.access_secret = secret_access_key
+        self.region_name = region_name
+        self.client_conn = boto3.client(
+            'kinesis-video-media',
+            aws_access_key_id=aws_access_key_id,
+            aws_secret_access_key=secret_access_key,
+            region_name=region_name
+        )
+
+    def get_media(self, stream_name):
+        """
+        获取视频流数据保留时间
+        @param stream_name: 视频流名称
+        @param shard_count: 碎片数量
+        @return : boolean
+        """
+        try:
+            self.client_conn.get_media(StreamName=stream_name)
+            return True
+        except Exception as e:
+            print(e)
+            return False

+ 54 - 0
Object/AWS/AmazonKinesisVideoUtil.py

@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+"""
+@Author : Rocky
+@Time : 2022/10/18 17:13
+@File :AmazonKinesisVideoUtil.py
+"""
+import boto3
+
+
+class AmazonKinesisVideoObject:
+    """
+    Amazon Kinesis Video Streams对象
+    api文档链接: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kinesisvideo.html
+    """
+    def __init__(self, aws_access_key_id, secret_access_key, region_name):
+        self.access_id = aws_access_key_id
+        self.access_secret = secret_access_key
+        self.region_name = region_name
+        self.client_conn = boto3.client(
+            'kinesisvideo',
+            aws_access_key_id=aws_access_key_id,
+            aws_secret_access_key=secret_access_key,
+            region_name=region_name
+        )
+
+    def create_stream(self, stream_name):
+        """
+        创建视频流
+        @param stream_name: 视频流名称
+        @return : stream_arn or False
+        """
+        tags = {'project_kvs': 'kvs'}
+        try:
+            stream_arn = self.client_conn.create_stream(StreamName=stream_name, Tags=tags)['StreamARN']
+            return stream_arn
+        except Exception as e:
+            print(e)
+            return False
+
+    def update_data_retention(self, stream_name, operation, data_retention_change_in_hours):
+        """
+        修改视频流数据保留时间
+        @param stream_name: 视频流名称
+        @param operation: 增加/减少, 'INCREASE_DATA_RETENTION'|'DECREASE_DATA_RETENTION'
+        @param data_retention_change_in_hours: 修改的时间
+        @return : True or False
+        """
+        try:
+            self.client_conn.update_data_retention(StreamName=stream_name, Operation=operation,
+                                                   DataRetentionChangeInHours=data_retention_change_in_hours)
+            return True
+        except Exception as e:
+            print(e)
+            return False