Snapshot.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. # @Author : Rocky
  2. # @File : Snapshot.py
  3. # @Time : 2025/7/29 8:51
  4. import threading
  5. import requests
  6. from django.http import JsonResponse
  7. from django.views import View
  8. from azoauth.config import LOGGER, SERVER_API
  9. from model.models import UserModel
  10. from object.ResObject import ResObject
  11. from service.CommonService import CommonService
  12. class SnapshotView(View):
  13. def get(self, request, *args, **kwargs):
  14. request.encoding = 'utf-8'
  15. operation = kwargs.get('operation')
  16. return self.validation(request.GET, operation)
  17. def post(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation')
  20. return self.validation(request.POST, operation)
  21. def validation(self, request_dict, operation):
  22. response = ResObject()
  23. if operation == 'sendMqtt': # 下发快照指令
  24. return self.send_mqtt(request_dict)
  25. elif operation == 'asynEventResponse': # 异步事件响应
  26. return self.asyn_event_response(request_dict, response)
  27. else:
  28. return response.json(10, 'error url')
  29. @classmethod
  30. def send_mqtt(cls, request_dict):
  31. uid = request_dict.get("uid", None)
  32. access_token = request_dict.get("access_token", None)
  33. correlation_token = request_dict.get("correlation_token", None)
  34. if not all([uid, access_token, correlation_token]):
  35. return JsonResponse({'result_code': '444', '错误': '参数错误'})
  36. try:
  37. user_qs = UserModel.objects.filter(access_token=access_token)
  38. if not user_qs.exists():
  39. return JsonResponse({'result_code': '500', '错误': '用户数据不存在'})
  40. # 更新correlation_token
  41. user_qs.update(correlation_token=correlation_token)
  42. region = user_qs.values('region_code')[0]['region_code']
  43. send_res = cls._send_mqtt_snapshot_command(uid, region)
  44. if send_res:
  45. return JsonResponse({'result_code': '0'})
  46. else:
  47. return JsonResponse({
  48. 'result_code': '500',
  49. 'msg': 'send mqtt failed'}
  50. )
  51. except Exception as e:
  52. return JsonResponse({'result_code': '500', 'error_msg': 'error_line:{}, error_msg:{}'.
  53. format(e.__traceback__.tb_lineno, repr(e))})
  54. @staticmethod
  55. def _send_mqtt_snapshot_command(uid, region):
  56. thing_name = CommonService.query_serial_with_uid(uid)
  57. topic_name = 'ansjer/generic/{}'.format(thing_name)
  58. msg = {
  59. "commandType": "alexaSnapshot",
  60. }
  61. try:
  62. result = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
  63. LOGGER.info('快照指令下发结果 {}: {}'.format(uid, result))
  64. if result:
  65. return True
  66. domain_name = SERVER_API[region]
  67. url = '{}/iot/requestPublishMessage'.format(domain_name)
  68. request_data = {'UID': uid, 'commandType': 'alexaSnapshot'}
  69. response = requests.post(url, data=request_data, timeout=10)
  70. if response.status_code == 200:
  71. result = response.json()
  72. if result.get('result_code') == 0:
  73. LOGGER.info('快照远程MQTT接口成功')
  74. return True
  75. else:
  76. LOGGER.info('快照远程MQTT接口失败, res:{}'.format(result))
  77. return False
  78. else:
  79. LOGGER.info('快照远程MQTT接口失败, 状态码: {}', response.status_code)
  80. return False
  81. except Exception as e:
  82. LOGGER.info('快照MQTT函数异常: error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  83. return False