# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import json import logging import urllib2 from six.moves.urllib import parse from typing import TYPE_CHECKING from apps.web.constant import Const from apps.web.dealer.models import Dealer from apps.web.device.models import Group, Device if TYPE_CHECKING: from apps.web.device.models import DeviceDict logger = logging.getLogger(__name__) class YuhuanNorther(object): ipPort = 'http://111.3.65.79:8084' appId = 'ictzjtzn' secretId = '34F20709880311E985D09CE374D0A1A9' token = '' tokenExpiredTime = datetime.datetime.now() @staticmethod def get_token(): if YuhuanNorther.token == '' or YuhuanNorther.tokenExpiredTime <= datetime.datetime.now(): # url, method="POST", isNeedResponse=True,**kwargs url = '%s/mhssp/api' % YuhuanNorther.ipPort result = send_url_request_to_yuhuan(url, action = 'token', method = 'getToken', grant_type = 'client', appid = YuhuanNorther.appId, secret = YuhuanNorther.secretId) if result['code'] != '1': logger.error('get token error,code=%s,desc=%s' % (result['code'], result['desc'])) return None YuhuanNorther.token = result['data']['token'] YuhuanNorther.tokenExpiredTime = datetime.datetime.now() + datetime.timedelta( seconds = result['data']['expires']) return YuhuanNorther.token @staticmethod def send_dev_info(dev): dealer = Dealer.objects.get(id = dev['ownerId']) feature = dealer.query_feature_by_list(['yuhuanNorther']) if not feature['yuhuanNorther']: logger.info(' send_dev_info yuhuanNorther switch is not open,please open it') return group = Group.get_group(dev['groupId']) devObj = Device.objects.get(devNo = dev['devNo']) devCtrInfo = Device.get_dev_control_cache(dev['devNo']) allports = devCtrInfo.get('allPorts', 10) ports = [str(_ + 1) for _ in range(allports)] devInfo = { 'fchargpile_uuid': dev['logicalCode'], 'fchargpile_name': u'佳泰-%s-%s' % (group['groupName'], dev['groupNumber']), 'fprovince_code': '330000', 'fcity_code': '331000', 'fcounty_code': '331083', 'ftown_code': group.get('town', ''), 'fvillage_code': group.get('village', ''), 'faddress': group['address'], 'flink_man': dealer['nickname'], 'ftel_no': dealer['username'], 'flongitude': devObj.location['coordinates'][0] if devObj.location is not None and devObj.location.has_key( 'coordinates') else 0.0, 'flatitude': devObj.location['coordinates'][1] if devObj.location is not None and devObj.location.has_key( 'coordinates') else 0.0, 'fis_active': '1' if dev['status'] not in [Const.DEV_WORK_STATUS_FAULT, Const.DEV_WORK_STATUS_FORBIDDEN] else '0', 'fnum': ports } url = '%s/mhssp/api' % YuhuanNorther.ipPort token = YuhuanNorther.get_token() result = send_url_request_to_yuhuan( url = url, action = 'obj.interface', method = 'cagChargPileInfo', token = token, transdata = json.dumps(devInfo) ) if result['ret_code'] != '1': logger.error('send_dev_info send dev info error,code=%s,desc=%s' % (result['ret_code'], result['data'])) logger.info('send OK! send_dev_info devNo=%s' % dev['devNo']) return result @staticmethod def send_dev_status(dev, port, status): # 1,开始充电,2,结束充电 # type:(DeviceDict, str, str)->None try: if not dev.is_registered: logger.info('device<{}> is not registered. no need to send_dev_status'.format(repr(dev))) return dealer = Dealer.objects.get(id = dev['ownerId']) feature = dealer.query_feature_by_list(['yuhuanNorther']) if not feature['yuhuanNorther']: logger.info('send_dev_status yuhuanNorther switch is not open,please open it') return statusInfo = { 'fchargpile_uuid': dev['logicalCode'], 'fnum': str(port), 'fstatus': str(status), 'fcome_time': datetime.datetime.now().strftime("%Y%m%d%H%M%S") } url = '%s/mhssp/api' % YuhuanNorther.ipPort token = YuhuanNorther.get_token() result = send_url_request_to_yuhuan( url = url, action = 'obj.interface', method = 'cabChargRev', token = token, transdata = json.dumps(statusInfo) ) if result.has_key('ret_code') and result['ret_code'] == '1': logger.info('send OK! send_dev_status devNo=%s' % dev['devNo']) else: logger.error( ' send_dev_status send dev info error,result=%s' % (result)) return result except Exception as e: logger.exception(e) @staticmethod def send_dev_event(dev, eventCode, port): # dealer = Dealer.objects.get(id = dev['ownerId']) feature = dealer.query_feature_by_list(['yuhuanNorther']) if not feature['yuhuanNorther']: logger.info(' send_dev_event yuhuanNorther switch is not open,please open it') return devTypeCode = dev['devType']['code'] if not Const.YUHUAN_EVENT_TYPE_DICT.has_key(devTypeCode): logger.info('send_dev_event YUHUAN_EVENT_TYPE_DICT has not find the type code =%s' % devTypeCode) return if not Const.YUHUAN_EVENT_TYPE_DICT[devTypeCode].has_key(eventCode): logger.info('send_dev_event YUHUAN_EVENT_TYPE_DICT has not find the eventCode code =%s' % eventCode) return ftype = Const.YUHUAN_EVENT_TYPE_DICT[devTypeCode][eventCode]['ftype'] fisok = Const.YUHUAN_EVENT_TYPE_DICT[devTypeCode][eventCode]['fisok'] fhandlmemo = Const.YUHUAN_EVENT_TYPE_DICT[devTypeCode][eventCode]['fhandlmemo'] eventInfo = { 'fchargpile_uuid': dev['logicalCode'], 'fnum': str(port), 'f_type': ftype, 'fcome_time': datetime.datetime.now().strftime("%Y%m%d%H%M%S"), 'fisok': fisok, 'fhandlername': dealer.nickname, 'fisok': fisok, 'fhandltime': datetime.datetime.now().strftime("%Y%m%d%H%M%S"), 'fhandlmemo': fhandlmemo, } url = '%s/mhssp/api' % YuhuanNorther.ipPort token = YuhuanNorther.get_token() result = send_url_request_to_yuhuan( url = url, action = 'obj.interface', method = 'cabChargAlarm', token = token, transdata = json.dumps(eventInfo) ) if result['ret_code'] != '1': logger.error('send_dev_event send dev info error,code=%s,desc=%s' % (result['ret_code'], result['data'])) logger.info('send OK! send_dev_event devNo=%s' % dev['devNo']) return result def send_url_request_to_yuhuan(url, **kwargs): paras = {} paras.update(kwargs) req = urllib2.Request(url = url, data = parse.urlencode(paras)) response = urllib2.urlopen(req, timeout = 15) return json.loads(response.read())