wangzhibo
2022-03-23 8afe7455067996bf8bca087418425c2bb7d6d492
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# -*- 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)
    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:
            mqtt.publish(app.config['REMOTE_MQTT_PUBLISH_TOPIC'], "{'voltage':"+str(return_digital)+"}")
            cv2.imwrite("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
    #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