KVSController.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Author : Rocky
  4. @Time : 2022/10/18 9:48
  5. @File :KVSController.py
  6. """
  7. import hashlib
  8. import time
  9. import uuid
  10. from django.views import View
  11. from Model.models import KVS, Device_User
  12. from Object.AWS.AmazonKVSUtil import AmazonKVSObject
  13. from Object.AWS.AmazonKVAMUtil import AmazonKVAMObject
  14. from Object.AWS.AmazonKinesisVideoUtil import AmazonKinesisVideoObject
  15. from Object.RedisObject import RedisObject
  16. from Object.ResponseObject import ResponseObject
  17. from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN
  18. from Service.CommonService import CommonService
  19. class UserRelatedView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, operation, request)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, operation, request)
  28. def validation(self, request_dict, operation, request):
  29. response = ResponseObject()
  30. if operation == 'generate-qr-code': # 网页生成二维码
  31. return self.generate_qr_code(request_dict, response)
  32. elif operation == 'web-login': # 网页登录
  33. return self.web_login(request_dict, request, response)
  34. elif operation == 'confirm-login': # app确认登录
  35. return self.confirm_login(request_dict, response)
  36. else:
  37. return response.json(404)
  38. @staticmethod
  39. def generate_qr_code(request_dict, response):
  40. """
  41. 网页生成二维码
  42. @param request_dict: 请求参数
  43. @param response: 响应对象
  44. @return: response
  45. """
  46. nwo_time = time.time()
  47. redis_obj = RedisObject()
  48. try:
  49. uuid_number = hashlib.md5((str(uuid.uuid1()) + str(nwo_time)).encode('utf-8')).hexdigest()
  50. flag = redis_obj.set_ex_data(uuid_number, 0, 300)
  51. res = {'type': 'autologin', 'id': uuid_number}
  52. if flag:
  53. return response.json(0, res)
  54. else:
  55. return response.json(119)
  56. except Exception as e:
  57. print(e)
  58. return response.json(500)
  59. @staticmethod
  60. def web_login(request_dict, request, response):
  61. """
  62. 网页登录
  63. @param request_dict: 请求参数
  64. @request_dict serial_number: 序列号
  65. @param response: 响应对象
  66. @return: response
  67. """
  68. uuid_number = request_dict.get('uuid', None)
  69. if not uuid_number:
  70. return response.json(444, {'error param': 'uuid'})
  71. try:
  72. redis_obj = RedisObject()
  73. status = redis_obj.get_data(uuid_number)
  74. if status == '0':
  75. return response.json(18)
  76. elif status is False:
  77. return response.json(119)
  78. redis_obj.del_data(uuid_number)
  79. token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
  80. device_user_qs = Device_User.objects.filter(userID=user_id).values('NickName', 'userIconPath', 'userIconUrl')
  81. if not device_user_qs.exists():
  82. user_icon_url = ''
  83. nick_name = ''
  84. else:
  85. users = device_user_qs.first()
  86. nick_name = users['NickName']
  87. user_icon_path = str(users['userIconPath'])
  88. if user_icon_path and user_icon_path.find('static/') != -1:
  89. user_icon_path = user_icon_path.replace('static/', '').replace('\\', '/')
  90. user_icon_url = SERVER_DOMAIN + 'account/getAvatar/' + user_icon_path
  91. else:
  92. user_icon_url = ''
  93. return response.json(0, {'token': status, 'userIconUrl': user_icon_url, 'nickName': nick_name})
  94. except Exception as e:
  95. print(e)
  96. return response.json(500)
  97. @staticmethod
  98. def confirm_login(request_dict, response):
  99. """
  100. app确认登录
  101. @param request_dict: 请求参数
  102. @request_dict serial_number: 序列号
  103. @param response: 响应对象
  104. @return: response
  105. """
  106. uuid_number = request_dict.get('uuid', None)
  107. token = request_dict.get('token', None)
  108. if not all([uuid_number, token]):
  109. return response.json(444, {'error param': 'uuid or token'})
  110. redis_obj = RedisObject()
  111. try:
  112. status = redis_obj.get_data(uuid_number)
  113. if status is False:
  114. return response.json(119)
  115. flag = redis_obj.set_ex_data(uuid_number, token, 300)
  116. if flag is False:
  117. return response.json(309)
  118. return response.json(0)
  119. except Exception as e:
  120. print(e)
  121. return response.json(500)
  122. class KVSView(View):
  123. def get(self, request, *args, **kwargs):
  124. request.encoding = 'utf-8'
  125. operation = kwargs.get('operation')
  126. return self.validation(request.GET, request, operation)
  127. def post(self, request, *args, **kwargs):
  128. request.encoding = 'utf-8'
  129. operation = kwargs.get('operation')
  130. return self.validation(request.POST, request, operation)
  131. def validation(self, request_dict, request, operation):
  132. response = ResponseObject()
  133. if operation == 'create-media': # 创建视频流
  134. return self.create_media(request_dict, response)
  135. elif operation == 'update-data-retention': # 修改视频流数据保留时间
  136. return self.update_data_retention(request_dict, response)
  137. elif operation == 'get-hls-midea': # 修改视频流数据保留时间
  138. return self.get_hls_midea_url(request_dict, response)
  139. else:
  140. return response.json(404)
  141. @staticmethod
  142. def create_media(request_dict, response):
  143. """
  144. 创建视频流
  145. @param request_dict: 请求参数
  146. @request_dict serial_number: 序列号
  147. @param response: 响应对象
  148. @return: response
  149. """
  150. serial_number = request_dict.get('serial_number', None)
  151. try:
  152. kvs_qs = KVS.objects.filter(stream_name=serial_number)
  153. if kvs_qs.exists():
  154. return response.json(174)
  155. kinesis_video_obj = AmazonKinesisVideoObject(
  156. aws_access_key_id=ACCESS_KEY_ID,
  157. secret_access_key=SECRET_ACCESS_KEY,
  158. region_name=REGION_NAME
  159. )
  160. stream_arn = kinesis_video_obj.create_stream(stream_name=serial_number)
  161. if stream_arn:
  162. now_time = int(time.time())
  163. KVS.objects.create(stream_name=serial_number, stream_arn=stream_arn, created_time=now_time,
  164. updated_time=now_time)
  165. return response.json(0)
  166. else:
  167. return response.json(178)
  168. except Exception as e:
  169. print(e)
  170. return response.json(500)
  171. @staticmethod
  172. def update_data_retention(request_dict, response):
  173. """
  174. 修改视频流数据保留时间
  175. @param request_dict: 请求参数
  176. @request_dict serial_number: 序列号
  177. @request_dict operation: 操作,增加/减少
  178. @request_dict data_retention_change_in_hours: 修改的时间
  179. @param response: 响应对象
  180. @return: response
  181. """
  182. serial_number = request_dict.get('serial_number', None)
  183. operation = request_dict.get('operation', None)
  184. data_retention_change_in_hours = request_dict.get('data_retention_change_in_hours', None)
  185. try:
  186. kvs_qs = KVS.objects.filter(stream_name=serial_number)
  187. if not kvs_qs.exists():
  188. return response.json(174)
  189. kinesis_video_obj = AmazonKinesisVideoObject(
  190. aws_access_key_id=ACCESS_KEY_ID,
  191. secret_access_key=SECRET_ACCESS_KEY,
  192. region_name=REGION_NAME
  193. )
  194. now_time = int(time.time())
  195. data_retention_change_in_hours = int(data_retention_change_in_hours)
  196. kinesis_video_obj.update_data_retention(stream_name=serial_number, operation=operation,
  197. data_retention_change_in_hours=data_retention_change_in_hours)
  198. kvs_qs.update(data_retention_in_hours=data_retention_change_in_hours, updated_time=now_time)
  199. return response.json(0)
  200. except Exception as e:
  201. print(e)
  202. return response.json(500)
  203. @staticmethod
  204. def get_hls_midea_url(request_dict, response):
  205. serial_number = request_dict.get('serial_number', None)
  206. try:
  207. # kvs_qs = KVS.objects.filter(stream_name=serial_number)
  208. # if not kvs_qs.exists():
  209. # return response.json(174)
  210. kinesis_video_obj = AmazonKVAMObject(
  211. aws_access_key_id='AKIA2E67UIMD45Y3HL53',
  212. secret_access_key='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',
  213. region_name='us-east-1',
  214. stream_name=serial_number,
  215. api_name='GET_HLS_STREAMING_SESSION_URL'
  216. )
  217. hls_streaming_session_url = kinesis_video_obj.get_hls_streaming_session_url(serial_number)
  218. return response.json(0, {"HlsStreamingSessionUrl": hls_streaming_session_url})
  219. except Exception as e:
  220. print(e)
  221. return response.json(500, repr(e))