import asyncio import datetime import hashlib import json import sys import time from concurrent.futures import ThreadPoolExecutor import requests sys.path.append("..") import uuid import chardet import message_pb2 as message import google.protobuf.text_format as tf import http_client class CommandChecker: def __init__(self,db): self._db = db self._dispatch_statu = {} self._in_url = 'http://110.80.15.100:9030/Api/CarInEntry' self._query_url = 'http://110.80.15.100:9030/Api/GetBill' self._out_url = 'http://110.80.15.100:9030/Api/CarOutEntry' self._secret_key = 'anzs74aph8ac8dy6tj48t05js6zpkgx5' self._parking_id = '2302221444266172014' self._app_id = 'blbc5zkpyymaicd3' self._plate_color = {'蓝色':'1','黑色':'2','黄色':'3','白色':'4','绿色':'5','其他':'6'} def push_http_request(self,url,request): results = '' statu = message.eError # with open('./test.txt', 'w', encoding='utf-8') as f: # # 将dic dumps json 格式进行写入 # f.write(json.dumps(request)) # return statu, results tm = time.time() # 若推送失败就重试最多2s while time.time() - tm < 2: try: resp = requests.post(url, json=request).json() if ('Tag' in resp.keys()) and resp['Tag'] == 1: statu = message.eNormal results = resp break else: statu = message.eError results = '收费系统反馈错误!message:%s' %resp except Exception as e: statu = message.eError results = '向收费系统推送请求失败! ERROR:%s' % (str(e.args)) time.sleep(0.2) print(resp) return statu,results def exit_isOK(self, pick_body): pick_table = message.pick_table() try: tf.Parse(pick_body, pick_table) except Exception as e: pick_table.statu.execute_statu = message.eError pick_table.statu.statu_description = "设备故障,请联系管理员!" + "(取车表单错误)" + str(e.args) return pick_table if pick_table.primary_key is None or pick_table.primary_key == '': pick_table.statu.execute_statu = message.eWarning pick_table.statu.statu_description = " 唯一码不能为空!" else: # 查询车位表和指令表是否有该车 space_res = self._db.query_space_in_primary_key(pick_table.primary_key) command_res = self._db.query_command_in_primary_key(pick_table.primary_key) if len(command_res) > 0: pick_table.statu.execute_statu = message.eWarning pick_table.statu.statu_description = "指令正在执行中!请稍等!" elif len(space_res) <= 0: pick_table.statu.execute_statu = message.eWarning pick_table.statu.statu_description = "车辆信息不存在!" else: # 向收费系统查询缴费情况 request = self.get_request_data(pick_table, 'query') statu,response = self.push_http_request(self._query_url,request) if statu == message.eNormal: if ('Data' in response.keys()) and ('UnpaidMoney' in response['Data'].keys()): if response['Data']['UnpaidMoney'] == 0: # 完善表单信息 try: pick_table.car_number = space_res[0]['car_number'] pick_table.unit_id = space_res[0]['unit'] pick_table.car_number_info.plate_color = space_res[0]['plate_color'] pick_table.car_number_info.plate_type = space_res[0]['plate_type'] pick_table.car_number_info.plate_confidence = space_res[0]['plate_confidence'] pick_table.car_number_info.recognition_time = space_res[0]['recognition_time'] pick_table.car_number_info.plate_full_image = '' pick_table.car_number_info.plate_clip_image = '' except Exception as e: pick_table.statu.execute_statu = message.eError pick_table.statu.statu_description = "设备故障,请联系管理员!" + "(数据库信息有误)" + str(e.args) # 向收费系统推送车辆离场 request = self.get_request_data(pick_table, 'out') statu,response = self.push_http_request(self._out_url,request) if statu != message.eNormal: pick_table.statu.execute_statu = statu pick_table.statu.statu_description = response else: pick_table.statu.execute_statu = message.eWarning pick_table.statu.statu_description = "未缴费!请先缴费%d元再取车!"%response['Data']['UnpaidMoney'] else: pick_table.statu.execute_statu = message.eError pick_table.statu.statu_description = "收费系统答复错误!请联系管理员!" else: pick_table.statu.execute_statu = statu pick_table.statu.statu_description = response return pick_table def receive_dispatch_statu(self, statu, ex, key): self._dispatch_statu[key] = statu def entrance_isOK(self, park_body): # 停车表单 park_table = message.park_table() try: tf.Parse(park_body, park_table) except Exception as e: park_table.statu.execute_statu = message.eError park_table.statu.statu_description = "设备故障,请联系管理员!" + "(停车表单错误)" + str(e.args) return park_table # 检查调度状态 key = "dispatch_%d_statu_port" % park_table.unit_id if (key in self._dispatch_statu) is False or self._dispatch_statu[key].timeout(): park_table.statu.execute_statu = message.eError park_table.statu.statu_description = "设备故障,请联系管理员!" + "(调度)" return park_table # 获取车高信息 dispatch_node_statu = message.dispatch_node_statu() try: tf.Parse(self._dispatch_statu[key].statu, dispatch_node_statu) except Exception: park_table.statu.execute_statu = message.eError park_table.statu.statu_description = "设备故障,请联系管理员!" + "(调度状态消息错误)" return park_table if dispatch_node_statu.plc_carrier_status == 0: park_table.statu.execute_statu = message.eError park_table.statu.statu_description = "设备故障,请联系管理员!" + "(搬运器)" return park_table elif dispatch_node_statu.plc_carrier_status == 4: park_table.statu.execute_statu = message.eWarning park_table.statu.statu_description = "该单元设备维护中!请前往其他入口!" return park_table car_height = dispatch_node_statu.dispatch_plc_passway_status_vector[park_table.import_id - 1].car_height if car_height == 0: park_table.statu.execute_statu = message.eWarning park_table.statu.statu_description = "未检测到车辆!" return park_table elif car_height == 4: park_table.statu.execute_statu = message.eWarning park_table.statu.statu_description = "车辆超高,请退出车库!" return park_table # 填写车高信息 measure_info = message.measure_info() measure_info.height = car_height park_table.entrance_measure_info.CopyFrom(measure_info) # 赋值唯一码 uid = str(uuid.uuid1()) park_table.primary_key = uid # 查询车位表和指令表是否有该车 space_res = self._db.query_space_in_car_number(park_table.car_number) command_res = self._db.query_command_in_car_number(park_table.car_number) if len(command_res) > 0: park_table.statu.execute_statu = message.eWarning park_table.statu.statu_description = "指令正在执行中!请稍等!" elif len(space_res) > 0: park_table.statu.execute_statu = message.eWarning park_table.statu.statu_description = "车辆 :%s 已在库内!" % park_table.car_number else: # 车辆不在库内 查询是否有对应大小空车位 space_res = self._db.query_space_in_height_unit_and_empty(measure_info.height, park_table.unit_id) command_res = self._db.query_command_in_height_unit_and_statu(measure_info.height, park_table.unit_id) if len(space_res) - len(command_res) <= 0: park_table.statu.execute_statu = message.eWarning park_table.statu.statu_description = "没有空余车位,车牌号:%s 高度:%.3fm!" % (park_table.car_number, measure_info.height) else: # 向收费系统推送入场信息 request = self.get_request_data(park_table,'in') statu,response = self.push_http_request(self._in_url,request) if statu != message.eNormal: park_table.statu.execute_statu = statu park_table.statu.statu_description = response else: if ('Data' in response.keys()) and ('InPicUrl' in response['Data'].keys()): park_table.car_number_info.plate_full_image = response['Data']['InPicUrl'] park_table.car_number_info.plate_clip_image = response['Data']['InPlateUrl'] else: park_table.statu.execute_statu = message.eError park_table.statu.statu_description = "收费系统答复错误!请联系管理员!" return park_table # 创建车辆入场请求 def get_request_data(self, table,param): # 创建请求 msgId = str(uuid.uuid1())+'@'+table.car_number AppId = self._app_id time = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) sign = msgId+AppId+time+self._secret_key hl = hashlib.md5() hl.update(sign.encode(encoding='utf-8')) sign = hl.hexdigest() color = self._plate_color[table.car_number_info.plate_color] if table.car_number_info.plate_color in self._plate_color.keys() else self._plate_color['其他'] if param == 'in': data = http_client.HttpRequest.InDate(self._parking_id,table.car_number, str(datetime.datetime.now().strftime('%Y-%m-%d')), '2302221446265822050',#str(table.unit_id*100+table.import_id)#, table.car_number_info.plate_type,color, table.car_number_info.plate_full_image, table.car_number_info.plate_clip_image,table.primary_key) elif param == 'query': data = http_client.HttpRequest.QueryData(table.primary_key,self._parking_id) elif param == 'out': data = http_client.HttpRequest.OutDate(self._parking_id, table.car_number, table.primary_key, str(datetime.datetime.now().strftime('%Y-%m-%d')), '2302221729013462154',#str(table.unit_id*100)#, table.car_number_info.plate_type,color, table.car_number_info.plate_full_image, table.car_number_info.plate_clip_image) request = http_client.HttpRequest(msgId,AppId,time,sign,data) return request.__dict__