deviceStatus.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. """
  5. import json
  6. import time
  7. import requests
  8. import uuid
  9. import logging
  10. from django.views.generic import TemplateView
  11. from django.shortcuts import render_to_response
  12. from django.http import JsonResponse
  13. import http.client
  14. from urllib.parse import urlencode
  15. from object.ResObject import ResObject
  16. import subprocess
  17. # from gevent.pool import Pool
  18. from model.models import UserModel,UidRtspModel
  19. from object.ResponseObject import ResponseObject
  20. from object.tkObject import tkObject
  21. from service.CommonService import CommonService
  22. from model.models import AlexaAuthModel
  23. from object.RedisObject import RedisObject
  24. from django.utils.decorators import method_decorator
  25. from django.views.decorators.csrf import csrf_exempt
  26. rtspServer = "rtsp.zositech.org,3.16.66.144"
  27. class deviceStatus(TemplateView):
  28. @method_decorator(csrf_exempt)
  29. def dispatch(self, *args, **kwargs):
  30. return super(deviceStatus, self).dispatch(*args, **kwargs)
  31. def get(self, request, *args, **kwargs):
  32. logger = logging.getLogger('django')
  33. logger.info('get----------------------------------------')
  34. request.encoding = 'utf-8'
  35. operation = kwargs.get('operation')
  36. return self.validation(request.GET, request, operation)
  37. def post(self, request, *args, **kwargs):
  38. logger = logging.getLogger('django')
  39. logger.info('post----------------------------------------')
  40. request.encoding = 'utf-8'
  41. operation = kwargs.get('operation')
  42. return self.validation(request.POST, request, operation)
  43. def validation(self, request_dict, request, operation):
  44. response = ResponseObject()
  45. if operation is None:
  46. return JsonResponse({'code':404,'msg':'not found'})
  47. if operation == 'saveAccessToken':
  48. return self.saveAccessToken(request_dict, response)
  49. if operation == 'addOrUpdate':
  50. logger = logging.getLogger('django')
  51. logger.info('in__________________________validation________')
  52. return self.addOrUpdate(request_dict, response)
  53. if operation == 'delete':
  54. return self.delete(request_dict, response)
  55. elif operation == 'test':
  56. return self.discover(request_dict, response)
  57. logger = logging.getLogger('django')
  58. logger.info('in__________________________validation________')
  59. def saveAccessToken(self,request_dict, response):
  60. access_token = request_dict.get("access_token", '')
  61. refresh_token = request_dict.get("refresh_token", '')
  62. token = request_dict.get("token", '')
  63. logger = logging.getLogger('django')
  64. logger.info('login-------------begin---token')
  65. logger.info(access_token)
  66. logger.info(refresh_token)
  67. alexAuth = AlexaAuthModel.objects.filter(token=token)
  68. nowTime = int(time.time())
  69. if not alexAuth.exists():
  70. AlexaAuthModel.objects.create(
  71. access_token = access_token,
  72. refresh_token = refresh_token,
  73. token = token,
  74. expiresTime = nowTime + 3200,
  75. addTime=nowTime,
  76. updTime=nowTime)
  77. else:
  78. alexAuth.update(
  79. access_token = access_token,
  80. refresh_token = refresh_token,
  81. expiresTime = nowTime + 3200,
  82. token = token,
  83. updTime=nowTime
  84. )
  85. return JsonResponse({'code':200,'msg':'success'})
  86. def addOrUpdate(self,request_dict, response):
  87. logger = logging.getLogger('django')
  88. logger.info('in__________________________first')
  89. UID = request_dict.get("UID", '')
  90. userID = request_dict.get("userID", '')
  91. uid_nick = request_dict.get("uid_nick", '')
  92. if UID == 'HVTLKFJM6KDTAF9J111A':
  93. logger.info('this is my UID1111-------------------------------------')
  94. logger.info('class:deviceStatus-------function:addOrUpdate------------------')
  95. logger.info(UID)
  96. logger.info(userID)
  97. logger.info(uid_nick)
  98. if UID == '' or userID == '' or uid_nick == '':
  99. return JsonResponse({'code':101,'msg':'fail'})
  100. if UID == 'HVTLKFJM6KDTAF9J111A':
  101. logger.info('this is my UID-------------------------------------')
  102. alexAuth = AlexaAuthModel.objects.filter(userID=userID)
  103. if not alexAuth.exists():
  104. return JsonResponse({'code':102,'msg':'not found user'})
  105. info = alexAuth.values()
  106. expiresTime = info[0]['expiresTime']
  107. now_time = int(time.time())
  108. access_token = info[0]['access_token']
  109. refresh_token = info[0]['refresh_token']
  110. if now_time > expiresTime:
  111. res = self.getRefreshToken(refresh_token)
  112. if('error' not in res):
  113. alexAuth.update(
  114. access_token = res['access_token'],
  115. refresh_token = res['refresh_token'],
  116. expiresTime = now_time + 3000,
  117. updTime = now_time,
  118. )
  119. access_token = res['access_token']
  120. else:
  121. return JsonResponse({'code':102,'msg':'get refresh_token fail'})
  122. api_uri = 'https://api.amazonalexa.com/v3/events'
  123. messageId = str(uuid.uuid4()).strip()
  124. bearer_access_token = "Bearer {access_token}".format(access_token=access_token)
  125. headers = {"content-type": "application/json", "Authorization": bearer_access_token}
  126. payload_json = {
  127. "event": {
  128. "header": {
  129. "namespace": "Alexa.Discovery",
  130. "name": "AddOrUpdateReport",
  131. "payloadVersion": "3",
  132. "messageId": messageId,
  133. },
  134. "payload": {
  135. "endpoints": [
  136. {
  137. "endpointId": UID,
  138. "manufacturerName": "zosi smart",
  139. "modelName": "P1425-LE",
  140. "friendlyName": uid_nick,
  141. "description": "Camera connected via zosi smart",
  142. "displayCategories": ["CAMERA"],
  143. "capabilities": [
  144. {
  145. "type": "AlexaInterface",
  146. "interface": "Alexa.CameraStreamController",
  147. "version": "3",
  148. "cameraStreamConfigurations": [
  149. {
  150. "protocols": ["RTSP"],
  151. "resolutions": [{"width": 1280, "height": 720}],
  152. "authorizationTypes": ["NONE"],
  153. "videoCodecs": ["H264"],
  154. "audioCodecs": ["ACC"],
  155. }
  156. ],
  157. }
  158. ],
  159. }
  160. ],
  161. "scope": {
  162. "type": "BearerToken",
  163. "token": 'sdf',
  164. },
  165. },
  166. }
  167. }
  168. response = requests.post(api_uri, json=payload_json, headers=headers)
  169. logger.info('--------addOrUpdate_response')
  170. logger.info(response)
  171. return JsonResponse({'res':'success'})
  172. # return json.dumps('test',indent=4,sort_keys=True,ensure_ascii=False) #格式化返回内容
  173. def delete(self,request_dict, response):
  174. UID = request_dict.get("UID", '')
  175. userID = request_dict.get("userID", '')
  176. logger = logging.getLogger('django')
  177. logger.info('class:deviceStatus-------function:delete------------------')
  178. logger.info(UID)
  179. logger.info(userID)
  180. if UID == '':
  181. return JsonResponse({'code':111,'msg':'fail'})
  182. alexAuth = AlexaAuthModel.objects.filter(userID=userID)
  183. if not alexAuth.exists():
  184. return JsonResponse({'code':102,'msg':'not found user'})
  185. info = alexAuth.values()
  186. expiresTime = info[0]['expiresTime']
  187. refresh_token = info[0]['refresh_token']
  188. now_time = int(time.time())
  189. access_token = info[0]['access_token']
  190. if now_time > expiresTime:
  191. res = self.getRefreshToken(refresh_token)
  192. if('error' not in res):
  193. alexAuth.update(
  194. access_token = res['access_token'],
  195. refresh_token = res['refresh_token'],
  196. expiresTime = now_time + 300,
  197. updTime = now_time,
  198. )
  199. access_token = res['access_token']
  200. else:
  201. return JsonResponse({'code':102,'msg':'get refresh_token fail'})
  202. messageId = str(uuid.uuid4())
  203. headers = {
  204. "Authorization": "Bearer " + access_token,
  205. "Content-Type": "application/json;charset=UTF-8",
  206. "Cache-Control": "no-cache"
  207. }
  208. payload = {
  209. "event": {
  210. "header": {
  211. "namespace": "Alexa.Discovery",
  212. "name": "DeleteReport",
  213. "messageId": messageId,
  214. "payloadVersion": "3"
  215. },
  216. "payload": {
  217. "endpoints": [
  218. {
  219. "endpointId": UID
  220. }
  221. ],
  222. "scope": {
  223. "type": "BearerToken",
  224. "token": access_token
  225. }
  226. }
  227. }
  228. }
  229. # return JsonResponse({"res": headers})
  230. api_uri = 'https://api.amazonalexa.com/v3/events'
  231. response = requests.post(api_uri, json=payload, headers=headers)
  232. logger.info('--------delete_response')
  233. logger.info(response)
  234. return JsonResponse({'res':'success'})
  235. def getRefreshToken(self,refresh_token):
  236. payload = {
  237. 'grant_type': 'refresh_token',
  238. 'refresh_token': refresh_token,
  239. 'client_id': 'amzn1.application-oa2-client.efb07b51dd444f848b6f0598635da3cc',
  240. 'client_secret': '8a49390ebe362bfee153be87587f5673d0c1d8aeb6bc1ef736fda6c9d5d81c8f',
  241. }
  242. auth_request_url = 'https://api.amazon.com/auth/o2/token'
  243. headers = {
  244. 'content-type': "application/x-www-form-urlencoded",
  245. 'cache-control': "no-cache"
  246. }
  247. res = requests.post(auth_request_url, payload,headers)
  248. request_json = res.json()
  249. return request_json
  250. #请求alexa事件网关接口失败错误码
  251. '''
  252. 400 Bad Request INVALID_REQUEST_EXCEPTION 消息无效,可能是因为缺少字段、不正确的值或格式错误的 JSON。根据文档检查邮件以验证邮件是否包含所有必需的字段。
  253. 401 Unauthorized INVALID_ACCESS_TOKEN_EXCEPTION 访问令牌无效,因为它已过期或格式错误。刷新令牌并重试请求。如果用户禁用您的技能,这也会使访问令牌失效。这意味着用户已吊销授权,您可以停止为他们发送更改报告。
  254. 403 Forbidden SKILL_NEVER_ENABLED_EXCEPTION 请确保将事件发送到正确的区域终结点。例如,北美中的事件应发送到北美终结点。
  255. 403 Forbidden INSUFFICIENT_PERMISSION_EXCEPTION 令牌没有所需的权限。确保该技能具有发送 Alexa 事件的权限。请参阅异步消息身份验证的步骤。
  256. 404 Not Found SKILL_NOT_FOUND_EXCEPTION 找不到与此令牌关联的技能 ID。当技能处于不同阶段(如认证)时生成用户的访问令牌时,将发生此错误。尝试禁用并重新启用此用户的技能。
  257. 413 Payload Too Large REQUEST_ENTITY_TOO_LARGE_EXCEPTION 事件有效负载的大小太大。请求中允许的最大终结点数为 300。以较小的有效负载发送邮件。
  258. 429 Too Many Requests THROTTLING_EXCEPTION 请求数过高。重新发送消息最多三次,每次发送尝试之间至少有一秒的间隔。
  259. 500 Internal Server Error INTERNAL_SERVICE_EXCEPTION Alexa 发生错误,无法处理该消息。重新发送消息最多三次,每次发送尝试之间至少有一秒的间隔。如果问题仍然存在,请联系亚马逊支持。
  260. 503 Service Unavailable SERVICE_UNAVAILABLE_EXCEPTION 亚历克萨不能接受这条信息。重新发送消息最多三次,每次尝试之间至少有一秒的间隔。如果问题仍然存在,请联系亚马逊支持。
  261. '''