protected override void OnStarted() { base.OnStarted(); EDCDispatch = this.Bootstrap.GetServerByName("EDCServer") as IDispatch; LogServerManager.AddRunLog(OperationType.System, "服务器CommandDispatchServer启动"); Console.WriteLine("服务器CommandDispatchServer启动"); }
protected override void OnStarted() { base.OnStarted(); try { manager = new OMServerManager(); manager.LoadDeviceInfo(); if (timer == null) { timer = new System.Timers.Timer(); timer.Interval = 1000 * 30;//0.5分钟采集一次 timer.Elapsed += new ElapsedEventHandler((sender, e) => { manager.Query_CameraStatus_Info(SendCameraStatusInfo); manager.Query_UPSStatus_Info(SendUPSStatusInfo); manager.Query_SolarEnergyStatus_Info(SendSolarEnergyStatusInfo); manager.Query_StationStatus_Info(SendStationStatusInfo); }); } timer.Start(); LogServerManager.AddRunLog(OperationType.System, "服务器OMServer启动"); Console.WriteLine("服务器OMServer启动"); } catch (Exception ex) { Console.WriteLine("服务器OMServer启动失败:" + ex.Message); } }
protected override void OnStopped() { base.OnStopped(); LogServerManager.AddRunLog(OperationType.System, "服务器OMServer已停止"); Console.WriteLine("服务器OMServer已停止"); if (timer != null) { timer.Stop(); } }
public void UpdateMailUser(MailUser mailUser) { try { mailUserRepository.Update(mailUser); } catch (Exception ex) { LogServerManager.AddErrLog(ErrLogType.DBErr, ex); } }
public void UpdateMailStatus(Guid mailID) { try { MailTable mailTable = mailTableRepository.GetEntityById(mailID); mailTable.IsRead = true; mailTableRepository.Update(mailTable); } catch (Exception ex) { LogServerManager.AddErrLog(ErrLogType.InnerErr, ex); throw; } }
private SerialCOMManager() { SerialCOMListRepository serialCOMListRepository = new SerialCOMListRepository(); List <SerialCOMList> serialCOMList = serialCOMListRepository.GetList(); TurnTableListRepository turnTableListRepository = new TurnTableListRepository(); List <Guid?> turnTableSerialComIDs = turnTableListRepository.GetListWithCondition(new { CommunicationType = 1 }).Select(_ => _.CommunicationID).ToList(); UPSListRepository UPSListRepository = new UPSListRepository(); List <Guid?> UPSSerialComIDs = UPSListRepository.GetListWithCondition(new { CommunicationType = 1 }).Select(_ => _.CommunicationID).ToList(); SolarEnergyListRepository solarEnergyListRepository = new SolarEnergyListRepository(); List <Guid?> solarEnergySerialComIDs = solarEnergyListRepository.GetListWithCondition(new { CommunicationType = 1 }).Select(_ => _.CommunicationID).ToList(); string falseMsg = string.Empty; foreach (var item in serialCOMList) { try { SerialPort serialPort = new SerialPort(); serialPort.PortName = item.COMNo; //COM口名 serialPort.BaudRate = item.Baud; //波特率 serialPort.DataBits = item.DataBit; //每个字节的标准数据位长度 serialPort.Parity = (Parity)item.CheckBit; serialPort.StopBits = StopBits.One; if (turnTableSerialComIDs.Contains(item.DeviceID)) { serialPort.DataReceived += TurntableSerialPortDataReceived; } else if (UPSSerialComIDs.Contains(item.DeviceID)) { serialPort.DataReceived += UPSSerialPortDataReceived; } else if (solarEnergySerialComIDs.Contains(item.DeviceID)) { serialPort.DataReceived += SolarEnergySerialPortDataReceived; } SerialPortDic[item.DeviceID] = serialPort; if (!OpenSerialCOM(item.DeviceID, out falseMsg)) { throw new Exception(falseMsg); } } catch (Exception ex) { Console.WriteLine(falseMsg); LogServerManager.AddErrLog(ErrLogType.DBErr, ex); continue; } } }
/// <summary> /// 获取太阳能状态信息 /// </summary> /// <param name="sendSolarEnergyStatus"></param> public void Query_SolarEnergyStatus_Info(Action <string> sendSolarEnergyStatus) { if (deviceInfo == null) { return; } StationList station = deviceInfo.StationList.Find(_ => _.PStationID == null); if (station == null) { return; } solarEnergyStatusList.Clear(); LogServerManager.AddRunLog(OperationType.System, "查询本级太阳能状态"); List <SolarEnergyList> solarEnergyList = deviceInfo.SolarEnergyList.FindAll(_ => _.CommunicationID.HasValue && _.CommunicationType == 1 && _.StationID == station.StationID); int mreCount = solarEnergyList.Count; MutipleThreadResetEvent tempMre = new MutipleThreadResetEvent(mreCount); solarEnergymre = tempMre; foreach (var item in solarEnergyList) { Guid SerialComID = item.CommunicationID.Value; //TODO:太阳能获取命令; } solarEnergymre.WaitAll(2000); #region 测试数据 SolarEnergyStatusList solarEnergyStatus = new SolarEnergyStatusList(); solarEnergyStatus.ID = 1; solarEnergyStatus.DeviceID = deviceInfo.SolarEnergyList.Find(_ => _.StationID == station.StationID).DeviceID; solarEnergyStatus.Name = deviceInfo.SolarEnergyList.Find(_ => _.StationID == station.StationID).Name; solarEnergyStatus.Alarm = 1; solarEnergyStatus.Humi = "30"; solarEnergyStatus.Resistance = "220"; solarEnergyStatus.SolarCurrent = "10"; solarEnergyStatus.Time = DateTime.Now; solarEnergyStatus.Temp = "30"; solarEnergyStatus.Voltage = "220"; solarEnergyStatusList.Add(solarEnergyStatus); #endregion string jsonContent = JsonConvert.SerializeObject(solarEnergyStatusList); sendSolarEnergyStatus(jsonContent); solarEnergymre.Dispose(); }
protected override void OnStarted() { base.OnStarted(); //报警服务初始化、设备控制服务初始化 try { AlarmBusiness.InitEvent(); LogServerManager.AddRunLog(OperationType.System, "服务器BCServer启动"); ControlInterface.Init(); Console.WriteLine("服务器BCServer启动"); } catch (Exception ex) { Console.WriteLine("服务器BCServer启动失败!"); } }
public bool WriteSerialCOM(Guid SerialComID, string writeStr, out string falseMsg) { try { if (!OpenSerialCOM(SerialComID, out falseMsg)) { throw new Exception(falseMsg); } SerialPort sp = SerialPortDic[SerialComID]; sp.Write(writeStr); return(true); } catch (Exception ex) { falseMsg = ex.Message; LogServerManager.AddErrLog(ErrLogType.DBErr, ex); return(false); } }
public override void ExecuteCommand(MailSession session, StringRequestInfo requestInfo) { MailTable mailTable = JsonConvert.DeserializeObject <MailTable>(requestInfo.Body); MailServerManager mailServerManager = new MailServerManager(); mailTable.MailFileName = mailServerManager.GetNewFileName(mailTable.MailFileName); if (!MailServerManager.OnlineUserDic.ContainsKey(mailTable.ReceiverIP))//不包含,返回错误 { session.TrySend(MailServerCommand.SendMailResult.ToString() + " " + JsonConvert.SerializeObject(new { Result = false, Message = string.Format("找不到收件人{0}", mailTable.Receiver) }) + "\r\n"); return; } //将邮件信息存储到服务器上 string basePath = AppDomain.CurrentDomain.BaseDirectory; string mailDirectory = Path.Combine(basePath, "MailCache"); string ReceiverDirectory = Path.Combine(mailDirectory, mailTable.ReceiverIP); string filePath = Path.Combine(ReceiverDirectory, mailTable.MailFileName); DirectoryInfo di = Directory.CreateDirectory(ReceiverDirectory); using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { fs.Write(mailTable.MailFile, 0, mailTable.MailFile.Length); } try { MailTableRepository mailTableRepository = new MailTableRepository(); mailTableRepository.Insert(mailTable); } catch (Exception ex) { LogServerManager.AddErrLog(LogServerManager.ErrLogType.DBErr, ex); } //清空发送的附件缓存 Array.Clear(mailTable.MailFile, 0, mailTable.MailFile.Length); //转发邮件给目标用户 foreach (var item in session.AppServer.GetSessions(_ => _.RemoteEndPoint.Address.ToString() == mailTable.ReceiverIP)) { string msg = MailServerCommand.ReceiveMail + " " + JsonConvert.SerializeObject(mailTable) + "\r\n"; item.TrySend(msg); } }
/// <summary> /// 将邮件信息存储到服务器上 /// </summary> /// <param name="mailTable"></param> public void SaveMail(MailTable mailTable) { try { if (!string.IsNullOrEmpty(mailTable.MailFileName)) { SaveMailFile(mailTable); } if (mailTable.ReceiverDic.Count == 1) { MailTableRepository mailTableRepository = new MailTableRepository(); mailTableRepository.Insert(mailTable); } else if (mailTable.ReceiverDic.Count > 1)//群发,拆分成多条保存 { foreach (var item in mailTable.ReceiverDic) { MailTable newMailTable = new MailTable(); newMailTable.ReceiverIP = item.Key; newMailTable.Receiver = item.Value; newMailTable.SenderIP = mailTable.SenderIP; newMailTable.Sender = mailTable.Sender; newMailTable.SendTime = mailTable.SendTime; newMailTable.MailTitle = mailTable.MailTitle; newMailTable.MailContent = mailTable.MailContent; newMailTable.MailFileName = mailTable.MailFileName; newMailTable.MailFileStorageName = mailTable.MailFileStorageName; MailTableRepository mailTableRepository = new MailTableRepository(); mailTableRepository.Insert(newMailTable); } } } catch (Exception ex) { LogServerManager.AddErrLog(ErrLogType.InnerErr, ex); throw ex; } }
public override void ExecuteCommand(LogSession session, StringRequestInfo requestInfo) { try { string[] contents = requestInfo.Body.Split(','); int pageNumber = 0; int.TryParse(contents[0], out pageNumber); int rowsPerPage = 0; int.TryParse(contents[1], out rowsPerPage); AlarmLogRepository repo = new AlarmLogRepository(); AlarmLogAssemble alarmLogAssemble = new AlarmLogAssemble(); alarmLogAssemble.PageNumber = pageNumber; alarmLogAssemble.rowsPerPage = rowsPerPage; alarmLogAssemble.LogCount = repo.RecordCount(); alarmLogAssemble.PageCount = (int)Math.Ceiling((double)alarmLogAssemble.LogCount / rowsPerPage); alarmLogAssemble.AlarmLogList = repo.GetListPaged(pageNumber, rowsPerPage, null, "AlarmTime desc"); session.TrySend(LogServerCommand.GetAlarmLogResult.ToString() + " " + JsonConvert.SerializeObject(alarmLogAssemble) + "\r\n"); } catch (Exception ex) { LogServerManager.AddErrLog(ErrLogType.InnerErr, ex); } }
protected override void OnStopped() { base.OnStopped(); LogServerManager.AddRunLog(OperationType.System, "服务器BMMSServer已停止"); }
/// <summary> /// 获取UPS状态信息 /// </summary> /// <param name="sendUPSStatus"></param> public void Query_UPSStatus_Info(Action <string> sendUPSStatus) { if (deviceInfo == null) { return; } StationList station = deviceInfo.StationList.Find(_ => _.PStationID == null); if (station == null) { return; } UPSStatusList.Clear(); LogServerManager.AddRunLog(OperationType.System, "查询本级UPS状态"); //Dictionary<Guid, SerialPort> SerialPortDic = serialCOMManager.GetSerialPortDic(); List <UPSList> UPSList = deviceInfo.UPSList.FindAll(_ => _.CommunicationID.HasValue && _.CommunicationType == 1 && _.StationID == station.StationID); int mreCount = UPSList.Count; MutipleThreadResetEvent tempMre = new MutipleThreadResetEvent(mreCount); upsmre = tempMre; foreach (var item in UPSList) { string falseMsg = string.Empty; Guid SerialComID = item.CommunicationID.Value; //if (!SerialPortDic.Keys.Contains(SerialComID)) // continue; //SerialPort sp = SerialPortDic[SerialComID]; //try //{ // if (!sp.IsOpen) // { // sp.ReadBufferSize = 4096;//输入缓冲区大小 // sp.WriteBufferSize = 2048;//输出缓冲区大小 // sp.ReceivedBytesThreshold = 42;//081完整数据长度为42,所以设置阈值为42 // sp.DataReceived += SerialPort_UPS_DataReceived; // sp.Open(); // byte[] buffer = Encoding.Default.GetBytes("Q1\r\n"); // sp.Write(buffer, 0, buffer.Length); // } //} //catch //{ // sp.Close(); //} byte[] buffer = Encoding.Default.GetBytes("Q1\r\n"); serialCOMManager.WriteSerialCOM(SerialComID, buffer, out falseMsg); } upsmre.WaitAll(2000); #region 测试数据 //UPSStatusList UPSStatus = new UPSStatusList(); //UPSStatus.ID = 1; //UPSStatus.DeviceID = deviceInfo.UPSList.Find(_ => _.StationID == station.StationID).DeviceID; //UPSStatus.Name = deviceInfo.UPSList.Find(_ => _.StationID == station.StationID).Name; //UPSStatus.InVoltage = "220"; //UPSStatus.LVoltage = "220"; //UPSStatus.OutVoltage = "220"; //UPSStatus.OutputLoad = "80"; //UPSStatus.Freq = "9600"; //UPSStatus.CellVoltage = "220"; //UPSStatus.Temperature = "30"; //UPSStatus.Alarm = "00000000"; //UPSStatus.Time = DateTime.Now.ToString(); //UPSStatusList.Add(UPSStatus); #endregion string jsonContent = JsonConvert.SerializeObject(UPSStatusList); sendUPSStatus(jsonContent); upsmre.Dispose(); upsmre = null; }
protected override void OnStarted() { base.OnStarted(); LogServerManager.AddRunLog(OperationType.System, "服务器EDCServer启动"); Console.WriteLine("服务器EDCServer启动"); }
protected override void OnStopped() { base.OnStopped(); LogServerManager.AddRunLog(OperationType.System, "服务器MailServer已停止"); Console.WriteLine("服务器MailServer已停止"); }
public void Query_CameraStatus_Info(Action <string> sendCameraStatus) { //Stopwatch sp = new Stopwatch(); //sp.Start(); if (!isLoaddeviceInfo) { return; } StationList station = deviceInfo.StationList.Find(_ => _.PStationID == null); if (station == null) { return; } cameraStatusList.Clear(); //LogServerManager.AddRunLog(OperationType.System, "查询本级摄像机状态"); Dictionary <string, HikSdkManager.UserID_m_lAlarmHandle> userIDDic = hikSdkManager.GetUserIDDic(); List <Task> taskList = new List <Task>(); foreach (var streamMedia in deviceInfo.StreamMediaList.Where(_ => _.StationID == station.StationID)) { taskList.Add(Task.Run(() => { bool isGetDVRConfig = false; bool isGetDVRWorkstate = false; if (!userIDDic.ContainsKey(streamMedia.VideoIP))//设备未登陆成功 { foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID)) { CameraStatusList newCameraStatus = new CameraStatusList(); newCameraStatus.DeviceID = camera.DeviceID; newCameraStatus.Name = camera.VideoName; newCameraStatus.IsOnline = false; newCameraStatus.Time = DateTime.Now; cameraStatusList.Add(newCameraStatus); } //continue; } else { HikSdkManager.UserID_m_lAlarmHandle userInfo = userIDDic[streamMedia.VideoIP]; uint dwDChanTotalNum = (uint)userInfo.deviceInfo.byIPChanNum + 256 * (uint)userInfo.deviceInfo.byHighDChanNum; #region 旧的设备状态需求 //uint dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40); //IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize); //Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false); //uint dwReturn = 0; //int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取 //if (!CHCNetSDK.NET_DVR_GetDVRConfig(userInfo.UserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn)) //{ // uint iLastErr = CHCNetSDK.NET_DVR_GetLastError(); // string errContent = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr; // //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code // LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent); //} //else //{ // m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40)); // uint dwAChanTotalNum = (uint)userInfo.deviceInfo.byChanNum; // uint dwDChanTotalNum = (uint)userInfo.deviceInfo.byIPChanNum + 256 * (uint)userInfo.deviceInfo.byHighDChanNum; // if (dwDChanTotalNum > 0) // { // byte byStreamType = 0; // foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID)) // { // int videoChannel = camera.VideoChannel - 33;//实际通道号 // byStreamType = m_struIpParaCfgV40.struStreamMode[videoChannel].byGetStreamType; // dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream); // CameraStatusList newCameraStatus = new CameraStatusList(); // switch (byStreamType) // { // //目前NVR仅支持直接从设备取流 NVR supports only the mode: get stream from device directly // case 0: // IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize); // Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream, ptrChanInfo, false); // m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO)); // dwSize = (uint)Marshal.SizeOf(m_struCompressionCfgV30); // IntPtr ptrCompressionCfgV30 = Marshal.AllocHGlobal((Int32)dwSize); // Marshal.StructureToPtr(m_struCompressionCfgV30, ptrCompressionCfgV30, false); // CHCNetSDK.NET_DVR_COMPRESSION_INFO_V30 m_struCompressionInfoV30 = new CHCNetSDK.NET_DVR_COMPRESSION_INFO_V30(); // if (!CHCNetSDK.NET_DVR_GetDVRConfig(userInfo.UserID, CHCNetSDK.NET_DVR_GET_COMPRESSCFG_V30, camera.VideoChannel, ptrCompressionCfgV30, dwSize, ref dwReturn)) // { // uint iLastErr = CHCNetSDK.NET_DVR_GetLastError(); // string errContent = "NET_DVR_GET_COMPRESSCFG_V30 failed, error code= " + iLastErr; // //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code // LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent); // } // else // { // m_struCompressionCfgV30 = (CHCNetSDK.NET_DVR_COMPRESSIONCFG_V30)Marshal.PtrToStructure(ptrCompressionCfgV30, typeof(CHCNetSDK.NET_DVR_COMPRESSIONCFG_V30)); // m_struCompressionInfoV30 = m_struCompressionCfgV30.struNormHighRecordPara; // } // newCameraStatus.DeviceID = camera.DeviceID; // newCameraStatus.Name = camera.VideoName; // //newCameraStatus.IsOnline = BitConverter.ToBoolean(new byte[] { m_struChanInfo.byEnable }, 0); // //newCameraStatus.NetStatus = newCameraStatus.IsOnline; // //newCameraStatus.ImgStatus = newCameraStatus.IsOnline ? 2 : 0; // //newCameraStatus.ImgQuality = m_struCompressionInfoV30.byPicQuality; // //newCameraStatus.BitStream = bitStreamDic[m_struCompressionInfoV30.dwVideoBitrate]; // newCameraStatus.Time = DateTime.Now; // cameraStatusList.Add(newCameraStatus); // Marshal.FreeHGlobal(ptrChanInfo); // break; // case 6: // IntPtr ptrChanInfoV40 = Marshal.AllocHGlobal((Int32)dwSize); // Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream, ptrChanInfoV40, false); // m_struChanInfoV40 = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40)); // Marshal.FreeHGlobal(ptrChanInfoV40); // break; // default: // break; // } // } // } // else // { // foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID)) // { // CameraStatusList newCameraStatus = new CameraStatusList(); // newCameraStatus.DeviceID = camera.DeviceID; // newCameraStatus.Name = camera.VideoName; // //newCameraStatus.IsOnline = true; // //newCameraStatus.NetStatus = newCameraStatus.IsOnline; // //newCameraStatus.ImgStatus = 0; // //newCameraStatus.ImgQuality = 0; // newCameraStatus.Time = DateTime.Now; // cameraStatusList.Add(newCameraStatus); // } // } //} #endregion CHCNetSDK.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40 = new CHCNetSDK.NET_DVR_IPPARACFG_V40(); uint dwSizeIpParaCfgV40 = (uint)Marshal.SizeOf(m_struIpParaCfgV40); IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSizeIpParaCfgV40); Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false); uint dwReturn = 0; int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取 if (dwDChanTotalNum > 0) //数字通道 { if (!CHCNetSDK.NET_DVR_GetDVRConfig(userInfo.UserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSizeIpParaCfgV40, ref dwReturn)) { uint iLastErr = CHCNetSDK.NET_DVR_GetLastError(); string errContent = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr; //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent); isGetDVRConfig = false; } else { m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40)); Marshal.FreeHGlobal(ptrIpParaCfgV40); isGetDVRConfig = true; } } CHCNetSDK.NET_DVR_WORKSTATE_V30 struDvrWorkstate = new CHCNetSDK.NET_DVR_WORKSTATE_V30(); uint dwSizeDvrWorkstate = (uint)Marshal.SizeOf(struDvrWorkstate); IntPtr ptrDvrWorkstate = Marshal.AllocHGlobal((int)dwSizeDvrWorkstate); Marshal.StructureToPtr(struDvrWorkstate, ptrDvrWorkstate, false); if (!CHCNetSDK.NET_DVR_GetDVRWorkState_V30(userInfo.UserID, ptrDvrWorkstate)) { uint iLastErr = CHCNetSDK.NET_DVR_GetLastError(); string errContent = "NET_DVR_GetDVRWorkState_V30 failed, error code= " + iLastErr; //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent); isGetDVRWorkstate = false; } else { struDvrWorkstate = (CHCNetSDK.NET_DVR_WORKSTATE_V30)Marshal.PtrToStructure(ptrDvrWorkstate, typeof(CHCNetSDK.NET_DVR_WORKSTATE_V30)); Marshal.FreeHGlobal(ptrDvrWorkstate); isGetDVRWorkstate = true; } foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID)) { int channelNum = camera.VideoChannel - 1; CameraStatusList newCameraStatus = new CameraStatusList(); newCameraStatus.DeviceID = camera.DeviceID; newCameraStatus.Name = camera.VideoName; if (dwDChanTotalNum > 0 && isGetDVRConfig) //有数字通道且获取到了配置信息 { int videoChannel = camera.VideoChannel - 33; //实际通道号 byte byStreamType = m_struIpParaCfgV40.struStreamMode[videoChannel].byGetStreamType; uint dwSizeStream = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream); IntPtr ptrChanInfo = Marshal.AllocHGlobal((int)dwSizeStream); Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream, ptrChanInfo, false); CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO)); newCameraStatus.IsOnline = BitConverter.ToBoolean(new byte[] { m_struChanInfo.byEnable }, 0); Marshal.FreeHGlobal(ptrChanInfo); } else if (dwDChanTotalNum > 0 && !isGetDVRConfig)//有数字通道但未获取到了配置信息 { newCameraStatus.IsOnline = false; } else//模拟通道默认都在线 { newCameraStatus.IsOnline = true; } if (isGetDVRWorkstate) { newCameraStatus.RecordStatus = struDvrWorkstate.struChanStatic[channelNum].byRecordStatic + 1; newCameraStatus.SignalStatus = struDvrWorkstate.struChanStatic[channelNum].bySignalStatic + 1; newCameraStatus.HardwareStatus = struDvrWorkstate.struChanStatic[channelNum].byHardwareStatic + 1; newCameraStatus.BitRate = (int)struDvrWorkstate.struChanStatic[channelNum].dwBitRate; } newCameraStatus.Time = DateTime.Now; cameraStatusList.Add(newCameraStatus); } } })); } Task.WaitAll(taskList.ToArray()); string jsonContent = JsonConvert.SerializeObject(cameraStatusList); sendCameraStatus(jsonContent); //sp.Stop(); //Console.WriteLine(sp.Elapsed); }