# @Author : Rocky # @File : Snapshot.py # @Time : 2025/7/29 8:51 import threading import requests from django.http import JsonResponse from django.views import View from azoauth.config import LOGGER, SERVER_API from model.models import UserModel from object.ResObject import ResObject from service.CommonService import CommonService class SnapshotView(View): def get(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.GET, operation) def post(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.POST, operation) def validation(self, request_dict, operation): response = ResObject() if operation == 'sendMqtt': # 下发快照指令 return self.send_mqtt(request_dict) elif operation == 'asynEventResponse': # 异步事件响应 return self.asyn_event_response(request_dict, response) else: return response.json(10, 'error url') @classmethod def send_mqtt(cls, request_dict): uid = request_dict.get("uid", None) access_token = request_dict.get("access_token", None) correlation_token = request_dict.get("correlation_token", None) if not all([uid, access_token, correlation_token]): return JsonResponse({'result_code': '444', '错误': '参数错误'}) try: user_qs = UserModel.objects.filter(access_token=access_token) if not user_qs.exists(): return JsonResponse({'result_code': '500', '错误': '用户数据不存在'}) # 更新correlation_token user_qs.update(correlation_token=correlation_token) region = user_qs.values('region_code')[0]['region_code'] send_res = cls._send_mqtt_snapshot_command(uid, region) if send_res: return JsonResponse({'result_code': '0'}) else: return JsonResponse({ 'result_code': '500', 'msg': 'send mqtt failed'} ) except Exception as e: return JsonResponse({'result_code': '500', 'error_msg': 'error_line:{}, error_msg:{}'. format(e.__traceback__.tb_lineno, repr(e))}) @staticmethod def _send_mqtt_snapshot_command(uid, region): thing_name = CommonService.query_serial_with_uid(uid) topic_name = 'ansjer/generic/{}'.format(thing_name) msg = { "commandType": "alexaSnapshot", } try: result = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg) LOGGER.info('快照指令下发结果 {}: {}'.format(uid, result)) if result: return True domain_name = SERVER_API[region] url = '{}/iot/requestPublishMessage'.format(domain_name) request_data = {'UID': uid, 'commandType': 'alexaSnapshot'} response = requests.post(url, data=request_data, timeout=10) if response.status_code == 200: result = response.json() if result.get('result_code') == 0: LOGGER.info('快照远程MQTT接口成功') return True else: LOGGER.info('快照远程MQTT接口失败, res:{}'.format(result)) return False else: LOGGER.info('快照远程MQTT接口失败, 状态码: {}', response.status_code) return False except Exception as e: LOGGER.info('快照MQTT函数异常: error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))) return False