单位上千路监控摄像头,全靠人工看画面正不正常,如果用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@

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐