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