simple_ack.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import simplejson as json
  6. from typing import TYPE_CHECKING
  7. from apps.web.constant import DeviceCmdCode
  8. from apps.web.core.accounting import Accounting
  9. from apps.web.core.helpers import ActionDeviceBuilder
  10. from apps.web.core.networking import MessageSender
  11. from apps.web.device.timescale import FluentedEngine, OfflineManager
  12. from apps.web.eventer import EventBuilder
  13. from script.eventer.handlers import Handler
  14. logger = logging.getLogger(__name__)
  15. if TYPE_CHECKING:
  16. pass
  17. class SimpleAckHandler(Handler):
  18. def do(self):
  19. if not self.payload:
  20. logger.info('device event is null.')
  21. return
  22. if 'ackid' not in self.payload:
  23. logger.info('has not ackid in payload.')
  24. return
  25. ackid = self.payload['ackid']
  26. if not self.dev.is_registered:
  27. logger.warning('{} is not registered, so ignore ackid<{}>'.format(self.dev, ackid))
  28. return MessageSender.send_no_wait(
  29. device = self.dev, cmd = DeviceCmdCode.SIMPLE_ACKED, payload = {"ackid": ackid})
  30. eventer = ActionDeviceBuilder.create_eventer(self.dev) # type:EventBuilder
  31. if not eventer:
  32. logger.error('no smartbox or no eventer. imei = {}'.format(self.dev.devNo))
  33. return
  34. # 业务模块处理各自的ACK事件, 是否还需要继续上报由业务模块决定, 如果抛异常则不ACKED
  35. try:
  36. event = eventer.getEvent(self.payload)
  37. if event:
  38. event.do()
  39. except Exception as e:
  40. logger.exception(e)
  41. else:
  42. MessageSender.send_no_wait(
  43. device = self.dev, cmd = DeviceCmdCode.SIMPLE_ACKED, payload = {"ackid": ackid})