单位上千路监控摄像头,全靠人工看画面正不正常,如果用ping来判断有时又会出现摄像机在线,存储却取不到流不能录像,所以写了这个, 目前运行正常,很有效哦,都不用人工报修了,还可以用报表工具统计故障率、维修时长效率等,本人新手,发文记录一下自学历程,各位大神勿喷。
import json
import os
import time
from configparser import ConfigParser
import datetime
import cv2
import requests
import pymysql
#连接数据库
db = pymysql.connect(host="127.0.0.1", user="admin", password="admin", database="test", port=3306)
cursor = db.cursor()
def now(): #取现行时间 到秒
i = datetime.datetime.now()
ii = str(i)
ii = ii[0:19]
return ii
def readdb(ipaddr): #读取某ip地址的最新一条数据的conntime字段 也就是取流恢复的时间
sql = "SELECT conntime FROM jiankong WHERE ID =(SELECT MAX(ID) FROM jiankong WHERE IP='" + ipaddr + "')"
cursor.execute(sql)
result = cursor.fetchall()
if result != ():
aa = result[0][0]
else:
aa = result
return aa
def readtime(ipaddr): #读取某IP地址的最新一条数据的misstime字段 也就是取流失败的时间
sql = "SELECT misstime FROM jiankong WHERE ID =(SELECT MAX(ID) FROM jiankong WHERE IP='" + ipaddr + "')"
cursor.execute(sql)
result = cursor.fetchall()
if result != ():
aa = result[0][0]
else:
aa = result
return aa
def readusetime(ipaddr): #读取某IP地址的最新一条数据的fixtime字段 也就是从故障到恢复的时间
sql = "SELECT fixtime FROM jiankong WHERE ID =(SELECT MAX(ID) FROM jiankong WHERE IP='" + ipaddr + "')"
cursor.execute(sql)
result = cursor.fetchall()
if result != ():
aa = result[0][0]
else:
aa = result
return aa
def writemissdb(name, ip): #新插入一条取流失败的数据,在conntime里写入1 用来判断是否已报修避免重复报修
sql = "INSERT INTO jiankong (name,ip,misstime,conntime) VALUES ('" + name + "','" + ip + "','" + now() + "','1')"
result = cursor.execute(sql)
db.commit()
def writefixdb(ip): #写入取流恢复时间 并将fixtime写入从故障到恢复的时间
now2 = usetime(readtime(ip), now())
sql = "UPDATE jiankong SET conntime ='" + now() + "',fixtime ='" + now2 + "' WHERE ID IN(SELECT * FROM (SELECT MAX(ID) FROM jiankong WHERE IP='" + ip + "') A)"
result = cursor.execute(sql)
db.commit()
def usetime(time1, time2): #计算两个时间的差
first = datetime.datetime.strptime(time1, "%Y-%m-%d %H:%M:%S")
last = datetime.datetime.strptime(time2, "%Y-%m-%d %H:%M:%S")
result = last - first
result = str(result)
return result
key = #群机器人的key
def send_msg(content):
"""艾特全部,并发送指定信息"""
data = json.dumps({"msgtype": "text", "text": {"content": content, "mentioned_list": ["@all"]}})
r = requests.post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + key, data,
auth=('Content-Type', 'application/json'))
print(r.json)
#config文件读取
path = os.path.abspath('.')
configpath = path + '\\conf.ini'
exist = os.path.exists(configpath)
def ex(lpath):
exi = os.path.exists(lpath)
return exi
def main():
try:
while exist is True:
conn = ConfigParser()
conn.read(configpath, encoding='utf-8-sig')
ip = conn.sections()
user = conn.get('user', 'user')
login = conn.get('login', 'admin')
ip.remove('user')
ip.remove('login')
for item in ip:
img1 = cv2.VideoCapture(login + item + ':554/Streaming/Channels/1')
ret, img = img1.read()
if ret:
#cv2.imwrite(path + '\\' + item + '.jpg', img)
a = 0
print(item + "--取流成功")
nam = conn.get(item, 'nam')
x = readdb(item)
y = readtime(item)
if x == '1':
writefixdb(item)
timeuse = readusetime(item)
send_msg(nam + "已恢复,本次故障时长" + timeuse)
else: #一次取流失败后再取一次,两次失败才确诊
img1 = cv2.VideoCapture(login + item + ':554/Streaming/Channels/1')
ret, img = img1.read()
if not ret:
nam = conn.get(item, 'nam')
x = readdb(item)
# expath = path + nam + '.txt'
# # print(expath)
if x != "1":
print(nam + item + '此摄像机取流失败')
send_msg('@所有人 监控画面丢失报警:\n' + nam + ' ' + item + '\n此摄像机取流失败,画面丢失,请安排维修')
writemissdb(nam, item)
# log = open(expath, 'w')
# log.write(str(datetime.datetime.now()))
# log.close()
else:
cv2.imwrite(os.path.join(path, item + '.jpg'), img)
print(item + "--取流成功")
nam = conn.get(item, 'nam')
x = readdb(item)
# expath = os.path.join(path, nam + '.txt')
# if ex(expath) is True:
# os.remove(expath)
if x == '1':
writefixdb(item)
timeuse = readusetime(item)
send_msg(nam + "已恢复,本次维修用时"+timeuse)
else:
print('未找到conf.ini,即将退出')
time.sleep(5)
os._exit(0)
except Exception as n:
print(n)
if __name__ == '__main__':
main()
conf.ini文件内容
[192.168.0.54]
nam=大门口
[192.168.0.55]
nam=库房
[192.168.0.56]
nam=财务
[user]
user=zhangsan|lisi|wangwu
[login]
admin=rtsp://admin:admin@