# -*- 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)