示例#1
0
 protected override void OnStarted()
 {
     base.OnStarted();
     EDCDispatch = this.Bootstrap.GetServerByName("EDCServer") as IDispatch;
     LogServerManager.AddRunLog(OperationType.System, "服务器CommandDispatchServer启动");
     Console.WriteLine("服务器CommandDispatchServer启动");
 }
示例#2
0
        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);
            }
        }
示例#3
0
 protected override void OnStopped()
 {
     base.OnStopped();
     LogServerManager.AddRunLog(OperationType.System, "服务器OMServer已停止");
     Console.WriteLine("服务器OMServer已停止");
     if (timer != null)
     {
         timer.Stop();
     }
 }
示例#4
0
 public void UpdateMailUser(MailUser mailUser)
 {
     try
     {
         mailUserRepository.Update(mailUser);
     }
     catch (Exception ex)
     {
         LogServerManager.AddErrLog(ErrLogType.DBErr, ex);
     }
 }
示例#5
0
 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;
     }
 }
示例#6
0
        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;
                }
            }
        }
示例#7
0
        /// <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();
        }
示例#8
0
        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启动失败!");
            }
        }
示例#9
0
 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);
     }
 }
示例#10
0
        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);
            }
        }
示例#11
0
        /// <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;
            }
        }
示例#12
0
        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);
            }
        }
示例#13
0
 protected override void OnStopped()
 {
     base.OnStopped();
     LogServerManager.AddRunLog(OperationType.System, "服务器BMMSServer已停止");
 }
示例#14
0
        /// <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;
        }
示例#15
0
 protected override void OnStarted()
 {
     base.OnStarted();
     LogServerManager.AddRunLog(OperationType.System, "服务器EDCServer启动");
     Console.WriteLine("服务器EDCServer启动");
 }
示例#16
0
 protected override void OnStopped()
 {
     base.OnStopped();
     LogServerManager.AddRunLog(OperationType.System, "服务器MailServer已停止");
     Console.WriteLine("服务器MailServer已停止");
 }
示例#17
0
        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);
        }