Пример #1
0
        public PTZInfo GetPTZInfo(string devIp, int devPort, string userName, string password)
        {
            PTZInfo ptzInfo = new PTZInfo();

            int           userId        = -1;
            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            CHCNetSDK.NET_DVR_PTZPOS ptzPos = new CHCNetSDK.NET_DVR_PTZPOS();
            uint   dwReturn  = 0;
            int    nSize     = Marshal.SizeOf(ptzPos);
            IntPtr ptrPtzCfg = Marshal.AllocHGlobal(nSize);

            Marshal.StructureToPtr(ptzPos, ptrPtzCfg, false);

            if (CHCNetSDK.NET_DVR_GetDVRConfig(userId, CHCNetSDK.NET_DVR_GET_PTZPOS, -1, ptrPtzCfg, (UInt32)nSize, ref dwReturn))
            {
                ptzPos = (CHCNetSDK.NET_DVR_PTZPOS)Marshal.PtrToStructure(ptrPtzCfg, typeof(CHCNetSDK.NET_DVR_PTZPOS));

                //成功获取显示ptz参数
                ushort wPanPos = Convert.ToUInt16(Convert.ToString(ptzPos.wPanPos, 16));
                ptzInfo.Pan = wPanPos * 0.1f;
                ushort wTiltPos = Convert.ToUInt16(Convert.ToString(ptzPos.wTiltPos, 16));
                ptzInfo.Tilt = wTiltPos * 0.1f;
                ushort wZoomPos = Convert.ToUInt16(Convert.ToString(ptzPos.wZoomPos, 16));
                ptzInfo.Zoom = wZoomPos * 0.1f;
            }

            Marshal.FreeHGlobal(ptrPtzCfg);
            return(ptzInfo);
        }
Пример #2
0
        /// <summary>
        /// 开始录像
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="channel"></param>
        /// <param name="loginId"></param>
        /// <param name="playHandle"></param>
        /// <returns></returns>
        public int StartRecord(string fileName, string devIp, int devPort, string userName, string password, int channel, int playHandle)
        {
            int userId = -1;

            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            if (userId < 0)
            {
                return(-1);
            }

            //强制I帧 Make a I frame
            CHCNetSDK.NET_DVR_MakeKeyFrame(userId, channel);

            //开始录像 Start recording
            if (!CHCNetSDK.NET_DVR_SaveRealData(playHandle, fileName))
            {
                uint lastErr = CHCNetSDK.NET_DVR_GetLastError();
                LogHelper.Default.Debug(string.Format("设备{0}预览开始录像失败,错误代码[{1}]", playHandle, lastErr));
                return(Math.Abs((int)lastErr) * (-1));
            }

            return(0);
        }
Пример #3
0
        public int StartReplayByFile(IntPtr screenHandle, string devIp, int devPort, string userName, string password, string recordFileName)
        {
            int userId = -1;

            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            if (userId < 0)
            {
                return(-1);
            }

            //按文件名回放
            int replayHandle = CHCNetSDK.NET_DVR_PlayBackByName(userId, recordFileName, screenHandle);

            if (replayHandle < 0)
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                return(Math.Abs((int)iLastErr) * (-1));
            }

            uint iOutValue = 0;

            if (!CHCNetSDK.NET_DVR_PlayBackControl_V40(replayHandle, CHCNetSDK.NET_DVR_PLAYSTART, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue))
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                return(Math.Abs((int)iLastErr) * (-1));
            }

            return(replayHandle);
        }
Пример #4
0
        /// <summary>
        /// 抓jpeg图
        /// </summary>
        /// <param name="loginId"></param>
        /// <param name="channel"></param>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public int CapturePictureJPEG(string devIp, int devPort, string userName, string password, int channel, string fileName)
        {
            int userId = -1;

            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            if (userId < 0)
            {
                return(-1);
            }

            CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new CHCNetSDK.NET_DVR_JPEGPARA();
            //图像质量 Image quality
            lpJpegPara.wPicQuality = 0;
            //抓图分辨率 Picture size: 2- 4CIF,0xff- Auto(使用当前码流分辨率),抓图分辨率需要设备支持,更多取值请参考SDK文档
            lpJpegPara.wPicSize = 0xff;

            //JPEG抓图 Capture a JPEG picture
            if (!CHCNetSDK.NET_DVR_CaptureJPEGPicture(userId, channel, ref lpJpegPara, fileName))
            {
                uint lastErr = CHCNetSDK.NET_DVR_GetLastError();
                LogHelper.Default.Debug(string.Format("设备{0}预览抓图失败,错误代码[{1}]", userId, lastErr));
                return(Math.Abs((int)lastErr) * (-1));
            }

            return(0);
        }
Пример #5
0
        /// <summary>
        /// 设备登陆
        /// </summary>
        /// <param name="devIp"></param>
        /// <param name="devPort"></param>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        private DevLoginModel DeviceLogin(string devIp, int devPort, string userName, string password)
        {
            string loginUserKey = GetDeviceLoginUserDictKey(devIp, devPort, userName, password);

            //设备已经登陆,择直接返回登陆id,并增加1此登陆的订阅数
            if (_loginedDeviceDict.ContainsKey(loginUserKey))
            {
                _loginedDeviceDict[loginUserKey].SubscriberCount++;
                return(_loginedDeviceDict[loginUserKey]);
            }

            CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();

            //登录设备 Login the device
            int loginId = CHCNetSDK.NET_DVR_Login_V30(devIp, devPort, userName, password, ref DeviceInfo);

            if (loginId < 0)
            {
                uint lastErr = CHCNetSDK.NET_DVR_GetLastError();
                LogHelper.Default.Debug(string.Format("设备{0}-{1}登陆失败,错误代码[{2}]", devIp, devPort, lastErr));
                return(null);
            }

            //设置报警回调函数
            if (_msgCallback_V31 == null)
            {
                _msgCallback_V31 = new CHCNetSDK.MSGCallBack_V31(MsgCallback_V31);
            }

            RuntimeTypeHandle handle = GetType().TypeHandle;
            IntPtr            ptr    = handle.Value;

            if (!CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(_msgCallback_V31, ptr))
            {
                uint lastErr = CHCNetSDK.NET_DVR_GetLastError();
                LogHelper.Default.Debug(string.Format("设备{0}-{1}设置报警回调失败,错误代码[{2}]", devIp, devPort, lastErr));
            }

            CHCNetSDK.NET_DVR_SETUPALARM_PARAM setAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM();
            setAlarmParam.byAlarmInfoType = 1;
            setAlarmParam.byLevel         = 1;
            //布防
            long setAlarmHandle = CHCNetSDK.NET_DVR_SetupAlarmChan(loginId);

            DevLoginModel devLoginModel = new DevLoginModel();

            devLoginModel.Key             = loginUserKey;
            devLoginModel.LoginId         = loginId;
            devLoginModel.SubscriberCount = 1;

            _loginedDeviceDict.TryAdd(loginUserKey, devLoginModel);
            return(devLoginModel);
        }
Пример #6
0
        public int StartReplayByTime(IntPtr screenHandle, string devIp, int devPort, string userName, string password, int channelNumber, DateTime beginTime, DateTime endTime)
        {
            int userId = -1;

            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            if (userId < 0)
            {
                return(-1);
            }

            CHCNetSDK.NET_DVR_VOD_PARA struVodPara = new CHCNetSDK.NET_DVR_VOD_PARA();
            struVodPara.dwSize = (uint)Marshal.SizeOf(struVodPara);
            struVodPara.struIDInfo.dwChannel = (uint)channelNumber; //通道号 Channel number
            struVodPara.hWnd = screenHandle;                        //回放窗口句柄

            //设置回放的开始时间 Set the starting time to search video files
            struVodPara.struBeginTime = beginTime.ToHCDeviceTime();

            //设置回放的结束时间 Set the stopping time to search video files
            struVodPara.struEndTime = endTime.ToHCDeviceTime();

            //按时间回放 Playback by time
            int playHandle = CHCNetSDK.NET_DVR_PlayBackByTime_V40(userId, ref struVodPara);

            if (playHandle < 0)
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                return(Math.Abs((int)iLastErr) * (-1));
            }

            uint iOutValue = 0;

            if (!CHCNetSDK.NET_DVR_PlayBackControl_V40(playHandle, CHCNetSDK.NET_DVR_PLAYSTART, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue))
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                return(Math.Abs((int)iLastErr) * (-1));
            }

            return(playHandle);
        }
Пример #7
0
        public CHCNetSDK.NET_DVR_GIS_INFO GetGISInfo(string devIp, int devPort, string userName, string password)
        {
            int           userId        = -1;
            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            CHCNetSDK.NET_DVR_GIS_INFO gis_info_tmp = new CHCNetSDK.NET_DVR_GIS_INFO();
            int    nSize      = Marshal.SizeOf(gis_info_tmp);
            IntPtr ptrGisInfo = Marshal.AllocHGlobal(nSize);

            Marshal.StructureToPtr(gis_info_tmp, ptrGisInfo, false);

            int    channel    = 1;
            int    nCondSize  = Marshal.SizeOf(channel);
            IntPtr ptrCondCfg = Marshal.AllocHGlobal(nCondSize);

            Marshal.StructureToPtr(channel, ptrCondCfg, false);

            CHCNetSDK.NET_DVR_STD_CONFIG std_config = new CHCNetSDK.NET_DVR_STD_CONFIG();
            std_config.lpStatusBuffer = IntPtr.Zero;
            std_config.dwStatusSize   = 0;
            std_config.lpOutBuffer    = ptrGisInfo;
            std_config.dwOutSize      = (uint)Marshal.SizeOf(gis_info_tmp);
            std_config.byDataType     = 0;
            std_config.lpCondBuffer   = ptrCondCfg;
            std_config.dwCondSize     = (uint)Marshal.SizeOf(channel);

            bool ret = CHCNetSDK.NET_DVR_GetSTDConfig(userId, CHCNetSDK.NET_DVR_GET_GISINFO, ref std_config);

            if (ret)
            {
                gis_info_tmp = (CHCNetSDK.NET_DVR_GIS_INFO)Marshal.PtrToStructure(ptrGisInfo, typeof(CHCNetSDK.NET_DVR_GIS_INFO));
            }

            Marshal.FreeHGlobal(ptrGisInfo);
            Marshal.FreeHGlobal(ptrCondCfg);

            return(gis_info_tmp);
        }
Пример #8
0
        /// <summary>
        /// 开始预览
        /// </summary>
        /// <param name="screenHandle"></param>
        /// <param name="devIp"></param>
        /// <param name="devPort"></param>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <param name="channel"></param>
        /// <param name="stremType"></param>
        /// <returns></returns>
        public int StartPreview(IntPtr screenHandle, string devIp, int devPort, string userName, string password, int channel, uint stremType)
        {
            int userId = -1;

            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            if (userId < 0)
            {
                return(-1);
            }

            CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
            lpPreviewInfo.hPlayWnd        = screenHandle; //预览窗口
            lpPreviewInfo.lChannel        = channel;      //预te览的设备通道
            lpPreviewInfo.dwStreamType    = stremType;    //码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
            lpPreviewInfo.dwLinkMode      = 0;            //连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
            lpPreviewInfo.bBlocked        = true;         //0- 非阻塞取流,1- 阻塞取流
            lpPreviewInfo.dwDisplayBufNum = 1;            //播放库播放缓冲区最大缓冲帧数
            lpPreviewInfo.byProtoType     = 0;
            lpPreviewInfo.byPreviewMode   = 0;

            IntPtr pUser      = new IntPtr();
            int    realPlayId = CHCNetSDK.NET_DVR_RealPlay_V40(userId, ref lpPreviewInfo, _HCRealDataCallback, pUser);

            if (realPlayId < 0)
            {
                uint lastErr = CHCNetSDK.NET_DVR_GetLastError();
                LogHelper.Default.Debug(string.Format("设备{0}-{1}-{2}实时预览失败,错误代码[{3}]", devIp, devPort, channel, lastErr));
                return(Math.Abs((int)lastErr) * (-1));
            }

            return(realPlayId);
        }
Пример #9
0
        /// <summary>
        /// 注销登陆
        /// </summary>
        /// <param name="userId"></param>
        /// <returns>成功返回0,失败返回错误码</returns>
        private uint DeviceLogout(int userId)
        {
            KeyValuePair <string, DevLoginModel> loginModelKV = _loginedDeviceDict.FirstOrDefault(p => p.Value.LoginId == userId);

            if (loginModelKV.Value != null)
            {
                loginModelKV.Value.SubscriberCount--;
                if (loginModelKV.Value.SubscriberCount <= 0)
                {
                    DevLoginModel removeModel = null;
                    _loginedDeviceDict.TryRemove(loginModelKV.Key, out removeModel);
                }
            }

            if (!CHCNetSDK.NET_DVR_Logout(userId))
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();

                LogHelper.Default.Debug(string.Format("设备{0}注销失败,错误代码[{1}]", userId, iLastErr));
                return(iLastErr);
            }

            return(0);
        }
Пример #10
0
        public List <SMVideoRecordFile> SearchRecordFile(string devIp, int devPort, string userName, string password, int channel, DateTime beginTime, DateTime endTime)
        {
            int userId = -1;

            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            if (userId < 0)
            {
                return(null);
            }

            CHCNetSDK.NET_DVR_FILECOND_V40 struFileCond_V40 = new CHCNetSDK.NET_DVR_FILECOND_V40();

            struFileCond_V40.lChannel   = channel; //通道号 Channel number
            struFileCond_V40.dwFileType = 0xff;    //0xff-全部,0-定时录像,1-移动侦测,2-报警触发,...
            struFileCond_V40.dwIsLocked = 0xff;    //0-未锁定文件,1-锁定文件,0xff表示所有文件(包括锁定和未锁定)

            //设置录像查找的开始时间 Set the starting time to search video files
            struFileCond_V40.struStartTime = beginTime.ToHCDeviceTime();

            //设置录像查找的结束时间 Set the stopping time to search video files
            struFileCond_V40.struStopTime = endTime.ToHCDeviceTime();

            //开始录像文件查找 Start to search video files
            int m_lFindHandle = CHCNetSDK.NET_DVR_FindFile_V40(userId, ref struFileCond_V40);

            if (m_lFindHandle < 0)
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                return(null);
            }
            else
            {
                CHCNetSDK.NET_DVR_FINDDATA_V30 struFileData        = new CHCNetSDK.NET_DVR_FINDDATA_V30();
                List <SMVideoRecordFile>       videoRecordFileList = new List <SMVideoRecordFile>();
                while (true)
                {
                    //逐个获取查找到的文件信息 Get file information one by one.
                    int result = CHCNetSDK.NET_DVR_FindNextFile_V30(m_lFindHandle, ref struFileData);

                    if (result == CHCNetSDK.NET_DVR_ISFINDING)  //正在查找请等待 Searching, please wait
                    {
                        continue;
                    }
                    else if (result == CHCNetSDK.NET_DVR_FILE_SUCCESS) //获取文件信息成功 Get the file information successfully
                    {
                        SMVideoRecordFile videoRecord = new SMVideoRecordFile();
                        videoRecord.FileName  = struFileData.sFileName;
                        videoRecord.FileSize  = (int)struFileData.dwFileSize;
                        videoRecord.BeginTime = struFileData.struStartTime.ToDateTime();
                        videoRecord.EndTime   = struFileData.struStopTime.ToDateTime();
                        videoRecordFileList.Add(videoRecord);
                    }
                    else if (result == CHCNetSDK.NET_DVR_FILE_NOFIND || result == CHCNetSDK.NET_DVR_NOMOREFILE)
                    {
                        //未查找到文件或者查找结束,退出
                        break;
                    }
                    else
                    {
                        break;
                    }
                }
                return(videoRecordFileList);
            }
        }
Пример #11
0
        public List <DateTime> SearchRecordDate(string devIp, int devPort, string userName, string password, int channel, DateTime beginTime, DateTime endTime)
        {
            int userId = -1;

            DevLoginModel devLoginModel = DeviceLogin(devIp, devPort, userName, password);

            if (devLoginModel != null)
            {
                userId = devLoginModel.LoginId;
            }

            List <DateTime> dateList = new List <DateTime>();

            if (userId < 0)
            {
                return(dateList);
            }

            int queryDayCount = (int)(endTime.Date - beginTime.Date).TotalDays + 1;

            for (int i = 0; i < queryDayCount; i++)
            {
                CHCNetSDK.NET_DVR_FILECOND_V40 struFileCond_V40 = new CHCNetSDK.NET_DVR_FILECOND_V40();
                struFileCond_V40.lChannel   = channel; //通道号 Channel number
                struFileCond_V40.dwFileType = 0xff;    //0xff-全部,0-定时录像,1-移动侦测,2-报警触发,...
                struFileCond_V40.dwIsLocked = 0xff;    //0-未锁定文件,1-锁定文件,0xff表示所有文件(包括锁定和未锁定)

                struFileCond_V40.struStartTime = beginTime.Date.AddDays(i).ToHCDeviceTime();
                struFileCond_V40.struStopTime  = beginTime.Date.AddDays(i + 1).AddSeconds(-1).ToHCDeviceTime();

                int m_lFindHandle = CHCNetSDK.NET_DVR_FindFile_V40(userId, ref struFileCond_V40);
                if (m_lFindHandle < 0)
                {
                    uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                    continue;
                }
                else
                {
                    CHCNetSDK.NET_DVR_FINDDATA_V30 struFileData = new CHCNetSDK.NET_DVR_FINDDATA_V30();
                    while (true)
                    {
                        //逐个获取查找到的文件信息 Get file information one by one.
                        int result = CHCNetSDK.NET_DVR_FindNextFile_V30(m_lFindHandle, ref struFileData);
                        if (result == CHCNetSDK.NET_DVR_ISFINDING)  //正在查找请等待 Searching, please wait
                        {
                            continue;
                        }
                        else if (result == CHCNetSDK.NET_DVR_FILE_SUCCESS) //获取文件信息成功 Get the file information successfully
                        {
                            dateList.Add(beginTime.Date.AddDays(i));
                            break;
                        }
                        else if (result == CHCNetSDK.NET_DVR_FILE_NOFIND || result == CHCNetSDK.NET_DVR_NOMOREFILE)
                        {
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }

            return(dateList);
        }