import threading import socket import re import time import datetime import numpy as np import pandas as pd from flask import Flask from flask import request from flask import render_template ba_df = pd.DataFrame(columns=["time", "channel", "ba_label", "involve_targets", "properties_of_involve_targets", "involve_region", "ba_image", "ba_video"]) ba_df['time'] = pd.to_datetime(ba_df['time']) # live stream for channel 0, change to right url first live_stream_0 = "http://192.168.77.60/flv?app=live&stream=vehicle_ba_sample_0" # live stream for channel 1, change to right url first live_stream_1 = "http://192.168.77.60/flv?app=live&stream=vehicle_ba_sample_1" ''' receive ba data from socket and save to dataframe of pandas. ''' def ba_receiver(): udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) bind_ip = '192.168.77.68' bind_port = 7777 udp_socket.bind((bind_ip, bind_port)) while True: data, addr = udp_socket.recvfrom(1024 * 64) s = data.decode() print('############################################') print(f'Received data: \n{s}') print(f'From address: {addr}') li = re.findall("\<\-\-.*?\-\-\>", s, re.DOTALL) print(f"total {len(li)} records parsed! going to append to data frame...") for l in li: items = str(l).split('\n') ''' items[0] <-- items[1] time (y:m:d h:m:s.mili) items[2] channel index, frame index items[3] ba type, ba label items[4] ids of targets items[5] vertexs of region items[6] properties of targets items[7] record image path items[8] record video path items[9] --> ''' assert(len(items) == 10) # append items to dataframe ba_df.loc[len(ba_df)] = [items[1].split('.')[0], items[2].split(',')[0], items[3].split(',')[1], items[4], items[6], items[5], items[7], items[8]] print(f"now total {len(ba_df)} records in ba_df!") print('############################################') udp_socket.close() ''' create flask app ''' app = Flask(__name__) # home page @app.route("/", methods=["GET", "POST"]) def home(): ''' filter properties ''' select_channel = "all" if 'select_channel' in request.form: select_channel = request.form['select_channel'] select_ba_type = "all" if 'select_ba_type' in request.form: select_ba_type = request.form['select_ba_type'] # 1 hour by default now = time.time() past_1_hour = now - 3600 select_start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(past_1_hour)) select_end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(now)) if 'select_start_time' in request.form and request.form['select_start_time'] != '': select_start_time = datetime.datetime.strptime(request.form['select_start_time'], '%Y-%m-%dT%H:%M:%S') if 'select_end_time' in request.form and request.form['select_end_time'] != '': select_end_time = datetime.datetime.strptime(request.form['select_end_time'], '%Y-%m-%dT%H:%M:%S') sql = "ba_label != ''" if select_channel != 'all': sql += f" & channel == '{select_channel}'" if select_ba_type != 'all': sql += f" & ba_label == '{select_ba_type}'" sql += f" & time >= '{select_start_time}'" sql += f" & time < '{select_end_time}'" print(sql) filter_df = ba_df.query(sql) print(filter_df) ba_results = [] for index, row in filter_df.iterrows(): ba_results.append({'uid':index, \ 'time':row['time'], \ 'channel':row['channel'], \ 'ba_label':row['ba_label'], \ 'involve_targets':row['involve_targets'], \ 'properties_of_involve_targets': row['properties_of_involve_targets'], \ 'involve_region': row['involve_region'], \ 'ba_image': './static/record_images/' + row['ba_image'] + '.jpg' if row['ba_image'] != '' else '', \ 'ba_video': './static/record_videos/' + row['ba_video'] + '.mp4' if row['ba_video'] != '' else ''}) return render_template("home.html", \ ba_results=ba_results, \ total_records=len(filter_df), \ select_channel = select_channel, \ select_ba_type = select_ba_type, \ select_start_time = select_start_time, \ select_end_time = select_end_time, \ live_stream_0=live_stream_0, \ live_stream_1=live_stream_1) if __name__ == "__main__": # start receiving thread receiver = threading.Thread(target = ba_receiver) receiver.start() # run server app.run(host="192.168.77.68", port=7878)