# -*- coding: utf-8 -*- #主要的 __author__ = '上海色宁' import os import logging import time import datetime import random from logging.handlers import RotatingFileHandler import eventlet import json from flask import Flask, render_template, request,Response import requests import cv2 from flask_mqtt import Mqtt from flask_socketio import SocketIO from flask_bootstrap import Bootstrap from apscheduler.schedulers.background import BackgroundScheduler from flask_apscheduler import APScheduler from extract_voltage_task import extrct_digits_from_frame eventlet.monkey_patch() app = Flask(__name__, static_url_path='') app.config.from_pyfile('settings.py') mqtt = Mqtt(app) socketio = SocketIO(app) bootstrap = Bootstrap(app) @app.route('/') def index(): return render_template('index.html') @app.route('/image/') def one_image(): #需要改,换成实施的 cap = cv2.VideoCapture("sample.mp4") # for testing ret, frame = cap.read() time_now = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") cv2.imwrite("one_image_"+time_now+".jpg",frame) cap.release() return render_template('image.html',context = {"app_id":app.config['REMOTE_MQTT_PUBLISH_TOPIC'],"image_path":"one_image_"+time_now+".jpg"}) @socketio.on('publish') def handle_publish(json_str): data = json.loads(json_str) mqtt.publish(data['topic'], data['message']) @socketio.on('subscribe') def handle_subscribe(json_str): data = json.loads(json_str) mqtt.subscribe(data['topic']) @socketio.on('unsubscribe_all') def handle_unsubscribe_all(): mqtt.unsubscribe_all() @mqtt.on_connect() def handle_connect(client, userdata, flags, rc): mqtt.subscribe(app.config['REMOTE_MQTT_SUBSCRIBE_TOPIC']) @mqtt.on_message() def handle_mqtt_message(client, userdata, message): data = dict( topic=message.topic, payload=message.payload.decode() ) socketio.emit('mqtt_message', data=data) # add receive message handler here print(data) download_config_file() @mqtt.on_log() def handle_logging(client, userdata, level, buf): print(level, buf) @app.errorhandler(Exception) def all_exception_handler(e): return 'Error', 500 def download_config_file(): remote_config_file = "http://"+app.config['SERVER_IP']+":"+app.config['SERVER_PORT']+app.config['SERVER_CONFIG_PREFIX']+app.config['MQTT_CLIENT_ID']+"_config.py" r = requests.get(remote_config_file, stream=True) with open("settings.py",'wb') as f: # 分块写入文件 for chunk in r.iter_content(chunk_size=1024): if chunk: f.write(chunk) f.close() print("request and download config file finished . programe will restarted.") socketio.run(app, host='0.0.0.0', port=8058, debug=True) def AddJobConfig(): app.config.update( {"SCHEDULER_API_ENABLED": True, "SCHEDULER_TIMEZONE": 'Asia/Shanghai', "JOBS": [{"id": "my_job", # 任务ID "func": "__main__:extract_voltage_send",#任务位置 "trigger": "interval", #触发器 "seconds": 60 # 时间间隔 }, {"id": "my_job2", # 任务ID "func": "delete_task:delete_old_images",#任务位置 "trigger": "interval", #触发器 "seconds": 60 # 时间间隔 } ]} ) def extract_voltage_send(): print('extract_voltage_send job started!') time_now = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") app.logger.info(time_now+' extract_voltage_send job started!') #camera = cv2.VideoCapture(0) #use 0 for web camera deplyoment cap = cv2.VideoCapture(0) # for testing # 以下设置显示屏的宽高 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) fails_count = 0 while True: ret, frame = cap.read() return_digital,job_status = extrct_digits_from_frame(frame,app.config['IMAGE_CLIP_COLS_START'],app.config['IMAGE_CLIP_COLS_END'],app.config['IMAGE_CLIP_ROWS_START'],app.config['IMAGE_CLIP_ROWS_END']) if job_status or fails_count > 10: mqtt.publish(app.config['REMOTE_MQTT_PUBLISH_TOPIC'], "{'voltage':"+str(return_digital)+"}") cv2.imwrite("./imageframe/image_frame_"+time_now+".jpg", cv2.putText(frame, str(return_digital), (app.config['IMAGE_CLIP_ROWS_START'], app.config['IMAGE_CLIP_COLS_START']), cv2.FONT_HERSHEY_COMPLEX, 1.5, (0, 255, 255), 2)) cap.release() break else: fails_count +=1 cv2.imwrite("./fails/image_frame_"+time_now+".jpg", frame) #if need_send _image : # send_image def make_dir(make_dir_path): path = make_dir_path.strip() if not os.path.exists(path): os.makedirs(path) def init_logging(): logFormatter = logging.Formatter(app.config["LOG_FORMAT"]) fileHandler = RotatingFileHandler( app.config['LOG_FILE_FILENAME'], maxBytes=app.config['LOG_MAX_BYTES'], backupCount=3, encoding="UTF-8") fileHandler.setLevel(logging.DEBUG) fileHandler.setFormatter(logFormatter) app.logger.addHandler(fileHandler) streamHandler = logging.StreamHandler() streamHandler.setFormatter(logFormatter) streamHandler.setLevel(logging.INFO) app.logger.addHandler(streamHandler) app.logger.setLevel(logging.DEBUG) # set root log level if __name__ == '__main__': init_logging() scheduler = APScheduler(BackgroundScheduler(timezone="Asia/Shanghai")) AddJobConfig() # 配置任务,不然无法启动任务 scheduler.init_app(app) scheduler.start() #app.run() socketio.run(app, host='0.0.0.0', port=8058, debug=True) #mqtt.subscribe(app.config['REMOTE_MQTT_SUBSCRIBE_TOPIC']) // need to wait for mqtt client finished connection