# 创建一个全局的循环队列以及全局共享变量
from queue import Queue
global_data=[]
global_queue = Queue()
from datetime import datetime
from threading import Thread
import serial, re, math
from flask import Flask, render_template, request, jsonify
from pyecharts import options as opts
from pyecharts.charts import Line
import matplotlib.pyplot as plt
import numpy
from kalman5 import *
from wifilib import *
import mysql.connector
from random import randrange
from flask import Flask, render_template
from pyecharts import options as opts
from pyecharts.charts import Line
app = Flask(__name__, static_folder="templates")
app.config['MYSQL_HOST'] = 'localhost' # MySQL 主机名
app.config['MYSQL_USER'] = 'root' # MySQL 用户名
app.config['MYSQL_PASSWORD'] = '123123' # MySQL 密码
app.config['MYSQL_DB'] = 'csi' # MySQL 数据库名
def get_db_connection():
connection = mysql.connector.connect(
host=app.config['MYSQL_HOST'],
user=app.config['MYSQL_USER'],
password=app.config['MYSQL_PASSWORD'],
database=app.config['MYSQL_DB'],
)
return connection
# 返回的是数据库链接对象
def Line_base(index) -> Line:
# index = int(index)
# path = r'csi9.dat'
# bf = read_bf_file_new(path,index)
# csi_list = list(map(get_scale_csi, bf))
# print("test")
# print(csi_list)
# csi_np = (np.array(csi_list))
# csi_amp = np.abs(csi_np)
# csi_total = numpy.empty(csi_amp[:, 0, 0, 25].shape)
# csi_total_a = numpy.empty(csi_amp[:, 0, 0, 25].shape)
# for i in range(6):
# csi_total = csi_total + csi_amp[:, 0, 0, i + 15]
# csi_total = csi_amp[:, 0, 0, 15]
# csi_total_a = kalman_filter1(csi_amp[:, 0, 0, 15])
global_data.clear()
for i in range(51):
global_data.append(global_queue.get())
# print(global_data)
csi_total_a = kalman_filter1(global_data)
csi_total_a = csi_total_a[3:51]
list2 = [str(i) for i in range(0, 48)]
c = (
Line()
.add_xaxis(list2)
# .add_yaxis("波形1", csi_total[0:50],is_smooth='spline',is_symbol_show=False,color='blue')
.add_yaxis("波形1", csi_total_a[0:48], is_smooth='spline', is_symbol_show=False, color='blue')
.set_global_opts(title_opts=opts.TitleOpts(title="入侵检测系统", subtitle="实时波形检测"),
yaxis_opts=opts.AxisOpts(max_=80, min_=0)
)
)
return c
@app.route("/")
def index():
return render_template("index.html")
@app.route("/LineChart")
def get_Line_chart():
index = request.args.get('index')
c = Line_base(index)
return c.dump_options_with_quotes()
@app.route("/getCount")
def getCountAndIn():
index = request.args.get("index2")
# print(index)
state = getCountAndIN(index)
# 返回一个包含入侵事件计数的JSON响应
return jsonify({'count': state})
@app.route('/get_alarm_history', methods=['GET'])
def get_alarm_history():
try:
connection = get_db_connection()
cursor = connection.cursor()
cursor.execute("SELECT date, type, description FROM alarm_history ORDER BY date DESC")
history_data = cursor.fetchall()
cursor.close()
return jsonify({'data1': history_data})
except Exception as e:
return jsonify({'error': str(e)})
import matplotlib.pyplot as plt
import numpy
import threading
from wifilib import *
from kalman5 import *
from fancha import *
import time
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
my_sender = '3284306656@qq.com' # 发件人邮箱账号
my_pass = 'bmjvijanuogzchbc' # 发件人邮箱授权码
my_user = '3377646378@qq.com' # 收件人邮箱账号,我这边发送给自己
def mail():
ret = True
try:
msg = MIMEText('有人入侵请注意!!!!!!', 'plain', 'utf-8')
msg['From'] = formataddr(["XXX", my_sender])
msg['To'] = formataddr(["XXX", my_user])
msg['Subject'] = "测试报告"
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass)
server.sendmail(my_sender, [my_user, ], msg.as_string()) #
server.quit()
except Exception:
ret = False
# print(1)
# global_data
def getCountAndIN(offset):
# path = r'csi8.dat'
# offset = int(offset)
# date = numpy.empty([1, 7])
# bf = read_bf_file_new2(path, offset)
# csi_list = list(map(get_scale_csi, bf))
# csi_np = (np.array(csi_list))
# csi_amp = np.abs(csi_np)
# csi_total = numpy.empty(csi_amp[:, 0, 0, 8].shape)
# for i in range(6):
# csi_total = csi_total + csi_amp[:, 0, 0, i]
# date = kalman_filter1(csi_amp[:, 0, 0, 8])
# print("test_data",date)
data = kalman_filter1(global_data)
data=data[3:50]
# print(data)
print(dynamic_variance1(data))
if detect_intrusion(dynamic_variance1(data)) == "intrusion":
intrusion_date = datetime.now()
intrusion_type = "无源入侵"
intrusion_description = "有人入侵您的家"
connection = get_db_connection()
cursor = connection.cursor()
sql = "INSERT INTO alarm_history (date, type, description) VALUES (%s, %s, %s)"
cursor.execute(sql, (intrusion_date, intrusion_type, intrusion_description))
connection.commit()
cursor.close()
connection.close()
threading.Thread(target=mail()).start() ##邮箱及授权码请自行配置,在SendMail下
return "intrusion"
else:
return "nobody"
def get_csi_data(port):
print("多线程1运行中…………")
ser = serial.Serial(port=port, baudrate=921600, bytesize=8, parity='N', stopbits=1, timeout=0.1)
pattern = r"\"\[(-?\d+,-?\d+)(,\s*-?\d+,-?\d+)*\]\""
while True:
if ser.in_waiting > 0:
data = ser.readline().decode('utf-8').strip()
match = re.search(pattern, data)
if match:
str_data = match.group(0) # 提取整个匹配项,包括引号
# list_data = str_data[1:-1] # 去掉外面的引号
data_string = str_data[2:-2]
# 使用split方法按逗号分割字符串,并使用列表推导式将每个字符串转换为整数
numbers_list = [int(num) for num in data_string.split(',')]
tmp_results = []
for i, j in zip(numbers_list[2::2], numbers_list[3::2]):
# 将数据添加到结果列表,63个
tmp_results.append(math.sqrt(i * i + j * j))
global_queue.put(variance(tmp_results))
# print(variance(tmp_results))
def variance(list):
avg = sum(list) / len(list)
sum_number = 0
for i in list:
sum_number += (i - avg) ** 2
return round(sum_number / len(list))
# def get_data():
# print("多线程2运行中…………")
# while(global_queue.qsize()>=50):
# global_data.clear()
# for i in range(51):
# global_data.append(global_queue.get())
port = "COM3"
th1 = Thread(target=get_csi_data, args=(port,))
th1.start()
if __name__ == "__main__":
try:
# th1 = Thread(target=get_csi_data, args=(port,))
# th1.start()
app.run()
except Exception:
input("输入任意字符串结束")
th1.join()
解释这串python代码