# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import logging import simplejson as json from typing import TYPE_CHECKING from apps.web.constant import DeviceCmdCode from apps.web.core.accounting import Accounting from apps.web.core.helpers import ActionDeviceBuilder from apps.web.core.networking import MessageSender from apps.web.device.timescale import FluentedEngine, OfflineManager from apps.web.eventer import EventBuilder from script.eventer.handlers import Handler logger = logging.getLogger(__name__) if TYPE_CHECKING: pass class SimpleAckHandler(Handler): def do(self): if not self.payload: logger.info('device event is null.') return if 'ackid' not in self.payload: logger.info('has not ackid in payload.') return ackid = self.payload['ackid'] if not self.dev.is_registered: logger.warning('{} is not registered, so ignore ackid<{}>'.format(self.dev, ackid)) return MessageSender.send_no_wait( device = self.dev, cmd = DeviceCmdCode.SIMPLE_ACKED, payload = {"ackid": ackid}) eventer = ActionDeviceBuilder.create_eventer(self.dev) # type:EventBuilder if not eventer: logger.error('no smartbox or no eventer. imei = {}'.format(self.dev.devNo)) return # 业务模块处理各自的ACK事件, 是否还需要继续上报由业务模块决定, 如果抛异常则不ACKED try: event = eventer.getEvent(self.payload) if event: event.do() except Exception as e: logger.exception(e) else: MessageSender.send_no_wait( device = self.dev, cmd = DeviceCmdCode.SIMPLE_ACKED, payload = {"ackid": ackid})