event.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging,json
  4. from typing import TYPE_CHECKING
  5. from apps.web.core.helpers import ActionDeviceBuilder
  6. from apps.web.device.models import Device,Part,Group
  7. from apps.web.south_intf.swap_carcharger import SwapContract
  8. from apps.web.constant import DeviceOnlineStatus
  9. if TYPE_CHECKING:
  10. from apps.web.eventer import EventBuilder
  11. from apps.web.device.models import DeviceDict
  12. logger = logging.getLogger(__name__)
  13. def do_device_event(cmd, dev, device_event):
  14. # type:(str, DeviceDict, dict)->None
  15. """
  16. smartBox用于解析报文,eventer处理解析出来的内容,生成事件
  17. """
  18. logger.debug('receive event is {}'.format(device_event))
  19. if not device_event:
  20. logger.info('device event is null.')
  21. return
  22. eventer = ActionDeviceBuilder.create_eventer(dev) # type:EventBuilder
  23. if not eventer:
  24. logger.error('no smartbox or no eventer. imei = {}'.format(dev.devNo))
  25. return
  26. try:
  27. event = eventer.getEvent(device_event)
  28. if event:
  29. event.do()
  30. # TODO: 暂时不用该机制解决数据库升级
  31. # playback = SystemSettings.get_system_setting('eventerPlayback', False)
  32. # if playback:
  33. # if event.support_playback:
  34. # event.do()
  35. # else:
  36. # logger.debug('event object of <{}> is playback. ignore it.'.format(dev.devNo))
  37. # else:
  38. # event.do()
  39. else:
  40. logger.warn('event object of <{}> is null. please check.'.format(dev.devNo))
  41. except Exception as e:
  42. logger.exception(e)
  43. def do_car_device_event(cmd, dev, device_event):
  44. # type:(str, DeviceDict, dict)->None
  45. """
  46. smartBox用于解析报文,eventer处理解析出来的内容,生成事件
  47. """
  48. logger.debug('receive event is {}'.format(device_event))
  49. if not device_event:
  50. logger.info('device event is null.')
  51. return
  52. if not dev['ownerId'] and 'driverCode' in dev:
  53. eventer = ActionDeviceBuilder.create_eventer(dev,dev['driverCode']) # type:EventBuilder
  54. else:
  55. eventer = ActionDeviceBuilder.create_eventer(dev) # type:EventBuilder
  56. if not eventer:
  57. logger.error('no smartbox or no eventer. imei = {}'.format(dev.devNo))
  58. return
  59. try:
  60. # 200、208这种公共的处理,放到框架处理
  61. if cmd == '208':
  62. Device.update_online_cache(dev['devNo'], False, 0)
  63. Part.update_part_network_status(dev['logicalCode'],None,Part.OnlineStatus.OFFLINE)
  64. group = Group.get_group(dev['groupId'])
  65. if group.get('swapFlag',False):
  66. SwapContract.notify_2_all_northers_port_network_status(dev,DeviceOnlineStatus.DEV_STATUS_OFFLINE)
  67. return
  68. if cmd == '200':# 上线初始化,需要特殊处理,包括iccid,信号量什么的信息
  69. oldOnline = dev.online
  70. Device.update_online_cache(dev['devNo'], True)
  71. Part.update_part_network_status(dev['logicalCode'],None,Part.OnlineStatus.ONLINE)
  72. if not oldOnline: # 离线变在线
  73. group = Group.get_group(dev['groupId'])
  74. if group.get('swapFlag',False):
  75. SwapContract.notify_2_all_northers_port_network_status(dev,DeviceOnlineStatus.DEV_STATUS_ONLINE)
  76. strMsg = str(device_event['data']).replace('[', '{').replace(']', '}')
  77. if '{' not in strMsg or '}' not in strMsg:
  78. return
  79. msgData = json.loads(strMsg)
  80. logger.info('receive 200 network init msg=%s' % msgData)
  81. if 'iccid' in msgData:
  82. devObj = Device.objects(devNo = dev['devNo']).first()
  83. devObj.iccid = msgData['iccid']
  84. devObj.save()
  85. Device.invalid_device_cache(dev['devNo'])
  86. if 'csq' in msgData:
  87. Device.update_online_cache(dev['devNo'], True,msgData['csq'])
  88. return
  89. else:# 非208的,肯定是上线了的消息
  90. Device.update_online_cache(dev['devNo'], True)
  91. event = eventer.getEvent(device_event)
  92. if event:
  93. event.do()
  94. else:
  95. logger.warn('event object of <{}> is null. please check.'.format(dev.devNo))
  96. except Exception as e:
  97. logger.exception(e)