/// <summary> /// 获取本地DB 广播列表 /// 用于剔除广播包中郊野等无效包 /// </summary> public void getDbBroadcastDeviceList() { if (StaticData.g_msBroadcastgDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msBroadcastgDBC.Open(); } string strCMD = "select device_bianhao,device_name from device_broadcast;"; MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msBroadcastgDBC); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { while (sqlReader.Read()) { //name,password string[] str = { sqlReader.GetString(0), sqlReader.GetString(1) }; //添加进字典 m_broadcastDeviceList.Add(Int16.Parse(str[0]), str[1]); // 初始化用于判断设备是否故障的dict m_broadcastDeviceOnlineList.Add(Int16.Parse(str[0]), DateTime.Now); } sqlReader.Close(); } StaticData.g_msBroadcastgDBC.Close(); }
/// <summary> /// 掉线进行插入表逻辑判断-> /// 判断如果某个设备不进行广播,则在十分钟后进行进一步逻辑判断-> /// 1. 如果这个设备record 已经在db_event中& status 为‘未处理’,则不做处理; /// 2. 如果这个设备record 已经在db_event中& status 为‘已处理’,则insert; /// 3. 如果这个设备record不在db_event中, 则insert. /// </summary> public void judgeBroadcastDeviceBreakdown(Int16 BroadcastDeviceId) { if (BroadcastDeviceId != 0) { m_broadcastDeviceOnlineList[BroadcastDeviceId] = DateTime.Now; } foreach (var item in m_broadcastDeviceOnlineList) { DataRow[] dr = StaticData.g_dtBroadcastDevice.Select("编号='" + (Int32)item.Key + "'"); string theone = dr[0]["theone"].ToString(); // 计算两个dateTime 的时间戳,单位s long timeSpan = StaticUtils.GetCurrentTimeUnix(DateTime.Now) - StaticUtils.GetCurrentTimeUnix(item.Value); // 未上报时长 > 阈值 if (timeSpan > StaticData.g_intBroadcastBreakdownTime) { if (StaticData.g_msBroadcastgDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msBroadcastgDBC.Open(); } string strCMD = "select * from event_assemble where target_theone='" + theone + "';"; MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msBroadcastgDBC); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { if (sqlReader.Read()) { // record 在设备表中 if (sqlReader["event_status"].ToString().Contains("已读")) { sqlReader.Close(); StaticData.g_msBroadcastgDBC.Close(); insertBrokenRecordToEventDb(item.Key, theone); // 将record作为新的event record进行插入 } else { sqlReader.Close(); StaticData.g_msBroadcastgDBC.Close(); // record 状态未处理 ,更新DB device_broadcast表 和 界面 updateBreakdownInfor(item.Key); } } else { sqlReader.Close(); StaticData.g_msBroadcastgDBC.Close(); insertBrokenRecordToEventDb(item.Key, theone); } } } // 未上报时长 <= 阈值时,就算event_assemble中显示未处理,仍更新状态为连接 } }
/// <summary> /// 掉线进行插入表逻辑判断-> /// 判断如果某个设备不进行广播,则在x分钟后进行进一步逻辑判断-> /// 1. 如果这个设备record 已经在db_event中& status 为‘未处理’,则不做处理; /// 2. 如果这个设备record 已经在db_event中& status 为‘已处理’,则insert; /// 3. 如果这个设备record不在db_event中, 则insert. /// </summary> public void judgeWifiDeviceBreakdown(string wifiTheone) { DataRow[] dr = StaticData.g_dtWifi.Select("theone='" + wifiTheone + "'"); // wifi设备状态 || 在线状态 发生异常时,进行报错并插入数据库 if (dr[0]["wifi设备状态"].Equals("警告") || dr[0]["wifi设备状态"].Equals("次要") || dr[0]["wifi设备状态"].Equals("重要") || dr[0]["wifi设备状态"].Equals("严重") || dr[0]["在线状态"].Equals("掉线")) { if (StaticData.g_msWifiDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msWifiDBC.Open(); } // 获取错误详情 string status = ""; if (dr[0]["wifi设备状态"].Equals("警告") || dr[0]["wifi设备状态"].Equals("次要") || dr[0]["wifi设备状态"].Equals("重要") || dr[0]["wifi设备状态"].Equals("严重")) { status = dr[0]["wifi设备状态"].ToString(); } else { status = ""; } if (dr[0]["在线状态"].Equals("掉线")) { status += dr[0]["在线状态"]; } string strCMD = "select * from event_assemble where target_theone='" + wifiTheone + "';"; MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msWifiDBC); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { if (sqlReader.Read()) { // record 在设备表中 if (sqlReader["event_status"].ToString().Contains("已处理")) { sqlReader.Close(); StaticData.g_msWifiDBC.Close(); insertBrokenRecordToEventDb(wifiTheone, status); // 将record作为新的event record进行插入 } else { sqlReader.Close(); StaticData.g_msWifiDBC.Close(); } } else { sqlReader.Close(); StaticData.g_msWifiDBC.Close(); insertBrokenRecordToEventDb(wifiTheone, status); } } } }
/// <summary> /// 读取数据库刷新 EventAssemble DataTable /// </summary> public void refreshEventTable() { if (StaticData.g_msEventAssembleDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msEventAssembleDBC.Open(); } else { return; } // 设置降序 string strCMD = "select * from event_assemble where event_type='event_app' and event_status='未读' and start_time> '" + Convert.ToString(last_PollForAppEvent_time) + "'ORDER BY id DESC;"; MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msEventAssembleDBC); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { StaticData.g_dtEventAssemble.Clear(); while (sqlReader.Read()) { DataRow dr = StaticData.g_dtEventAssemble.NewRow();//表格的行 dr["事件名称"] = sqlReader["event_name"].ToString(); dr["事件theone"] = sqlReader["event_theone"].ToString(); dr["事件类型"] = sqlReader["event_type"].ToString(); dr["事件状态"] = sqlReader["event_status"].ToString(); dr["时间"] = sqlReader["end_time"].ToString(); StaticData.g_dtEventAssemble.Rows.Add(dr);//添加 } if (StaticData.g_dtEventAssemble.Rows.Count > 0) { last_PollForAppEvent_time = Convert.ToDateTime(StaticData.g_dtEventAssemble.Rows[0]["时间"]); } sqlReader.Close(); } StaticData.g_msEventAssembleDBC.Close(); }
private void Form1_Load(object sender, EventArgs e) { //从自己的数据库中读取所有的连接第三方系统的参数配置信息 DBConnect getSystemArgvDBC = new DBConnect(); try { if (getSystemArgvDBC.msConn.State == System.Data.ConnectionState.Closed) { getSystemArgvDBC.msConn.Open(); } string strCMD = "select * from config_support_platform;"; MySqlCommand cmd = new MySqlCommand(strCMD, getSystemArgvDBC.msConn); MySqlDataReader sqlReader = null; string currentClassName = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { while (sqlReader.Read()) { //根据配置名称,将数据库公共配置表中取到的数据存入全局变量。 switch (sqlReader["config_type"].ToString()) { case "webSocketIP": StaticData.g_strWebSocketPort = sqlReader["port"].ToString(); break; //下面是其他第三方系统 //广播相关配置 case "broadcast": StaticData.g_strLocalIP = sqlReader["local_ip"].ToString(); StaticData.g_strBroadcastServerIP = sqlReader["online_ip"].ToString(); StaticData.g_strBroadcastServerPort = sqlReader["online_port"].ToString(); StaticData.g_strBroadcastListenPort = sqlReader["local_port"].ToString(); break; //机房相关配置 case "machineRoomConfig": StaticData.g_strMachineRoomUser = sqlReader["username"].ToString(); StaticData.g_strMachineRoomPassword = sqlReader["password"].ToString(); StaticData.g_strMachineRoomPort = sqlReader["port"].ToString(); StaticData.g_strMachineRommIP = sqlReader["nvrip"].ToString(); StaticData.g_strMachineRommDBname = sqlReader["dbname"].ToString(); break; //系统轮询时间 case "system_poll_freq": StaticData.g_nSystemPollFreq = Convert.ToInt32(sqlReader["value"]); break; //闸机相关配置 case "gate": break; //停车场相关配置 case "park": break; } } sqlReader.Close(); } /// 根据不同硬件, 读取本地数据库各硬件参数表中各自的参数 #region //机房相关独立配置 string strConfigCMD_machineRoom = "select * from config_event_computer_room;"; MySqlCommand configCmd_machineRoom = new MySqlCommand(strConfigCMD_machineRoom, getSystemArgvDBC.msConn); MySqlDataReader configSqlReader_machineRoom = null; if (StaticUtils.DBReaderOperationException(ref configCmd_machineRoom, ref configSqlReader_machineRoom, currentClassName, currentMethodName)) { StaticData.g_dictMachineRoomConfig = new Dictionary <string, int>(); while (configSqlReader_machineRoom.Read()) { StaticData.g_dictMachineRoomConfig.Add(configSqlReader_machineRoom["event_definition"].ToString(), Convert.ToInt32(configSqlReader_machineRoom["event_value"])); } configSqlReader_machineRoom.Close(); StaticData.g_intMachineRoomWarningIntervalTime = Convert.ToInt32(StaticData.g_dictMachineRoomConfig["warning"]); } //闸机相关独立配置 string strConfigCMD_gate = "select * from config_event_gate;"; MySqlCommand configCmd_gate = new MySqlCommand(strConfigCMD_gate, getSystemArgvDBC.msConn); MySqlDataReader configSqlReader_gate = null; if (StaticUtils.DBReaderOperationException(ref configCmd_gate, ref configSqlReader_gate, currentClassName, currentMethodName)) { StaticData.g_dictGateConfig = new Dictionary <string, int>(); while (configSqlReader_gate.Read()) { StaticData.g_dictGateConfig.Add(configSqlReader_gate["event_definition"].ToString(), Convert.ToInt32(configSqlReader_gate["event_value"])); } configSqlReader_gate.Close(); StaticData.g_intGateEarlyWarning = Convert.ToInt32(StaticData.g_dictGateConfig["warning"]); //闸机人数过多预警 StaticData.g_intGateWarning = Convert.ToInt32(StaticData.g_dictGateConfig["alarm"]); //闸机人数过多告警 StaticData.g_intGateWarningIntervalTime = Convert.ToInt32(StaticData.g_dictGateConfig["warning_interval"]); ////同一闸机相同报警Interval unit : s } //停车场相关独立配置 string strConfigCMD_park = "select * from config_event_park;"; MySqlCommand configCmd_park = new MySqlCommand(strConfigCMD_park, getSystemArgvDBC.msConn); MySqlDataReader configSqlReader_park = null; if (StaticUtils.DBReaderOperationException(ref configCmd_park, ref configSqlReader_park, currentClassName, currentMethodName)) { StaticData.g_dictParkConfig = new Dictionary <string, double>(); while (configSqlReader_park.Read()) { StaticData.g_dictParkConfig.Add(configSqlReader_park["event_definition"].ToString(), Convert.ToDouble(configSqlReader_park["event_value"])); } configSqlReader_park.Close(); StaticData.g_intParkWarningIntervalTime = Convert.ToInt32(StaticData.g_dictParkConfig["warning_interval"]); //同一停车场相同报警Interval unit : s StaticData.g_intParkEarlyWarning = Convert.ToDouble(StaticData.g_dictParkConfig["warning_rate"]); //车位使用过多预警 考虑到不同车位的容量不同,此处使用百分比 StaticData.g_intParkWarning = Convert.ToDouble(StaticData.g_dictParkConfig["alarm_rate"]); //车位使用过多告警 } #endregion getSystemArgvDBC.msConn.Close(); getSystemArgvDBC.msConn = null; } catch (Exception aaa) { Console.WriteLine(aaa.ToString()); MessageBox.Show(DateTime.Now.ToString() + " Mainform.class-Form1_Load : 数据库检索失败,请检查配置文件"); } }
/// <summary> /// 根据数据库对海康摄像头进行遍历 /// </summary> public void InitHKCamera() { StaticData.g_dtCamera.Columns.Add("序号", typeof(int)); StaticData.g_dtCamera.Columns.Add("编号", typeof(string)); StaticData.g_dtCamera.Columns.Add("摄像头名称", typeof(string)); StaticData.g_dtCamera.Columns.Add("摄像头状态", typeof(string)); StaticData.g_dtCamera.Columns.Add("IP地址", typeof(string)); StaticData.g_dtCamera.Columns.Add("用户名", typeof(string)); StaticData.g_dtCamera.Columns.Add("密码", typeof(string)); StaticData.g_dtCamera.Columns.Add("端口", typeof(int)); StaticData.g_dtCamera.Columns.Add("NVRIP地址", typeof(string)); StaticData.g_dtCamera.Columns.Add("通道号", typeof(string)); StaticData.g_dtCamera.Columns.Add("RTSP地址", typeof(string)); StaticData.g_dtCamera.Columns.Add("转码标识", typeof(int)); StaticData.g_dtCamera.Columns.Add("theone", typeof(string)); StaticData.g_dtCamera.Columns.Add("坐标", typeof(string)); StaticData.g_dtCamera.Columns.Add("RTMP地址", typeof(string)); StaticData.g_dtCamera.Columns.Add("HLS地址", typeof(string)); StaticData.g_dtCamera.Columns.Add("摄像头型号", typeof(string)); StaticData.g_dtCamera.Columns.Add("摄像头型类型", typeof(string)); StaticData.g_dtCamera.Columns.Add("摄像头型区域", typeof(string)); StaticData.g_dtCamera.Columns.Add("流ID", typeof(string)); //下面是转码配置,先不管 string strConfigPath = AppDomain.CurrentDomain.BaseDirectory + "config.ini"; m_hlsPort = OperateIniFile.ReadIniData("Login", "hlsPort", null, strConfigPath);//读取hls流使用的端口号 /*-------------------------------------------------------------------------------- * 读取camera表,获取IP、名称、channel、line等 * 进行摄像头状态获取及流转换处理 * 之后更新Form中的数据 * ---------------------------------------------------------------------------------*/ DBConnect getCameraDBC = new DBConnect(); try { if (getCameraDBC.msConn.State == System.Data.ConnectionState.Closed) { getCameraDBC.msConn.Open(); } string strCMD = "select device_paper_number,device_name,device_ip,device_type,device_area,device_nvrip,device_channel,device_theone,concat_ws(',',ST_X(device_point),ST_Y(device_point),device_height) as device_position,device_rtsp,device_transcoding_flag from device_camera;"; MySqlCommand cmd = new MySqlCommand(strCMD, getCameraDBC.msConn); MySqlDataReader sqlReaderCamera = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReaderCamera, currentClassName, currentMethodName)) { int i = 0; while (sqlReaderCamera.Read()) { DataRow dr = StaticData.g_dtCamera.NewRow();//表格的行 dr["序号"] = i; dr["编号"] = sqlReaderCamera["device_paper_number"].ToString(); dr["摄像头名称"] = sqlReaderCamera["device_name"].ToString(); dr["IP地址"] = sqlReaderCamera["device_ip"].ToString(); dr["摄像头型类型"] = sqlReaderCamera["device_type"].ToString(); dr["摄像头型区域"] = sqlReaderCamera["device_area"].ToString(); dr["NVRIP地址"] = sqlReaderCamera["device_nvrip"].ToString(); dr["通道号"] = sqlReaderCamera["device_channel"].ToString(); dr["theone"] = sqlReaderCamera["device_theone"].ToString(); dr["坐标"] = sqlReaderCamera["device_position"].ToString(); dr["RTSP地址"] = sqlReaderCamera["device_rtsp"].ToString(); // 针对转码标识为空无法直转int 作条件判断 if (sqlReaderCamera["device_transcoding_flag"] is System.DBNull || "".Equals(sqlReaderCamera["device_transcoding_flag"])) { dr["转码标识"] = 0; } else { dr["转码标识"] = Convert.ToInt32(sqlReaderCamera["device_transcoding_flag"]); } dr["IP地址"] = sqlReaderCamera["device_ip"].ToString(); dr["用户名"] = "admin"; dr["密码"] = "admin123456"; dr["端口"] = 8000; StaticData.g_dtCamera.Rows.Add(dr);//添加 i++; } //读取完所有摄像头后,遍历一遍状态 //遍历一遍NVR,将NVR中各个通道的状态与摄像头列表进行管线,进行整体状态维护,其中根据NVRIP 与通道号进行关联 for (int k = 0; k < StaticData.g_dtNVR.Rows.Count; k++) { Hikvision hikivisionList = new HikIPListFun(); hikivisionList.IPListFun(Convert.ToInt32(StaticData.g_dtNVR.Rows[k]["userid"])); //调用IPList方法,将状态写入到dicIPList字典中 } sqlReaderCamera.Close(); } getCameraDBC.msConn.Close(); getCameraDBC.msConn = null; } catch { StaticUtils.ShowEventMsg("HikvisionAlarmCallBackFun.class-InitHKCamera : 利用DB初始化摄像头出现异常!!\n"); } }
/// <summary> /// 根据数据库对海康NVR进行初始化 /// </summary> public void InitNVR() { try { /* * 读取nvr表,并根据反射进行摄像头SDK注册 */ StaticData.g_dtNVR.Columns.Add("序号", typeof(int)); StaticData.g_dtNVR.Columns.Add("IP地址", typeof(string)); StaticData.g_dtNVR.Columns.Add("用户名", typeof(string)); StaticData.g_dtNVR.Columns.Add("密码", typeof(string)); StaticData.g_dtNVR.Columns.Add("端口", typeof(int)); StaticData.g_dtNVR.Columns.Add("userid", typeof(int)); DBConnect getNvrDBC = new DBConnect(); try { if (getNvrDBC.msConn.State == System.Data.ConnectionState.Closed) { getNvrDBC.msConn.Open(); } string strCMD = "select username,password,nvrip from config_support_platform where config_type='nvr';"; MySqlCommand cmd = new MySqlCommand(strCMD, getNvrDBC.msConn); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { int i = 0; while (sqlReader.Read()) { //得到了NVR数据库 //IP,name,password string[] str = { sqlReader["nvrip"].ToString(), sqlReader["username"].ToString(), sqlReader["password"].ToString() }; Hikvision hikCamera = CameraNVR.CreateCamera("Hikvision"); hikCamera.CameraInit(str[0], 8000, str[1], str[2]); //海康SDK注册 DataRow dr = StaticData.g_dtNVR.NewRow(); //表格的行 dr["序号"] = i; dr["IP地址"] = str[0]; dr["用户名"] = str[1]; dr["密码"] = str[2]; dr["端口"] = 8000;//以后也可以做成可以配置的 dr["userid"] = Hikvision.m_iUserID; StaticData.g_dtNVR.Rows.Add(dr);//添加 i++; } sqlReader.Close(); } getNvrDBC.msConn.Close(); getNvrDBC.msConn = null; } catch { throw; } } catch (Exception) { StaticUtils.ShowEventMsg("SkyinforHikvision.class-InitNVR : 海康NVR进行初始化出现异常!!\n"); //throw; } }
/// <summary> /// 用于轮询时刷新摄像头状态,轮询状态意义不大。不用轮询 /// </summary> public void QueryCameras() { /*------------------------------------------------------------------------ * 读取camera表,获取IP、名称、channel、line等 * 进行摄像头状态获取及流转换处理 * 之后更新Form中的数据 * ------------------------------------------------------------------------*/ string strCMD = "select * from device_camera;"; if (StaticData.g_msVideQueryConn.State == System.Data.ConnectionState.Closed) { StaticData.g_msVideQueryConn.Open(); } MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msVideQueryConn); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { int i = 0; while (sqlReader.Read()) { /*---------------------------------------------------------------------------------------------------------------------------------------- * 下面读取到camera表的所有字段,依次为 * id(0) name(1) position(2) ip(3) type(4) username(5) password(6) theon(7) time(8) line(9) nvrip(10) rtspstreamid(11) * ------------------------------------------------------------------------------------------------------------------------------------------*/ //string[] strCamera = { sqlReader.GetString(0), sqlReader.GetString(1), sqlReader.GetString(2), sqlReader.GetString(3), sqlReader.GetString(4), sqlReader.GetString(5), sqlReader.GetString(6) //, sqlReader.GetString(7), sqlReader.GetString(8), sqlReader.GetString(9), sqlReader.GetString(10), sqlReader.GetString(11)}; DataRow dt = StaticData.g_dtCamera.NewRow();//表格的行 dt["序号"] = i; dt["编号"] = sqlReader["device_paper_number"].ToString(); dt["摄像头名称"] = sqlReader["device_name"].ToString(); dt["IP地址"] = sqlReader["device_ip"].ToString(); dt["摄像头型类型"] = sqlReader["device_type"].ToString(); dt["摄像头型区域"] = sqlReader["device_area"].ToString(); dt["NVRIP地址"] = sqlReader["device_nvrip"].ToString(); dt["通道号"] = sqlReader["device_channel"].ToString(); dt["用户名"] = "admin"; dt["密码"] = "admin123456"; dt["RTSP地址"] = "rtsp://"; dt["端口"] = 8000; string strCameraState = ""; try { Hikvision hikivisionList = new HikIPListFun(); hikivisionList.IPListFun(Hikvision.m_iUserID); //调用IPList方法,将状态写入到dicIPList字典中 strCameraState = hikivisionList.dicIPList[sqlReader["device_channel"].ToString()]; //从字典中读取到该摄像头的状态 } catch (Exception) { strCameraState = "ERROR"; StaticUtils.ShowEventMsg("SkyinforHikvision.class-QueryCameras : 轮询刷新摄像头状态出现异常!!\n"); } //dt.Rows[i]["摄像头状态"] = strCameraState; //dt.Rows[i]["用户名"] = strCamera[5];//这个要查询数据库的,我先放着了,你继续完善 //dt.Rows[i]["密码"] = strCamera[6];//这个要查询数据库的,我先放着了,你继续完善 //dt.Rows[i]["NVR IP地址"] = strCamera[10];//这个要查询数据库的,我先放着了,你继续完善 //dt.Rows[i]["RTSP地址"] = "rtsp://" + dt.Rows[i]["用户名"] + ":" + dt.Rows[i]["密码"] + "@" + dt.Rows[i]["NVR IP地址"] + ":554/Streaming/Channels/" + dt.Rows[i]["流ID"]; //dt.Rows[i]["RTMP地址"] = "rtmp://" + StaticData.g_strLocalIP + "/live/" + dt.Rows[i]["通道号"]; //dt.Rows[i]["HLS地址"] = "http://" + StaticData.g_strLocalIP +":"+m_hlsPort+ "/live/" + dt.Rows[i]["通道号"] + "/hls.m3u8"; i++; if (i > StaticData.g_dtCamera.Rows.Count - 1) { i = StaticData.g_dtCamera.Rows.Count - 1; } } sqlReader.Close(); } }
/// <summary> /// 将异常record作为新的event record插入event_assemble & event_gate /// 判断数据库是否存在该事件,且时间是否x seconds以上才再次触发,存在且是的话插入新事件 /// x为StaticData中的全局变量 /// </summary> /// <param name="gateName"> 闸机名称 </param> /// <param name="strLevel"> 事件等级判断 </param> /// public string insertPersonTooMuchRecordToEventDb(string gateName, string strLevel) { if (StaticData.g_msGateDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msGateDBC.Open(); } //生成eventtheon string strEventTheOne = Guid.NewGuid().ToString(); DataRow[] dr = StaticData.g_dtGate.Select("闸机名称='" + gateName + "'"); string theone = dr[0]["theone"].ToString(); string strGatePosition = dr[0]["坐标"].ToString(); string strCMD = "select * from event_assemble where target_theone='" + theone + "' ORDER BY id DESC LIMIT 1;"; if (StaticData.g_msEventAssembleDBC.State == System.Data.ConnectionState.Closed) { StaticData.g_msEventAssembleDBC.Open(); } MySqlCommand cmd = new MySqlCommand(strCMD, StaticData.g_msEventAssembleDBC); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { if (sqlReader.Read()) { // 计算两个dateTime 的时间戳,单位s long timeSpan = StaticUtils.GetCurrentTimeUnix(DateTime.Now) - StaticUtils.GetCurrentTimeUnix(Convert.ToDateTime(sqlReader["end_time"])); if (timeSpan < StaticData.g_intGateWarningIntervalTime) { sqlReader.Close(); return(""); // 返回\"\"代表无需后续步骤,eg step: web端上传 } else if (sqlReader["event_status"].ToString().Equals("已读")) { sqlReader.Close(); return(""); // 返回\"\"代表无需后续步骤,eg step: web端上传 } } sqlReader.Close(); } else { return(""); } // 将record作为新的event record进行插入 DataRow[] dr_abnormal_super = StaticData.g_dtAbnormalInfor.Select("故障父类名称='event_gate'"); DataRow[] dr_abnormal_sub = StaticData.g_dtAbnormalInfor.Select("父ID='" + dr_abnormal_super[0]["ID"] + "'"); string event_name = ""; //故障二级名称 string strInsert_assemble = ""; string strInsert_gate = ""; if (strLevel.Equals("一般情况")) { // 数据库存储按照等级进行存储, 级别越低,id越低 event_name = dr_abnormal_sub[0]["故障子类名称"].ToString(); strInsert_assemble = "INSERT INTO event_assemble (event_name,event_theone,event_type,start_time,end_time,event_status,position,event_level,target_theone) values" + "('" + event_name + "','" + strEventTheOne + "','event_gate','" + DateTime.Now.ToString().Replace('/', '-') + "','" + DateTime.Now.ToString().Replace('/', '-') + "','未读','" + strGatePosition + "','" + strLevel + "','" + theone + "');"; strInsert_gate = "INSERT INTO event_gate (event_theone,device_event_type,device_theone) values" + "('" + strEventTheOne + "','" + event_name + "','" + theone + "');"; } else { event_name = dr_abnormal_sub[1]["故障子类名称"].ToString(); strInsert_assemble = "INSERT INTO event_assemble (event_name,event_theone,event_type,start_time,end_time,event_status,position,event_level,target_theone) values" + "('" + event_name + "','" + strEventTheOne + "','event_gate','" + DateTime.Now.ToString().Replace('/', '-') + "','" + DateTime.Now.ToString().Replace('/', '-') + "','未读','" + strGatePosition + "','" + strLevel + "','" + theone + "');"; strInsert_gate = "INSERT INTO event_gate (event_theone,device_event_type,device_theone) values" + "('" + strEventTheOne + "','" + event_name + "','" + theone + "');"; } MySqlCommand insertAssembleCmd = new MySqlCommand(strInsert_assemble, StaticData.g_msGateDBC); MySqlCommand insertGateCmd = new MySqlCommand(strInsert_gate, StaticData.g_msGateDBC); StaticUtils.DBNonQueryOperationException(ref insertAssembleCmd, currentClassName, currentMethodName); StaticUtils.DBNonQueryOperationException(ref insertGateCmd, currentClassName, currentMethodName); return(strEventTheOne); }
//读取事件数据库,判断数据库是否存在该事件,且时间是否2分钟以上才再次触发,存在且是的话插入新事件 //不是的话更新endtime字段为当前时间 //不存在的话直接插入数据 private void CheckEvent(string strDevice, string strTarget_theone, string strEvent, string strTime, string strPosition, string srtCameraName, string[] paras, string channelName) { //事件比较特殊,可有可能同时都会调用,所以这里每次调用的时候,都新建一个数据库的conn DBConnect dbCheck = new DBConnect(); DBConnect dbInsORUp = new DBConnect(); string[] strReadDB = new string[] { }; try { //判断数据库状态并打开数据库连接 if (dbCheck.msConn.State == System.Data.ConnectionState.Closed) { dbCheck.msConn.Open(); } if (dbInsORUp.msConn.State == System.Data.ConnectionState.Closed) { dbInsORUp.msConn.Open(); } // string strCMD = "select theone,event,endtime from event;"; string strCMD = "select end_time from event_assemble where target_theone='" + strTarget_theone + "' ORDER BY id DESC LIMIT 1;"; MySqlCommand cmd = new MySqlCommand(strCMD, dbCheck.msConn); MySqlDataReader sqlReader = null; string currentMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (StaticUtils.DBReaderOperationException(ref cmd, ref sqlReader, currentClassName, currentMethodName)) { while (sqlReader.Read()) { strReadDB = new string[] { sqlReader.GetString(0) }; //逐条数据判断 //判断数据库中是否存在数据 if (strReadDB != null) { //比较endtime的时间和当前时间 //传入时间 DateTime data_create = Convert.ToDateTime(strTime); DateTime data_db = Convert.ToDateTime(strReadDB[0]); // 相同报警间隔time unit: s long time_interval = StaticUtils.GetCurrentTimeUnix(data_create) - StaticUtils.GetCurrentTimeUnix(data_db); if (time_interval < 120) { string strUpdate = "UPDATE event_assemble SET end_time='" + strTime + "' WHERE target_theone='" + strTarget_theone + "' AND end_time='" + strReadDB[0] + "';"; MySqlCommand cmdUpdate = new MySqlCommand(strUpdate, dbInsORUp.msConn); StaticUtils.DBNonQueryOperationException(ref cmd, currentClassName, currentMethodName); //跳出 goto here; } } } } string event_name = ""; //故障二级名称 //事件等级判断 string strLevel = ""; if (strEvent.Contains("信号丢失")) { strLevel = "一般情况"; event_name = "监控设备掉线"; } else if (strEvent.Contains("移动侦测")) { strLevel = "一般情况"; event_name = "监控移动侦测"; } else if (strEvent.Contains("穿越警戒面")) { strLevel = "重要情况"; event_name = "监控越界侦测"; } //生成eventtheon string strEventTheOne = Guid.NewGuid().ToString(); //插入数据 //往总表跟字表里面都插入数据 DataRow[] dr_abnormal_super = StaticData.g_dtAbnormalInfor.Select("故障父类名称='event_camera'"); DataRow[] dr_abnormal_sub = StaticData.g_dtAbnormalInfor.Select("父ID='" + dr_abnormal_super[0]["ID"] + "'"); string strInsert1 = "INSERT INTO event_assemble (event_name,event_theone,event_type,start_time,end_time,event_status,position,event_level,target_theone) values" + "('" + event_name + "','" + strEventTheOne + "','event_camera','" + DateTime.Now.ToString().Replace('/', '-') + "','" + DateTime.Now.ToString().Replace('/', '-') + "','未读','" + strPosition + "','" + strLevel + "','" + strTarget_theone + "');"; string strInsert2 = "INSERT INTO event_camera (event_theone,device_event_type,device_theone) values" + "('" + strEventTheOne + "','" + event_name + "','" + strTarget_theone + "');"; MySqlCommand cmdInsert = new MySqlCommand(strInsert1, dbInsORUp.msConn); StaticUtils.DBNonQueryOperationException(ref cmdInsert, currentClassName, currentMethodName); MySqlCommand cmdInsert2 = new MySqlCommand(strInsert2, dbInsORUp.msConn); StaticUtils.DBNonQueryOperationException(ref cmdInsert2, currentClassName, currentMethodName); //向web上报事件 string strSendMSG = jscontrol.EventJson(strEventTheOne); Mainform.form1.SendMsgToWebSocketClients(strSendMSG); //更新UI界面 StaticUtils.ShowEventMsg("报警时间:" + paras[0] + " NVRIP:" + paras[1] + " 事件类型:" + event_name + " 通道号:" + channelName + " 摄像机名称:" + strDevice + "\n"); //计数加一 StaticData.g_inAlarmNum++; here: dbInsORUp.msConn.Close(); sqlReader.Close(); dbCheck.msConn.Close(); } catch (Exception e) { StaticUtils.ShowEventMsg("HikvisionAlarmCallBackFun.class-CheckEvent : 插入摄像头报警事件出现异常!!\n"); } }