123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import logging,json
- from typing import TYPE_CHECKING
- from apps.web.core.helpers import ActionDeviceBuilder
- from apps.web.device.models import Device,Part,Group
- from apps.web.south_intf.swap_carcharger import SwapContract
- from apps.web.constant import DeviceOnlineStatus
- if TYPE_CHECKING:
- from apps.web.eventer import EventBuilder
- from apps.web.device.models import DeviceDict
- logger = logging.getLogger(__name__)
- def do_device_event(cmd, dev, device_event):
- # type:(str, DeviceDict, dict)->None
- """
- smartBox用于解析报文,eventer处理解析出来的内容,生成事件
- """
- logger.debug('receive event is {}'.format(device_event))
- if not device_event:
- logger.info('device event is null.')
- return
- eventer = ActionDeviceBuilder.create_eventer(dev) # type:EventBuilder
- if not eventer:
- logger.error('no smartbox or no eventer. imei = {}'.format(dev.devNo))
- return
- try:
- event = eventer.getEvent(device_event)
- if event:
- event.do()
- # TODO: 暂时不用该机制解决数据库升级
- # playback = SystemSettings.get_system_setting('eventerPlayback', False)
- # if playback:
- # if event.support_playback:
- # event.do()
- # else:
- # logger.debug('event object of <{}> is playback. ignore it.'.format(dev.devNo))
- # else:
- # event.do()
- else:
- logger.warn('event object of <{}> is null. please check.'.format(dev.devNo))
- except Exception as e:
- logger.exception(e)
- def do_car_device_event(cmd, dev, device_event):
- # type:(str, DeviceDict, dict)->None
- """
- smartBox用于解析报文,eventer处理解析出来的内容,生成事件
- """
- logger.debug('receive event is {}'.format(device_event))
- if not device_event:
- logger.info('device event is null.')
- return
-
- if not dev['ownerId'] and 'driverCode' in dev:
- eventer = ActionDeviceBuilder.create_eventer(dev,dev['driverCode']) # type:EventBuilder
- else:
- eventer = ActionDeviceBuilder.create_eventer(dev) # type:EventBuilder
- if not eventer:
- logger.error('no smartbox or no eventer. imei = {}'.format(dev.devNo))
- return
- try:
- # 200、208这种公共的处理,放到框架处理
- if cmd == '208':
- Device.update_online_cache(dev['devNo'], False, 0)
- Part.update_part_network_status(dev['logicalCode'],None,Part.OnlineStatus.OFFLINE)
- group = Group.get_group(dev['groupId'])
- if group.get('swapFlag',False):
- SwapContract.notify_2_all_northers_port_network_status(dev,DeviceOnlineStatus.DEV_STATUS_OFFLINE)
- return
- if cmd == '200':# 上线初始化,需要特殊处理,包括iccid,信号量什么的信息
- oldOnline = dev.online
- Device.update_online_cache(dev['devNo'], True)
- Part.update_part_network_status(dev['logicalCode'],None,Part.OnlineStatus.ONLINE)
- if not oldOnline: # 离线变在线
- group = Group.get_group(dev['groupId'])
- if group.get('swapFlag',False):
- SwapContract.notify_2_all_northers_port_network_status(dev,DeviceOnlineStatus.DEV_STATUS_ONLINE)
- strMsg = str(device_event['data']).replace('[', '{').replace(']', '}')
- if '{' not in strMsg or '}' not in strMsg:
- return
- msgData = json.loads(strMsg)
- logger.info('receive 200 network init msg=%s' % msgData)
- if 'iccid' in msgData:
- devObj = Device.objects(devNo = dev['devNo']).first()
- devObj.iccid = msgData['iccid']
- devObj.save()
- Device.invalid_device_cache(dev['devNo'])
- if 'csq' in msgData:
- Device.update_online_cache(dev['devNo'], True,msgData['csq'])
- return
- else:# 非208的,肯定是上线了的消息
- Device.update_online_cache(dev['devNo'], True)
-
- event = eventer.getEvent(device_event)
- if event:
- event.do()
- else:
- logger.warn('event object of <{}> is null. please check.'.format(dev.devNo))
- except Exception as e:
- logger.exception(e)
|