/// <summary> /// 初始化rtp模块 /// </summary> public void ESDK_RTP_Init() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: RtpAdapter.ESDK_RTP_Init()."); try { int iRet = 0; if (!isInited) { iRet = SdkRtpInterface.ESDK_RTP_Init(); logEx.Trace("Enter: RtpAdapter.ESDK_RTP_Init(). This is first init!"); } if (iRet != 0) { logEx.Error("RtpAdapter.ESDK_RTP_Init ,error:{0}", iRet); isInited = false; } else { logEx.Trace("Enter: RtpAdapter.ESDK_RTP_Init().Success"); isInited = true; } logEx.Trace("Enter: RtpAdapter.ESDK_RTP_Init(). inited is {0}!", isInited); } catch (System.Exception ex) { logEx.Error("RtpAdapter.ESDK_RTP_Init ,Exception:{0}", ex.ToString()); isInited = false; } }
/// <summary> /// 分配监控通道 /// </summary> public SmcErr AssignMonitorChannel(List<ChannelInfo> ChannelInfoList) { SmcErr err = new CgwError(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); err = CheckSession(); if (err.IsSuccess()) { if (ChannelInfoList != null) { err = MonitorChannelBll.Instance().AssignMonitorChannel(ChannelInfoList); } else { err.SetErrorNo(CgwError.ERR_CGW_BUSINESS_CHANNELLIST_NULL); } } if (err.IsSuccess()) { logEx.Trace("AssignMonitorChannel Successful"); } else { logEx.Error("AssignMonitorChannel failed,ErrNo :{0}", err.ErrNo); } return err; }
/// <summary> /// 停止预览 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <returns>成功返回0,失败返回错误码</returns> public SmcErr StopReceiveVideo(string cameraNo) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.StopReceiveVideo({0}).", cameraNo); SmcErr err = new CgwError(); //需要停止的预览句柄 int needToStopHandel = CgwConst.START_RECEIVE_VIDEO_DATA_FAILED; if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { if (this.cameraVideoHandeDic.ContainsKey(cameraNo)) { needToStopHandel = this.cameraVideoHandeDic[cameraNo]; this.videoHandleCameraDic.Remove(needToStopHandel); this.cameraVideoHandeDic.Remove(cameraNo); } else { logEx.Warn("Stop Receive camera video data failed. Don't need to end the preview.Camera No:{0}.", cameraNo); //如果预览句柄不存在,不需要处理,直接返回 return(err); } } catch (Exception ex) { err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED); logEx.Error("Stop Receive camera video data failed.Execption message:{0}", ex.Message); return(err); } finally { this.handelOperateLock.ExitWriteLock(); } } //调用sdk的停止方法,放在handelOperateLock外面,防止长时间占用锁 if (needToStopHandel != CgwConst.START_RECEIVE_VIDEO_DATA_FAILED) { int result = this.ivsSdkClient.StopRealPlay(needToStopHandel); //如果不为0,表示预览失败 if (result != CgwConst.IVS_SDK_SUCCESS_TAG) { err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED); logEx.Error("Stop Receive camera video data failed.Ivs sdk error code:{0}", result); return(err); } logEx.Info("Stop Receive camera video data success.Camera No:{0},Handle:{1}.", cameraNo, needToStopHandel); } return(err); }
/// <summary> /// 获取系统设备列表 /// </summary> /// <param name="serverSignalGateway">要查询的域编码</param> /// <param name="deviceID">要查询的根设备编码</param> public void GetDeviceList(string serverSignalGateway, string deviceID) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: SipStackAdapter.GetDeviceList deviceID = {0}.", deviceID); try { //设备总数清空 if (deviceItemOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { deviceNum = 0; deviceList.Clear(); } } finally { deviceItemOperateLock.ExitWriteLock(); } try { //设备目录查询消息体 string xmlstr = "<?xml version='1.0'?>" + "<Query><CmdType>Catalog</CmdType><SN>" + iCateLogSN + "</SN><DeviceID>" + deviceID + "</DeviceID></Query>"; iCateLogSN++; EM_SIP_RESULT iRet = SipSDKInterface.SIP_SDK_MESSAGE(serverSignalGateway, xmlstr); if (iRet != EM_SIP_RESULT.RET_SUCCESS) { logEx.Error("SipStackAdapter.GetDeviceList Error = {0}.", Enum.GetName(typeof(EM_SIP_RESULT), iRet)); isRefreshSucess = false; } logEx.Trace("Leave: SipStackAdapter.GetDeviceList deviceID = {0}.", deviceID); } catch (System.Exception ex) { logEx.Error("SipStackAdapter.GetDeviceList Error = {0}.", ex.ToString()); isRefreshSucess = false; } }
/// <summary> /// 获取摄像头列表及分组信息 /// </summary> /// <param name="isRealTime">是否实时获取,融合网关有个缓存,间隔一段时间获取,默认是从融合网关获取列表,如果该值为true,则实时获取</param> /// <param name="cameraList">摄像头列表</param> /// <param name="groupList">组信息</param> /// <param name="nodeRelationList">分组关系</param> /// <returns></returns> public SmcErr GetAllCameras(out List <Camera> cameraList, out List <CameraGroup> groupList, out List <NodeRelation> nodeRelationList) { monitorManageServiceGetCameraList.Stop(); isGetDevicesFinish = false; NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.GetAllCameras()."); SmcErr err = new CgwError(); cameraList = new List <Camera>(); groupList = new List <CameraGroup>(); nodeRelationList = new List <NodeRelation>(); if (this.cameraOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { #region 深度克隆数据 foreach (Camera ivsCamera in this.cameraList) { //从缓存获取 Camera camera = new Camera(ivsCamera.No, ivsCamera.Name); camera.Status = ivsCamera.Status; cameraList.Add(camera); } foreach (CameraGroup cameraGroup in this.groupList) { CameraGroup cameraGroupTemp = new CameraGroup(cameraGroup.No, cameraGroup.Name); groupList.Add(cameraGroupTemp); } foreach (NodeRelation nodeRelation in this.nodeRelationList) { NodeRelation nodeRelationTemp = new NodeRelation(nodeRelation.No, nodeRelation.Path, nodeRelation.Type); nodeRelationList.Add(nodeRelationTemp); } #endregion } catch (Exception e) { err.SetErrorNo(CgwError.GET_ALL_CAMERAS_FAILED); logEx.Error("Get all cameras failed.Execption message:{0}", e.Message); return(err); } finally { this.cameraOperateLock.ExitReadLock(); } } monitorManageServiceGetCameraList.Start(); logEx.Info("Get all cameras success."); return(err); }
/// <summary> /// 查询设备列表结束事件 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void OnReceivedAllDevice(object sender, EventArgs args) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: T28181VideoMonitor.OnReceivedAllDevice()."); //将实时获取的值放到缓存 try { //拷贝devicelist到cameralist GetCameraList(sipStack.DeviceList); } catch (Exception ex) { logEx.Error("OnReceivedAllDevice failed. {0}", ex.Message); } finally { //查询结束 getDeviceEndFlg = true; } logEx.Trace("Leave: T28181VideoMonitor.OnReceivedAllDevice()."); }
/// <summary> /// 清除缓存数据 /// </summary> private void ClearCamera() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.ClearCamera()."); if (this.cameraOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { this.tiandyCameraDictionary = new Dictionary <string, TiandyCamera>(); this.hostDictionary = new Dictionary <string, Host>(); this.mediaServerDictionary = new Dictionary <string, MediaServer>(); this.groupDic = new Dictionary <string, CameraGroup>(); this.nodeRelationList = new List <NodeRelation>(); } finally { this.cameraOperateLock.ExitWriteLock(); } } logEx.Trace("Clear Camera which in the cache success."); }
/// <summary> /// 刷新监控摄像头列表 /// </summary> /// <returns></returns> public SmcErr RefreshMonitorCamera() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: VideoMonitorManage.RefreshMonitorCamera."); SmcErr err = new SmcErr(); //copy 一份,防止长时间占用锁 Dictionary <string, IVideoMonitor> monitorsDictionaryTemp = null; if (this.monitorsOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { monitorsDictionaryTemp = new Dictionary <string, IVideoMonitor>(monitorsDictionary); } catch (Exception e) { logEx.Error("RefreshMonitorCamera failed.Execption message:{0}", e.Message); } finally { this.monitorsOperateLock.ExitReadLock(); } } if (monitorsDictionaryTemp == null) { //记录日志,获取*监控平台的摄像头列表失败 logEx.Error("RefreshMonitorCamera from monitor failed.No any monitor."); err.SetErrorNo(CgwError.ERR_REFRESH_MONITOR_CAMERA_FAIL); return(err); } //循环已加载的所有的监控平台,将所有摄像头和分组组成一个list返回 foreach (KeyValuePair <string, IVideoMonitor> monitor in monitorsDictionaryTemp) { IVideoMonitor videoMonitor = monitor.Value; err = videoMonitor.RefreshMonitorCamera(); if (err.IsSuccess()) { logEx.Info("RefreshMonitorCamera success."); } else { logEx.Error("RefreshMonitorCamera failed."); err.SetErrorNo(CgwError.ERR_REFRESH_MONITOR_CAMERA_FAIL); break; } } return(err); }
/// <summary> /// 初始化天地伟业监控平台 /// </summary> /// <param name="monitorConfigElement">监控平台配置节点</param> /// <returns></returns> public SmcErr Load(XmlElement monitorConfigElement) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.Load()."); SmcErr err = new CgwError(); string userLevel = ""; //解析xml节点,获取所需参数 try { #region Tiandy视频监控平台(Easy7)连接信息 this.monitorId = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.ID_TAG); userLevel = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PTZCONTROLLEVEL_TAG); string httpUser = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PLATFORM_USER_TAG); string httpPassword = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PLATFORM_PASSWORD_TAG); string httpUrl = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PLATFORM_URL_TAG); string mediaServerId = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.MEDIASERVER_SERVERID_TAG); #endregion this.httpClient = new TiandyHttpClient(httpUrl, httpUser, httpPassword); //使用线程轮询加载监控平台 Thread loaderThread = new Thread(LoaderThread); loaderThread.Start(mediaServerId); } catch (Exception e) { err.SetErrorNo(CgwError.MONITOR_CONFIG_FILE_INVALID); logEx.Error("Load Tiandy monitor failed.Execption message:{0}.", e.Message); return(err); } this.sdkClient = new TiandySdkClient(); //如果控制级别配置错误,只记录错误日志,不向外报错 try { this.sdkClient.PtzControlLevel = int.Parse(userLevel); } catch (Exception e) { logEx.Error("Ptz Control Level is invalid.Execption message:{0}.", e.Message); this.sdkClient.PtzControlLevel = CgwConst.PTZ_CONTROL_LEVEL; } logEx.Info("Load video monitor success.Monitor id:{0}.", this.monitorId); return(err); }
/// <summary> /// 停止云台控制,摄像头控制 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <param name="ptzCommand">命令类型</param> /// <returns></returns> public SmcErr StopControlPtz(string cameraNo, PtzCommandType ptzCommand) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.StopControlPtz({0}).", cameraNo); SmcErr err = new CgwError(); logEx.Trace("Call ivsSdkClient.StopPtzControl({0}).", cameraNo); int result = this.ivsSdkClient.StopPtzControl(cameraNo); //如果为0,表示成功 if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("Stop control ptz success.Camera No:{0}.", cameraNo); } else { //直接将IVS的错误码返回 err.SetErrorNo(CgwError.STOP_CONTROL_PTZ_FAILED); logEx.Error("Stop control ptz failed.Camera No:{0}.Ivs sdk error code:{1}.", cameraNo, result); return(err); } return(err); }
/// <summary> /// 开始云台控制,摄像头控制 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <param name="ptzCommand">命令类型</param> /// <param name="param">命令参数(速度、倍数)</param> /// <returns></returns> public SmcErr StartControlPtz(string cameraNo, PtzCommandType ptzCommand, int param) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.StartControlPtz({0},{1},{2}).", cameraNo, ptzCommand, param); SmcErr err = new CgwError(); //将ptz命令转换成IVS的命令 string name = Enum.GetName(typeof(PtzCommandType), ptzCommand); if (Enum.IsDefined(typeof(IvsPtzCommandType), name)) { IvsPtzCommandType ivsPtzCommandType = (IvsPtzCommandType)Enum.Parse(typeof(IvsPtzCommandType), name); logEx.Trace("Call ivsSdkClient.StartPtzControl({0},{1},{2}).", cameraNo, (int)ivsPtzCommandType, param); int result = this.ivsSdkClient.StartPtzControl(cameraNo, (int)ivsPtzCommandType, param.ToString()); //如果为0,表示成功 if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("Start control ptz success.Camera No:{0}.", cameraNo); } else { err.SetErrorNo(CgwError.START_CONTROL_PTZ_FAILED); logEx.Error("Start control ptz failed.Camera No:{0}.Ivs sdk error code:{1}.", cameraNo, result); return(err); } } else { err.SetErrorNo(CgwError.START_CONTROL_PTZ_FAILED); logEx.Error("The ivs monitor is not support the command.ptzCommand:{0}.", ptzCommand); return(err); } return(err); }
/// <summary> /// 停止接收rtp数据包 /// </summary> /// <param name="cameraCode"></param> public EM_SIP_RESULT StopRecvStream(UInt32 channel) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: SipStackAdapter.StopRecvStream channel = {0}.", channel); try { //停止实况 int responseID = 0; foreach (KeyValuePair <UInt32, int> kvp in channelResponseIDDic) { if (kvp.Key == channel) { responseID = kvp.Value; channelResponseIDDic.Remove(kvp.Key); break; } } EM_SIP_RESULT iRet = SIP_SDK_BYE(responseID); if (iRet != EM_SIP_RESULT.RET_SUCCESS) { logEx.Error("StopRecvStream failed channel={0}", channel); } //释放用户数据内存 foreach (KeyValuePair <UInt32, IntPtr> kvp in channelInPtrDic) { if (kvp.Key == channel) { Marshal.FreeHGlobal(kvp.Value); channelInPtrDic.Remove(kvp.Key); break; } } //释放NETSOURCE通道资源 IVS_NETSOURCE_RESULT iNet = IVS_NETSOURCE_FreeChannel(channel); if (iNet != IVS_NETSOURCE_RESULT.SUCCESS) { logEx.Error("IVS_NETSOURCE_FreeChannel failed channel={0}", channel); return(EM_SIP_RESULT.RET_FAILURE); } return(iRet); } catch (System.Exception ex) { logEx.Error("StopRecvStream failed.Exception message:{0}", ex.Message); return(EM_SIP_RESULT.RET_FAILURE); } }
/// <summary> /// 获取自定义设备列表 /// </summary> /// <returns>成功返回对象列表,失败返回null</returns> public List <Resource> GetCustomTree() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyHttpClient.GetCustomTree()."); //设置访问天地伟业登陆接口的uri string requestUrl = string.Format( "{0}/GetCustomTree.jsp?CurrentUserId={1}&UserId={2}&Password={3}", this.serverUrl, this.user, this.user, pwd); //日志不能记密码,单独处理 string logString = string.Format( "{0}/GetCustomTree.jsp?CurrentUserId={1}&UserId={2}&Password=******", this.serverUrl, this.user, this.user); logEx.Trace("Call function TiandyHttpClient.GetResourceTree({0}).", logString); List <Resource> resources = GetResourceTree(requestUrl); return(resources); }
/// <summary> /// 软终端初始化 /// </summary> /// <param name="addr"></param> /// <returns></returns> public SmcErr Init(InitSotParam param) { SmcErr err = new CgwError(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); try { SoftTerminalCallback handler = new SoftTerminalCallback(); handler.NlogHandler = new NLogCallback(this.WriteLog); handler.IFrameHandler = this.makeIFrameCallback; handler.errReportHandler = this.errReportCallback; bool isSuccess = this.softTerminalAdapter.RegistSotCallback(handler); if (!isSuccess) { logEx.Trace("Init Regist callback failed."); err.SetErrorNo(CgwError.ERR_CGW_CHANNEL_SOT_REGIST_CALLBACK_FAIL); return(err); } err = this.softTerminalAdapter.Init(param); if (!err.IsSuccess()) { logEx.Trace("Init failed."); return(err); } } catch (System.Exception ex) { logEx.Error(ex, "Init Exception."); } logEx.Trace("Init successfully."); return(err); }
/// <summary> /// 获取自定义设备列表 /// </summary> /// <returns>成功返回对象列表,失败返回null</returns> public List<Resource> GetCustomTree() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyHttpClient.GetCustomTree()."); //设置访问天地伟业登陆接口的uri string requestUrl = string.Format( "{0}/GetCustomTree.jsp?CurrentUserId={1}&UserId={2}&Password={3}", this.serverUrl, this.user, this.user, pwd); //日志不能记密码,单独处理 string logString = string.Format( "{0}/GetCustomTree.jsp?CurrentUserId={1}&UserId={2}&Password=******", this.serverUrl, this.user, this.user); logEx.Trace("Call function TiandyHttpClient.GetResourceTree({0}).", logString); List<Resource> resources = GetResourceTree(requestUrl); return resources; }
/// <summary> /// 加密 /// </summary> /// <param name="userPassword">用户密码.明文</param> /// <param name="nodeEntropy">增加加密效果,节点名称</param> /// <returns></returns> private static string Encrypt(string needEncryptTerm, string nodeEntropy) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); try { byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(needEncryptTerm); byte[] encryptArray = ProtectedData.Protect(toEncryptArray, Encoding.Default.GetBytes(nodeEntropy), DataProtectionScope.LocalMachine); return(CgwConst.ENCRYPTED_PREFIX + Convert.ToBase64String(encryptArray)); } catch (Exception ex) { logEx.Trace("Encrypt failed Exception:{0},needEncryptTerm:{1}", ex, needEncryptTerm); return(null); } }
/// <summary> /// 获取软终端被叫sip端口号 /// </summary> /// <param name="sipPort"></param> /// <returns></returns> public SmcErr GetSipPort(out uint sipPort) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: CgwService.GetSipPort"); SmcErr err = new CgwError(); sipPort = (uint)ConfigSettings.CgwChanelCallPort; logEx.Debug("sipPort = {0}", sipPort); if (0 == sipPort) { err.SetErrorNo(CgwError.ERR_CGW_CONFIGURE_FORMAT); } return(err); }
/// <summary> /// 保持连接 /// </summary>] public SmcErr KeepAliver(string sessionID) { SmcErr err = new CgwError(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); err = CheckSession(sessionID); if (err.IsSuccess()) { logEx.Trace("KeepAlive Successful"); } else { logEx.Error("KeepAlive failed,ErrNo :{0}", err.ErrNo); } return(err); }
/// <summary> /// 初始化融合网管服务 /// </summary> public void InitService() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); //初始化监控平台 SmcErr err = new SmcErr(); err = MonitorChannelBll.Instance().LoadMonitor(); if (err.IsSuccess()) { logEx.Trace("Load VideoMonitor Successful !"); } else { logEx.Fatal("Load VideoMonitor Failed, ErrNo : {0}!", err.ErrNo); } }
/// <summary> /// 获取摄像头列表及分组信息定时器 /// 1、获取系统中所有的域 /// 2、循环所有的域,查询域下面的分组,递归处理,获取节点关系 /// 3、查询设备列表 /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void GetAllCamerasTimer(object sender, System.Timers.ElapsedEventArgs e) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.GetAllCamerasTimer()."); if (refreshMonitorCameraOperateLock.TryEnterWriteLock(CgwConst.EFRESH_MONITOR_CAMERA_WAIT_TIME)) { try { GetAllCamerasMethod(); } finally { refreshMonitorCameraOperateLock.ExitWriteLock(); } } }
/// <summary> /// 停止预览摄像头视频,并清理命名管道 /// </summary> /// <param name="cameraNo"></param> /// <returns></returns> public Cgw.SmcError.SmcErr StopReceiveVideoByPipe(string cameraNo) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: CgwMonitorManageAdapter.StopReceiveVideoByPipe"); Cgw.SmcError.SmcErr err = new Cgw.SmcError.SmcErr(); try { //if (serviceControl.MonitorServiceRun() && client.State == CommunicationState.Opened) if (serviceControl.MonitorServiceRun()) { client = new MonitorManageServiceClient(); CgwMonitorManageServiceReference.SmcErr serviceErr = client.StopReceiveVideoByPipe(cameraNo); client.Close(); if (serviceErr.ErrNo != Cgw.SmcError.CgwError.ERR_MONITOR_MANAGE_SERVICE_SUCCESS) { logEx.Error("CgwMonitorManageAdapter.StopReceiveVideoByPipe failed. ErrNo = {0} ", serviceErr.ErrNo); err = SetCgwErrNo(serviceErr); } else { VideoPipe videoPipe = VideoPipeManage.Instance().DeleteVideoPipe(cameraNo); if (videoPipe != null) { videoPipe.Stop(); logEx.Info("CgwMonitorManageAdapter.StopReceiveVideoByPipe Success. cameraNo = {0} ", cameraNo); } else { logEx.Error("CgwMonitorManageAdapter.StopReceiveVideoByPipe failed. ErrNo = {0} ", serviceErr.ErrNo); } } } else { err.SetErrorNo(Cgw.SmcError.CgwError.ERR_MONITOR_MANAGE_SERVICE_RESTARTING); } } catch (System.Exception ex) { err.SetErrorNo(Cgw.SmcError.CgwError.ERR_MONITOR_MANAGE_SERVICE_RESTARTING); logEx.Error("CgwMonitorManageServiceReference.StopReceiveVideoByPipe failed. Exception is {0} ", ex.ToString()); logEx.Error("CameraNo:" + cameraNo); } return(err); }
/// <summary> /// 解密 /// </summary> /// <param name="userPassword">用户密码.密文</param> /// <param name="nodeEntropy">增加加密效果,节点名称</param> /// <returns></returns> private static string Decrypt(string needDecryptTerm, string nodeEntropy) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); try { string term = needDecryptTerm.Remove(0, CgwConst.ENCRYPTED_PREFIX.Length); byte[] toDecryptArray = Convert.FromBase64String(term); byte[] DecryptArray = ProtectedData.Unprotect(toDecryptArray, Encoding.Default.GetBytes(nodeEntropy), DataProtectionScope.LocalMachine); return(UTF8Encoding.UTF8.GetString(DecryptArray)); } catch (Exception ex) { logEx.Trace("Decrypt failed Exception:{0},needDecryptTerm:{1}", ex, needDecryptTerm); return(null); } }
/// <summary> /// 初始化天地伟业SDK客户端 /// </summary> /// <param name="localId">客户端本地ID,必须唯一</param> /// <returns></returns> public bool Load(string localId) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandySdkClient.Load({0}).", localId); try { //1、设置本地ID bool result = client_sdk_set_local_id(localId + DateTime.Now.ToString()); if (!result) { logEx.Error("Load video monitor failed when to call the function client_sdk_set_local_id().Monitor id:{0}.", localId); //重复加载的时候,client_sdk_set_local_id会返回失败,但不影响sdk使用,不返回错误 //return false; } else { logEx.Info("Call Tiandy sdk function client_sdk_set_local_id success.Monitor id:{0}.", localId); } //2、设置解码库,如果不需要解码,则不用加载 //client_sdk_set_local_id //bool result1 = client_player_set_lib(1, "win32_player_hik.dll"); //bool result2 = client_player_set_lib(2, "win32_player_dh.dll"); //bool result3 = client_player_set_lib(3, "win32_player_td.dll"); //3、初始化SDK result = client_sdk_startup(); if (!result) { logEx.Error("Call Tiandy sdk function client_sdk_startup failed.Monitor id:{0}.", localId); return(false); } else { logEx.Info("Call Tiandy sdk function client_sdk_startup success.Monitor id:{0}.", localId); //设置消息回调 //client_sdk_set_mess_callback(this.messCallBackFunc, 0); return(true); } } catch (Exception e) { logEx.Error("Load Tiandy monitor failed. Monitor id:{0},Exception message:{1}.", localId, e.Message); return(false); } }
/// <summary> /// 获取监控摄像头列表刷新状态,返回结果为0是表示刷新完毕,为1是刷新操作中。当查询刷新状态为0时,可调用获取监控摄像头列表接口,获取刷新后监控摄像头列表 /// </summary> /// <param name="refreshStatus">返回值,刷新状态</param> /// <returns></returns> public Cgw.SmcError.SmcErr GetRefreshStatus(out SmcError.SmcErr refreshStatus) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: CgwMonitorManageAdapter.GetRefreshStatus"); refreshStatus = new Cgw.SmcError.SmcErr(); refreshStatus.ErrNo = Cgw.SmcError.CgwError.ERR_DEVICE_LIST_REFRESH_STATUS_END; Cgw.SmcError.SmcErr err = new Cgw.SmcError.SmcErr(); try { //if (serviceControl.MonitorServiceRun() && client.State == CommunicationState.Opened) if (serviceControl.MonitorServiceRun()) { CgwMonitorManageServiceReference.SmcErr i_refreshStatus = new CgwMonitorManageServiceReference.SmcErr(); client = new MonitorManageServiceClient(); CgwMonitorManageServiceReference.SmcErr serviceErr = client.GetRefreshStatus(out i_refreshStatus); client.Close(); refreshStatus.ErrNo = i_refreshStatus.ErrNo; if (serviceErr.ErrNo != Cgw.SmcError.CgwError.ERR_MONITOR_MANAGE_SERVICE_SUCCESS) { logEx.Error("CgwMonitorManageAdapter.GetRefreshStatus failed. ErrNo = {0} ", serviceErr.ErrNo); err = SetCgwErrNo(serviceErr); } else { logEx.Info("CgwMonitorManageAdapter.GetRefreshStatus Success. "); } } else { err.SetErrorNo(Cgw.SmcError.CgwError.ERR_MONITOR_MANAGE_SERVICE_RESTARTING); } } catch (System.Exception ex) { err.SetErrorNo(Cgw.SmcError.CgwError.ERR_MONITOR_MANAGE_SERVICE_RESTARTING); logEx.Error("CgwMonitorManageServiceReference.GetRefreshStatus failed. Exception is {0} ", ex.ToString()); } return(err); }
/// <summary> /// 线程加载cgw /// </summary> /// <returns></returns> public SmcErr Load() { SmcErr err = new SmcErr(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); //初始化监控平台 err = MonitorChannelBll.Instance().Load(); if (err.IsSuccess()) { logEx.Trace("Load CgwService Successful !"); isLoadSuccess = true; } else { logEx.Fatal("Load CgwService Failed, ErrNo : {0}!", err.ErrNo); } return(err); }
/// <summary> /// 注销天地伟业监控平台资源 /// </summary> /// <returns></returns> public SmcErr Unload() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.Unload()."); SmcErr err = new CgwError(); //停止定时器 this.updateCameraTimer.Stop(); if (this.sdkClient.Unload()) { logEx.Info("Unload video monitor success.Monitor id:{0}.", this.monitorId); } else { err.SetErrorNo(CgwError.UNLOAD_MONITOR_FAILED); logEx.Error("Unload video monitor failed.Monitor id:{0}.", this.monitorId); } return(err); }
/// <summary> /// 释放所有实况通道,释放NETSOURCE资源 /// </summary> public IVS_NETSOURCE_RESULT IVS_NETSOURCE_UnInit() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: SipStackAdapter.IVS_NETSOURCE_UnInit."); //IVS_NETSOURCE_RESULT iRet = IVS_NETSOURCE_RESULT.FAILURE; IVS_NETSOURCE_RESULT iRet = IVS_NETSOURCE_RESULT.SUCCESS; try { foreach (KeyValuePair <UInt32, int> kvp in channelResponseIDDic) { UInt32 channel = kvp.Key; iRet = NetSourcedInterface.IVS_NETSOURCE_CloseNetStream(channel); if (iRet != IVS_NETSOURCE_RESULT.SUCCESS) { logEx.Error("SipStackAdapter.IVS_NETSOURCE_CloseNetStream channelResponseIDDic = {0}.", channel); //注销return,避免返回,不实现IVS_NETSOURCE_UnInit //return iRet; } iRet = NetSourcedInterface.IVS_NETSOURCE_FreeChannel(channel); if (iRet != IVS_NETSOURCE_RESULT.SUCCESS) { logEx.Error("SipStackAdapter.IVS_NETSOURCE_FreeChannel channelResponseIDDic = {0}.", channel); //注销return,避免返回,不实现IVS_NETSOURCE_UnInit //return iRet; } } //iRet = NetSourcedInterface.IVS_NETSOURCE_UnInit(); //if (iRet != IVS_NETSOURCE_RESULT.SUCCESS) //{ // logEx.Error("SipStackAdapter.IVS_NETSOURCE_UnInit failed."); //} NetSourcedInterface.IVS_NETSOURCE_UnInit(); logEx.Info("Leave: SipStackAdapter.IVS_NETSOURCE_UnInit."); } catch (System.Exception ex) { logEx.Error("SipStackAdapter.IVS_NETSOURCE_UnInit Error = {0}.", ex.ToString()); iRet = IVS_NETSOURCE_RESULT.FAILURE; } return(iRet); }
/// <summary> /// 关闭通道 /// </summary> /// <param name="uiChannel"></param> public void ESDK_RTP_CloseChannel(uint uiChannel) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: RtpAdapter.ESDK_RTP_CloseChannel()."); try { int iRet = SdkRtpInterface.ESDK_RTP_CloseChannel(uiChannel); if (iRet != 0) { logEx.Error("RtpAdapter.ESDK_RTP_CloseChannel ,error:{0}", iRet); } } catch (System.Exception ex) { logEx.Error("RtpAdapter.ESDK_RTP_CloseChannel ,Exception:{0}", ex.ToString()); } }
/// <summary> /// 打开rtp通道 /// </summary> /// <param name="frameDataCallBack">回调函数,返回解析完成后的码流数据</param> /// <param name="uiChannel"></param> public void ESDK_RTP_OpenChannel(FrameDataCallBack frameDataCallBack, uint uiChannel) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: RtpAdapter.ESDK_RTP_OpenChannel()."); try { int iRet = SdkRtpInterface.ESDK_RTP_OpenChannel(frameDataCallBack, uiChannel); if (iRet != 0) { logEx.Error("RtpAdapter.ESDK_RTP_OpenChannel ,error:{0}", iRet); } } catch (System.Exception ex) { logEx.Error("RtpAdapter.ESDK_RTP_OpenChannel ,Exception:{0}", ex.ToString()); } }
/// <summary> /// 设置音频数据 /// </summary> /// <param name="bIsNeedAudioFrame"></param> /// <param name="uiChannel"></param> public void ESDK_RTP_SetIsNeedAudioFrame(bool bIsNeedAudioFrame, uint uiChannel) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: RtpAdapter.ESDK_RTP_SetIsNeedAudioFrame()."); try { int iRet = SdkRtpInterface.ESDK_RTP_SetIsNeedAudioFrame(bIsNeedAudioFrame, uiChannel); if (iRet != 0) { logEx.Error("RtpAdapter.ESDK_RTP_SetIsNeedAudioFrame ,error:{0}", iRet); } } catch (System.Exception ex) { logEx.Error("RtpAdapter.ESDK_RTP_SetIsNeedAudioFrame ,Exception:{0}", ex.ToString()); } }
/// <summary> /// 连接融合网关 /// </summary> /// <param name="password">连接字符串</param> /// <returns></returns> public SmcErr Connect(string password) { SmcErr err = new CgwError(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); if (false == string.IsNullOrEmpty(password)) { //获取后台密码字符串 string s = CommonFunction.GetAppSetting("PassWord"); //进行SHA256加密 string newPassword = CommonFunction.SHA256Encrypt(s); //保存当前会话 if (newPassword == password) { //获取SessionManage中Session个数 if (SessionManage.Instance().GetSessionsCount() == 0) { Guid sessionGuid = Guid.NewGuid(); //保存至CGW的session管理中 CGWSession CgwSession = new CGWSession(sessionGuid, OperationContext.Current.SessionId); logEx.Trace("Connect Successful,Current.SessionId is : ", OperationContext.Current.SessionId); } else { err.SetErrorNo(CgwError.ERR_CGW_BUSINESS_SESSION_COUNT_MAX); logEx.Warn("Session Count is Top Of Max number !"); } } else { err.SetErrorNo(CgwError.ERR_CGW_BUSINESS_PASSWORD_INCORRECT); logEx.Error("Connect Password is Incorrect !"); } } else { err.SetErrorNo(CgwError.ERR_CGW_BUSINESS_PASSWORD_NULL); logEx.Error("Connect Password is null !"); } return(err); }
/// <summary> /// 关闭PTZ操作 /// </summary> /// <param name="Camerano">摄像头</param> /// <returns></returns> public SmcErr StopPTZ(string Camerano) { SmcErr err = new CgwError(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); err = CheckSession(); if (err.IsSuccess()) { err = MonitorChannelBll.Instance().StopPTZ(Camerano); } if (err.IsSuccess()) { logEx.Trace("StopPTZ Successful"); } else { logEx.Error("StopPTZ failed,ErrNo :{0}", err.ErrNo); } return(err); }
/// <summary> /// 线程加载cgw /// </summary> /// <returns></returns> public SmcErr Load() { SmcErr err = new SmcErr(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); //初始化监控平台 err = VideoMonitorManage.Instance().Load(); VideoMonitorManage.Instance().SetDataCallBackFunc(DataCallBackFunc); if (err.IsSuccess()) { logEx.Trace("Load CgwMonitorManage Successful !"); isLoadSuccess = true; } else { logEx.Fatal("Load CgwMonitorManage Failed, ErrNo : {0}!", err.ErrNo); } return(err); }
/// <summary> /// 开始PTZ操作 /// </summary> /// <param name="cameraNo">摄像头NO</param> /// <param name="ptzCommand">操作类型</param> /// <param name="param">命令参数</param> /// <returns></returns> public SmcErr StartControlPtz(string cameraNo, PtzCommandType ptzCommand, int param) { SmcErr err = new CgwError(); err = CheckSession(); NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); if (err.IsSuccess()) { err = MonitorChannelBll.Instance().StartControlPtz(cameraNo, ptzCommand, param); } if (err.IsSuccess()) { logEx.Trace("StartControlPtz Successful"); } else { logEx.Error("StartControlPtz failed,ErrNo :{0}", err.ErrNo); } return(err); }
/// <summary> /// 注销IVS监控平台资源 /// </summary> /// <returns></returns> public SmcErr Unload() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Info("Enter: IvsVideoMonitor.Unload()."); SmcErr err = new CgwError(); loadResult = true; //停止定时器 this.updateCameraTimer.Stop(); logEx.Trace("Call ivsSdkClient.Logout()."); int result = this.ivsSdkClient.Logout(); logEx.Trace("Call ivsSdkClient.Cleanup()."); result = this.ivsSdkClient.Cleanup(); if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("Unload video monitor success.Monitor id:{0}.", this.monitorId); } else { err.SetErrorNo(CgwError.MONITOR_UDLOAD_FAILED); logEx.Error("Unload video monitor failed.Monitor id:{0}.", this.monitorId); } return err; }
/// <summary> /// 获取摄像头列表及分组信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void GetAllCamerasTimer(object sender, System.Timers.ElapsedEventArgs e) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.GetAllCamerasTimer()."); if (refreshMonitorCameraOperateLock.TryEnterWriteLock(CgwConst.EFRESH_MONITOR_CAMERA_WAIT_TIME)) { try { GetAllCamerasMethod(); } finally { refreshMonitorCameraOperateLock.ExitWriteLock(); } } }
/// <summary> /// 清除缓存数据 /// </summary> private void ClearCamera() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.ClearCamera()."); if (this.cameraOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { this.tiandyCameraDictionary = new Dictionary<string, TiandyCamera>(); this.hostDictionary = new Dictionary<string, Host>(); this.mediaServerDictionary = new Dictionary<string, MediaServer>(); this.groupDic = new Dictionary<string, CameraGroup>(); this.nodeRelationList = new List<NodeRelation>(); } finally { this.cameraOperateLock.ExitWriteLock(); } } logEx.Trace("Clear Camera which in the cache success."); }
/// <summary> /// 停止预览 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <returns>成功返回0,失败返回错误码</returns> public SmcErr StopReceiveVideo(string cameraNo) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.StopReceiveVideo({0}).", cameraNo); SmcErr err = new CgwError(); //需要停止的预览句柄 int needToStopHandel = CgwConst.START_RECEIVE_VIDEO_DATA_FAILED; if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { if (this.cameraVideoHandeDic.ContainsKey(cameraNo)) { needToStopHandel = this.cameraVideoHandeDic[cameraNo]; this.videoHandleCameraDic.Remove(needToStopHandel); this.cameraVideoHandeDic.Remove(cameraNo); } else { //不存在,表示已经删除,不返回错误 //err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED); logEx.Warn("Stop Receive camera video data failed. Don't need to end the preview.Camera No:{0}.", cameraNo); } } finally { this.handelOperateLock.ExitWriteLock(); } } //调用sdk的停止方法,放在handelOperateLock外面,防止长时间占用锁 if (needToStopHandel != CgwConst.START_RECEIVE_VIDEO_DATA_FAILED) { this.sdkClient.StopReceiveVideo(needToStopHandel); } logEx.Info("Stop Receive camera video data success.Camera No:{0},Handle:{1}.", cameraNo, needToStopHandel); return err; }
/// <summary> /// 初始化天地伟业监控平台 /// </summary> /// <param name="monitorConfigElement">监控平台配置节点</param> /// <returns></returns> public SmcErr Load(XmlElement monitorConfigElement) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.Load()."); SmcErr err = new CgwError(); string userLevel = ""; //解析xml节点,获取所需参数 try { #region Tiandy视频监控平台(Easy7)连接信息 this.monitorId = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.ID_TAG); userLevel = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PTZCONTROLLEVEL_TAG); string httpUser = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PLATFORM_USER_TAG); string httpPassword = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PLATFORM_PASSWORD_TAG); string httpUrl = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PLATFORM_URL_TAG); string mediaServerId = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.MEDIASERVER_SERVERID_TAG); #endregion this.httpClient = new TiandyHttpClient(httpUrl, httpUser, httpPassword); //使用线程轮询加载监控平台 Thread loaderThread = new Thread(LoaderThread); loaderThread.Start(mediaServerId); } catch (Exception e) { err.SetErrorNo(CgwError.MONITOR_CONFIG_FILE_INVALID); logEx.Error("Load Tiandy monitor failed.Execption message:{0}.", e.Message); return err; } this.sdkClient = new TiandySdkClient(); //如果控制级别配置错误,只记录错误日志,不向外报错 try { this.sdkClient.PtzControlLevel = int.Parse(userLevel); } catch (Exception e) { logEx.Error("Ptz Control Level is invalid.Execption message:{0}.", e.Message); this.sdkClient.PtzControlLevel = CgwConst.PTZ_CONTROL_LEVEL; } logEx.Info("Load video monitor success.Monitor id:{0}.", this.monitorId); return err; }
/// <summary> /// 获取摄像头列表及分组信息 /// </summary> /// <param name="fromMonitorSys">如果该值为true,则实时从监控平台获取,否则从融合网关缓存获取</param> /// <param name="cameraList">摄像头列表</param> /// <param name="groupList">组信息</param> /// <param name="nodeRelationListT">分组关系</param> /// <returns></returns> public SmcErr GetAllCameras(out List<Camera> cameraList, out List<CameraGroup> groupList, out List<NodeRelation> nodeRelationListT) { monitorManageServiceGetCameraList.Stop(); isGetDevicesFinish = false; NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.GetAllCameras()."); SmcErr err = new CgwError(); cameraList = new List<Camera>(); groupList = new List<CameraGroup>(); nodeRelationListT = new List<NodeRelation>(); if (this.cameraOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { #region 深度克隆数据 foreach (KeyValuePair<string, TiandyCamera> tiandyCameraKeyValue in this.tiandyCameraDictionary) { TiandyCamera tiandyCamera = tiandyCameraKeyValue.Value; //从缓存获取 Camera camera = new Camera(tiandyCamera.No, tiandyCamera.Name); cameraList.Add(camera); } foreach (KeyValuePair<string, CameraGroup> groupDicKeyValue in this.groupDic) { CameraGroup cameraGroupTemp = new CameraGroup(groupDicKeyValue.Value.No, groupDicKeyValue.Value.Name); groupList.Add(cameraGroupTemp); } foreach (NodeRelation nodeRelation in this.nodeRelationList) { NodeRelation nodeRelationTemp = new NodeRelation(nodeRelation.No, nodeRelation.Path, nodeRelation.Type); nodeRelationListT.Add(nodeRelationTemp); } #endregion } catch (Exception e) { err.SetErrorNo(CgwError.GET_ALL_CAMERAS_FAILED); logEx.Error("Get all cameras failed.Execption message:{0}", e.Message); return err; } finally { this.cameraOperateLock.ExitReadLock(); } } monitorManageServiceGetCameraList.Start(); logEx.Info("Get all cameras success."); return err; }
/// <summary> /// 调用天地伟业http接口 /// </summary> /// <param name="requestUrl"></param> /// <returns>成功返回json字符串,失败返回null</returns> private string CallHttpInterface(string requestUrl) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyHttpClient.CallHttpInterface()."); Stream stream = null; string result = null; try { //调用http接口 WebClient webClient = new WebClient(); stream = webClient.OpenRead(requestUrl); StreamReader streamReader = new StreamReader(stream); //调用HTTP接口返回json字符串 result = streamReader.ReadToEnd(); } catch (Exception e) { result = null; logEx.Error("Call http function failed.Exception message:{0}.", e.Message); } finally { //记录日志,待日志模块合入后补充日志信息 if (stream != null) { stream.Close(); } } return result; }
/// <summary> /// 清除缓存数据 /// </summary> private void ClearCamera() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.ClearCamera()."); if (this.cameraOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { this.cameraList = new List<Camera>(); this.groupList = new List<CameraGroup>(); this.nodeRelationList = new List<NodeRelation>(); } finally { this.cameraOperateLock.ExitWriteLock(); } } logEx.Trace("Clear Camera which in the cache success."); }
/// <summary> /// 获取摄像头列表及分组信息 /// </summary> private void GetAllCamerasMethod() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.GetAllCamerasMethod()."); try { //1、获取系统中所有的域 List<IvsDomainRoute> ivsDomainRouteList; logEx.Trace("Call ivsSdkClient.GetDomainRoute()."); int result = this.ivsSdkClient.GetDomainRoute(out ivsDomainRouteList); if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("GetDomainRoute success.List count:{0}", ivsDomainRouteList.Count); } else { logEx.Error("GetDomainRoute failed.Ivs sdk error code:{0}", result); ClearCamera(); isRefreshSucess = false; return; } List<Camera> cameraListTemp = new List<Camera>(); List<CameraGroup> groupListTemp = new List<CameraGroup>(); List<NodeRelation> nodeRelationListTemp = new List<NodeRelation>(); Dictionary<string, NodeRelation> nodeRelationDicTemp = new Dictionary<string, NodeRelation>(); foreach (IvsDomainRoute route in ivsDomainRouteList) { //加上此判断条件的话,子域将不会作查目录处理,不合理,故注释掉 //if (route.ParentDomain != "") //{ // continue; //} Dictionary<string, IvsCameraGroup> ivsCameraGroupDic; logEx.Trace("Call ivsSdkClient.GetDeviceGroupList({0},{1},out groupCount, out ivsCameraGroupDic).", route.DomainCode, CgwConst.IVS_SDK_ROOTGROUP_TAG); result = this.ivsSdkClient.GetDeviceGroupList(route.DomainCode, CgwConst.IVS_SDK_ROOTGROUP_TAG, out ivsCameraGroupDic); if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("GetDeviceGroupList success.Current group count:{0}", ivsCameraGroupDic.Count); } else { logEx.Error("GetDeviceGroupList failed.Ivs sdk error code:{0}", result); ClearCamera(); isRefreshSucess = false; return; } //域也当做分组使用 string encodeDomainNo = CgwConst.IVS_SDK_ROOTGROUP_TAG + CgwConst.IVS_SDK_DOMAINCODE_SEPARATOR_TAG + route.DomainCode; CameraGroup domainGroup = new CameraGroup(encodeDomainNo, route.DomainName); groupListTemp.Add(domainGroup); List<string> pathDomainList = new List<string>(); RecursionGroupPath(route.DomainCode, ivsDomainRouteList,ref pathDomainList); NodeRelation nodeDomainRelation = new NodeRelation(encodeDomainNo, pathDomainList, CgwMonitorManage.Common.NodeType.GROUP); nodeRelationDicTemp.Add(encodeDomainNo, nodeDomainRelation); foreach (KeyValuePair<string, IvsCameraGroup> ivsCameraGroupKeyValue in ivsCameraGroupDic) { IvsCameraGroup group = ivsCameraGroupKeyValue.Value; string encodeGroupNo = group.GroupNo + CgwConst.IVS_SDK_DOMAINCODE_SEPARATOR_TAG + group.DomainCode; //添加组信息 CameraGroup cameraGroup = new CameraGroup(encodeGroupNo, group.GroupName); groupListTemp.Add(cameraGroup); List<string> pathList = new List<string>(); RecursionPath(group.GroupNo, ivsCameraGroupDic, ref pathList); NodeRelation nodeRelation = new NodeRelation(encodeGroupNo, pathList, CgwMonitorManage.Common.NodeType.GROUP); nodeRelationDicTemp.Add(encodeGroupNo, nodeRelation); } } //添加所有组节点 nodeRelationListTemp.AddRange(nodeRelationDicTemp.Values); List<IvsCamera> ivsCameraPageList = new List<IvsCamera>(); int cameraCount = 0; logEx.Trace("Call ivsSdkClient.GetDeviceList"); //查询第一页记录,同时获取摄像头个数 result = this.ivsSdkClient.GetDeviceList(CgwConst.PAGE_FIRST_INDEX, CgwConst.PAGE_LAST_INDEX, out cameraCount, out ivsCameraPageList); List<IvsCamera> ivsCameraLeaveList = new List<IvsCamera>(); //如果总记录大于一页的总记录数 if (cameraCount > CgwConst.PAGE_LAST_INDEX) { //一次将剩下所有记录查询出来 result = this.ivsSdkClient.GetDeviceList(CgwConst.PAGE_LAST_INDEX + 1, cameraCount, out cameraCount, out ivsCameraLeaveList); } if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("GetDeviceList success.Current group count:{0}", cameraCount); ivsCameraPageList.AddRange(ivsCameraLeaveList); } else { logEx.Error("GetDeviceList failed.Ivs sdk error code:{0}", result); ClearCamera(); isRefreshSucess = false; return; } foreach (IvsCamera ivsCamera in ivsCameraPageList) { Camera camera = new Camera(ivsCamera.No, ivsCamera.Name); camera.Status = ivsCamera.Status; List<string> cameraPathList = new List<string>(); //string encodeGroupNo = ivsCamera.GroupNo + CgwConst.IVS_SDK_DOMAINCODE_SEPARATOR_TAG + ivsCamera.DomainCode;//摄像头所属组号错误(与群组组号混淆了)。 string encodeGroupNo = ivsCamera.GroupNo; if (nodeRelationDicTemp.ContainsKey(encodeGroupNo)) { //如果自定义分组里面包含该摄像头的父节点,需要设置分组路径 cameraPathList.AddRange(nodeRelationDicTemp[encodeGroupNo].Path); cameraPathList.Add(encodeGroupNo); } NodeRelation nodeRelation = new NodeRelation(camera.No, cameraPathList, CgwMonitorManage.Common.NodeType.CAMERA); //解决问题单DTS2013080201001,规避因IVS服务器存在摄像头重复的bug导致融合网关异常的问题 if (!nodeRelationDicTemp.ContainsKey(camera.No)) { cameraListTemp.Add(camera); nodeRelationDicTemp.Add(camera.No, nodeRelation); } nodeRelationListTemp.Add(nodeRelation); } //nodeRelationListTemp.AddRange(nodeRelationDicTemp.Values); DateTime dtStart = DateTime.Now; DateTime dtNow = new DateTime(); while (!isGetDevicesFinish) { dtNow = DateTime.Now; if ((dtNow - dtStart).TotalSeconds > refreshDeviceListOverTime) { isRefreshSucess = false; return; } Thread.Sleep(1); continue; } //将实时获取的值放到缓存 if (this.cameraOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { this.cameraList = cameraListTemp; this.groupList = groupListTemp; this.nodeRelationList = nodeRelationListTemp; isRefreshSucess = true; } catch (Exception ex) { isRefreshSucess = false; logEx.Error("Set the list to the buffer failed. ", ex.Message); } finally { this.cameraOperateLock.ExitWriteLock(); } } else { isRefreshSucess = false; } } catch (System.Exception ex) { logEx.Error("GetAllCamerasMethod failed.Exception message:{0}", ex.Message); isRefreshSucess = false; } }
/// <summary> /// 指定码流回调函数 /// </summary> /// <param name="videoDataCallBack"></param> /// <param name="sender"></param> public void SetDataCallBackFunc(DataCallBack dataCallBack, string sender) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.SetDataCallBackFunc()."); this.dataCallBack = dataCallBack; this.sender = sender; }
/// <summary> /// 监控平台加载器,轮询加载,直到成功 /// </summary> /// <param name="loginInfo"></param> private void LoginThread(Object loginInfoObj) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.LoginThread()."); try { IvsLoginInfo loginInfo = loginInfoObj as IvsLoginInfo; while (!loadResult) { if (loginInfo == null) { logEx.Error("loginInfoObj is Null."); return; } //等待ivs sdk事件回调结束,再调用sdk接口,否则调用失败 Thread.Sleep(1000); logEx.Trace("Call ivsSdkClient.Login({0},{1},{2},******).", loginInfo.Ip, loginInfo.Port, loginInfo.User); //登陆 int result = this.ivsSdkClient.Login(loginInfo.Ip, loginInfo.Port, loginInfo.User, loginInfo.Pwd); if (result != CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Error("Login to ivs monitor failed.Monitor id:{0}.ip:{1}, port:{2}, user:{3}.ivs sdk error code:{4}.", this.monitorId, loginInfo.Ip, loginInfo.Port, loginInfo.User, result); //登陆失败,等待1分钟后再次尝试登陆 Thread.Sleep(CgwConst.RELOAD_MONITOR_WAIT_TIME); loadResult = false; continue; } else { logEx.Info("Login to ivs monitor success.Monitor id:{0}.ip:{1}, port:{2}, user:{3}.", this.monitorId, loginInfo.Ip, loginInfo.Port, loginInfo.User); loadResult = true; } this.GetAllCamerasTimer(null, null); //启动定时器 this.updateCameraTimer.Start(); } } catch (System.Exception ex) { logEx.Error("Load IVS monitor failed. Exception message:{0}.", ex.Message); } }
/// <summary> /// 启动摄像头预览 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <returns></returns> public SmcErr StartReceiveVideo(string cameraNo) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.StartReceiveVideo({0}).", cameraNo); SmcErr err = new CgwError(); TiandyCamera camera = null; Host host = null; //摄像头所连接的流媒体服务器 MediaServer cameraMediaServer = null; if (this.cameraOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { if (!this.tiandyCameraDictionary.ContainsKey(cameraNo)) { err.SetErrorNo(CgwError.CAMERA_NOT_FOUND); logEx.Error("Start Receive camera video data failed.Camera No is not found.Camera No:{0}", cameraNo); return err; } camera = this.tiandyCameraDictionary[cameraNo]; host = this.hostDictionary[camera.HostNo]; cameraMediaServer = this.mediaServerDictionary[host.MediaServerNo]; } catch (Exception e) { err.SetErrorNo(CgwError.START_RECEIVE_VIDEO_FAILED); logEx.Error("Start Receive camera video data failed.Camera No:{0},Execption message:{1}", cameraNo, e.Message); return err; } finally { this.cameraOperateLock.ExitReadLock(); } } if (camera == null) { err.SetErrorNo(CgwError.START_RECEIVE_VIDEO_FAILED); logEx.Error("Start Receive camera video data failed.Camera No is not found.Camera No:{0}", cameraNo); return err; } RealPlayInfo real = new RealPlayInfo(); real.ch = camera.Channel; real.data_type = (int)TiandyDateType.PRIMARY; real.hPlayWnd = null; int result = this.sdkClient.StartReceiveVideo(host.No, cameraMediaServer, ref real); //如果为负数,表示预览失败 if (result < 0) { err.SetErrorNo(CgwError.START_RECEIVE_VIDEO_FAILED); logEx.Error("Start Receive camera video data failed.Camera No:{0}.", cameraNo); return err; } else { //需要停止的预览句柄 int needToStopHandel = CgwConst.START_RECEIVE_VIDEO_DATA_FAILED; if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { //如果预览句柄已经存在,删除掉原来的句柄,用新的句柄替换 if (this.cameraVideoHandeDic.ContainsKey(cameraNo)) { needToStopHandel = this.cameraVideoHandeDic[cameraNo]; this.videoHandleCameraDic.Remove(needToStopHandel); this.cameraVideoHandeDic.Remove(cameraNo); } this.cameraVideoHandeDic.Add(cameraNo, result); this.videoHandleCameraDic.Add(result, cameraNo); } finally { this.handelOperateLock.ExitWriteLock(); } } logEx.Info("Start Receive camera video data success.Camera No:{0},Handle:{1}.", cameraNo, result); //重新预览后,更新了预览句柄,需要将原来的预览停止,放在handelOperateLock外面,防止长时间占用锁 if (needToStopHandel != CgwConst.START_RECEIVE_VIDEO_DATA_FAILED) { this.sdkClient.StopReceiveVideo(needToStopHandel); } } return err; }
/// <summary> /// 获取监控摄像头列表刷新状态,返回结果为0是表示刷新完毕,为1是刷新操作中。当查询刷新状态为0时,可调用获取监控摄像头列表接口,获取刷新后监控摄像头列表 /// </summary> /// <param name="refreshStatus">刷新状态</param> /// <returns></returns> public SmcErr GetRefreshStatus(out SmcErr refreshStatus) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.GetRefreshStatus"); SmcErr err = new CgwError(); refreshStatus = new SmcErr(); refreshStatus.ErrNo = CgwError.ERR_DEVICE_LIST_REFRESH_STATUS_END; if (refreshMonitorCameraOperateLock.TryEnterWriteLock(CgwConst.EFRESH_MONITOR_CAMERA_WAIT_TIME)) { try { refreshStatus.ErrNo = isRefreshSucess ? CgwError.ERR_DEVICE_LIST_REFRESH_STATUS_END : CgwError.ERR_DEVICE_LIST_REFRESH_STATUS_FAILED; } finally { refreshMonitorCameraOperateLock.ExitWriteLock(); } } else { refreshStatus.ErrNo = CgwError.ERR_DEVICE_LIST_REFRESH_STATUS_EXECUTING; } logEx.Info("GetRefreshStatus success."); return err; }
/// <summary> /// 初始化IVS监控平台 /// </summary> /// <param name="monitorConfigElement">监控平台配置节点</param> /// <returns></returns> public SmcErr Load(XmlElement monitorConfigElement) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Info("Enter: IvsVideoMonitor.Load()."); SmcErr err = new CgwError(); try { //解析xml节点,获取所需参数 this.monitorId = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.ID_TAG); ip = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.IP_TAG); port = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PORT_TAG); user = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.USER_TAG); //password = CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PASSWORD_TAG); pwdByte = CommonFunction.EncryptStr2Byte(CommonFunction.GetSingleNodeValue(monitorConfigElement, CgwConst.PASSWORD_TAG),CgwConst.PASSWORD_TAG); //从配置文件读取的参数要简单判断一下合法性 //初始化之前设置日志路径 logEx.Trace("Call SetLogPath:{0}", ivsLogPath); this.ivsSdkClient.SetLogPath(ivsLogPath); logEx.Trace("Call ivsSdkClient.Init()."); //初始化 int result = this.ivsSdkClient.Init(); if (result != CgwConst.IVS_SDK_SUCCESS_TAG) { //直接将IVS的错误码返回 err.SetErrorNo(CgwError.MONITOR_LOAD_FAILED); logEx.Error("Init ivs monitor failed.Monitor id:{0}.ivs sdk error code:{1}.", this.monitorId, result); return err; } else { logEx.Info("Init ivs sdk success.Monitor id:{0}", this.monitorId); } //设置监控平台id this.ivsSdkClient.SetId(this.monitorId); this.sdkCallbackFunc = IvsRealPlayCallBackRaw; this.ivsSdkClient.SetRealPlayCBRawCallBackFunc(this.sdkCallbackFunc); //sdk事件回调 this.ivsEventCallBackFunc = IvsEventCallBackFunc; this.ivsSdkClient.SetEventCallBackFunc(this.ivsEventCallBackFunc); IvsLoginInfo loginInfo = new IvsLoginInfo(); loginInfo.Ip = ip; loginInfo.Port = int.Parse(port); loginInfo.User = user; //loginInfo.Pwd = password; loginInfo.Pwd = CommonFunction.DecryptByte2Str(pwdByte,CgwConst.PASSWORD_TAG); loadResult = false; //使用线程轮询加载监控平台 Thread loaderThread = new Thread(LoginThread); loaderThread.IsBackground = true; loaderThread.Start(loginInfo); } catch (Exception e) { err.SetErrorNo(CgwError.MONITOR_CONFIG_FILE_INVALID); logEx.Error("Load ivs monitor failed.Execption message:{0}.", e.Message); return err; } logEx.Info("Load video monitor success.Monitor id:{0}.", this.monitorId); return err; }
/// <summary> /// 刷新监控摄像头列表 /// </summary> /// <returns></returns> public SmcErr RefreshMonitorCamera() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.RefreshMonitorCamera"); SmcErr err = new CgwError(); if (refreshMonitorCameraOperateLock.TryEnterWriteLock(CgwConst.EFRESH_MONITOR_CAMERA_WAIT_TIME)) { try { GetAllCamerasMethod(); //重新开始计时 updateCameraTimer.Stop(); updateCameraTimer.Start(); } finally { refreshMonitorCameraOperateLock.ExitWriteLock(); } } logEx.Info("RefreshMonitorCamera success."); return err; }
/// <summary> /// 重发I帧(暂不支持) /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <returns></returns> public SmcErr MakeIFrame(string cameraNo) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.MakeIFrame({0}).", cameraNo); SmcErr err = new CgwError(); return err; }
/// <summary> /// 设置麦克风状态 /// </summary> /// <param name="cameraNo"></param> /// <param name="isOn">麦克风是否开启</param> /// <returns></returns> public SmcErr SetMic(string cameraNo, bool isOn) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.SetMic({0},{1}).", cameraNo, isOn); SmcErr err = new CgwError(); if (this.micOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { if (this.cameraMicStatusDic.ContainsKey(cameraNo)) { this.cameraMicStatusDic[cameraNo] = isOn; } else { this.cameraMicStatusDic.Add(cameraNo, isOn); } } finally { this.micOperateLock.ExitWriteLock(); } } logEx.Info("Set Mic status success.Camera no:{0},isOn:{1}).", cameraNo, isOn); return err; }
/// <summary> /// 指定码流回调函数 /// </summary> /// <param name="videoDataCallBack"></param> /// <param name="sender"></param> public void SetDataCallBackFunc(DataCallBack videoDataCallBack, string sender) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.SetVideoDataCallBackFunc()."); this.dataCallBack = videoDataCallBack; this.sender = sender; logEx.Info("Set VideoDataCallBackFunc success. Monitor id:{0}", this.monitorId); }
/// <summary> /// 停止云台控制,摄像头控制 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <param name="ptzCommand">命令类型</param> /// <returns></returns> public SmcErr StopControlPtz(string cameraNo, PtzCommandType ptzCommand) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.StopControlPtz({0}).", cameraNo); SmcErr err = new CgwError(); int handel = CgwConst.START_RECEIVE_VIDEO_DATA_FAILED; if (this.handelOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { if (this.cameraVideoHandeDic.ContainsKey(cameraNo)) { handel = this.cameraVideoHandeDic[cameraNo]; } else { logEx.Warn("The camera was not Preview.Don't need to end the control.Camera No:{0}.", cameraNo); } } finally { this.handelOperateLock.ExitReadLock(); } } if (handel != CgwConst.START_RECEIVE_VIDEO_DATA_FAILED) { Client_PTZ_Command client_ptz_command = new Client_PTZ_Command(); client_ptz_command.start = false; //将ptz命令转换成天地伟业的命令 string name = Enum.GetName(typeof(PtzCommandType), ptzCommand); if (Enum.IsDefined(typeof(TiandyPtzCommandType), name)) { TiandyPtzCommandType tiandyPtzCommandType = (TiandyPtzCommandType)Enum.Parse(typeof(TiandyPtzCommandType), name); client_ptz_command.cmd = (int)tiandyPtzCommandType; } else { err.SetErrorNo(CgwError.STOP_CONTROL_PTZ_FAILED); logEx.Error("The tiandy monitor is not support the command.ptzCommand:{0}.", ptzCommand); return err; } bool result = this.sdkClient.ControlPtz(handel, client_ptz_command); if (result) { logEx.Info("Stop control camera ptz success.Camera No:{0}.", cameraNo); } else { err.SetErrorNo(CgwError.STOP_CONTROL_PTZ_FAILED); logEx.Error("Stop control camera ptz failed.Camera No:{0}.", cameraNo); } } else { err.SetErrorNo(CgwError.STOP_CONTROL_PTZ_FAILED); logEx.Error("Handel is not found. Stop control camera ptz failed. Camera No:{0}.", cameraNo); return err; } return err; }
/// <summary> /// 开始云台控制,摄像头控制 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <param name="ptzCommand">命令类型</param> /// <param name="param">命令参数(速度、倍数)</param> /// <returns></returns> public SmcErr StartControlPtz(string cameraNo, PtzCommandType ptzCommand, int param) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.StartControlPtz({0},{1},{2}).", cameraNo, ptzCommand, param); SmcErr err = new CgwError(); //将ptz命令转换成IVS的命令 string name = Enum.GetName(typeof(PtzCommandType), ptzCommand); if (Enum.IsDefined(typeof(IvsPtzCommandType), name)) { IvsPtzCommandType ivsPtzCommandType = (IvsPtzCommandType)Enum.Parse(typeof(IvsPtzCommandType), name); logEx.Trace("Call ivsSdkClient.StartPtzControl({0},{1},{2}).", cameraNo, (int)ivsPtzCommandType, param); int result = this.ivsSdkClient.StartPtzControl(cameraNo, (int)ivsPtzCommandType, param.ToString()); //如果为0,表示成功 if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("Start control ptz success.Camera No:{0}.", cameraNo); } else { err.SetErrorNo(CgwError.START_CONTROL_PTZ_FAILED); logEx.Error("Start control ptz failed.Camera No:{0}.Ivs sdk error code:{1}.", cameraNo, result); return err; } } else { err.SetErrorNo(CgwError.START_CONTROL_PTZ_FAILED); logEx.Error("The ivs monitor is not support the command.ptzCommand:{0}.", ptzCommand); return err; } return err; }
/// <summary> /// 注销天地伟业监控平台资源 /// </summary> /// <returns></returns> public SmcErr Unload() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.Unload()."); SmcErr err = new CgwError(); //停止定时器 this.updateCameraTimer.Stop(); if (this.sdkClient.Unload()) { logEx.Info("Unload video monitor success.Monitor id:{0}.", this.monitorId); } else { err.SetErrorNo(CgwError.UNLOAD_MONITOR_FAILED); logEx.Error("Unload video monitor failed.Monitor id:{0}.", this.monitorId); } return err; }
/// <summary> /// 启动摄像头预览 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <returns></returns> public SmcErr StartReceiveVideo(string cameraNo) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.StartReceiveVideo({0}).", cameraNo); SmcErr err = new CgwError(); int handle; logEx.Trace("Call ivsSdkClient.StartRealPlayCBRaw({0}).", cameraNo); int result = this.ivsSdkClient.StartRealPlayCBRaw(cameraNo, out handle); //如果不为0,表示预览失败 if (result != CgwConst.IVS_SDK_SUCCESS_TAG) { err.SetErrorNo(CgwError.START_RECEIVE_VIDEO_FAILED); logEx.Error("Start Receive camera video data failed.Camera No:{0}.Ivs sdk error code:{1}", cameraNo, result); return err; } else { logEx.Info("Start Receive camera video data success.Camera No:{0},Handle:{1}.", cameraNo, handle); } //预览成功,需要停止原来的预览,并将预览句柄添加到缓存 //需要停止的预览句柄 int needToStopHandel = CgwConst.START_RECEIVE_VIDEO_DATA_FAILED; if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { //如果预览句柄已经存在,删除掉原来的句柄,用新的句柄替换 if (this.cameraVideoHandeDic.ContainsKey(cameraNo)) { needToStopHandel = this.cameraVideoHandeDic[cameraNo]; this.videoHandleCameraDic.Remove(needToStopHandel); this.cameraVideoHandeDic.Remove(cameraNo); } this.cameraVideoHandeDic.Add(cameraNo, handle); MediaDataSender mediaDataSender = new MediaDataSender(cameraNo, this.dataCallBack); this.videoHandleCameraDic.Add(handle, mediaDataSender); } finally { this.handelOperateLock.ExitWriteLock(); } } //重新预览后,更新了预览句柄,需要将原来的预览停止,放在handelOperateLock外面,防止长时间占用锁 if (needToStopHandel != CgwConst.START_RECEIVE_VIDEO_DATA_FAILED) { result = this.ivsSdkClient.StopRealPlay(needToStopHandel); //如果不为0,表示停止原来的预览失败,只记录日志,不返回错误,不设置错误码 if (result != CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Error("Get a new preview success. But stop old preview failed.CameraNo:{0},Ivs sdk error code:{0}", cameraNo, result); return err; } } return err; }
/// <summary> /// 获取摄像头列表及分组信息 /// </summary> private void GetAllCamerasMethod() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.GetAllCamerasTimer()."); try { //调用天地伟业http接口获取天地伟业设备管理树列表 List<Resource> resourceTree = this.httpClient.GetResourceTree(); if (resourceTree == null) { logEx.Error("GetResourceTree failed."); ClearCamera(); isRefreshSucess = false; return; } //调用天地伟业http接口获取自定义设备树列表 List<Resource> customTree = this.httpClient.GetCustomTree(); if (customTree == null) { logEx.Error("GetCustomTree failed."); ClearCamera(); isRefreshSucess = false; return; } Dictionary<string, TiandyCamera> tiandyCameraDictionaryTemp = new Dictionary<string, TiandyCamera>(); Dictionary<string, Host> hostDictionaryTemp = new Dictionary<string, Host>(); Dictionary<string, MediaServer> mediaServerDictionaryTemp = new Dictionary<string, MediaServer>(); //递归处理,将摄像头、主机、流媒体服务器遍历出来 RecursionCamera(resourceTree, tiandyCameraDictionaryTemp, hostDictionaryTemp, mediaServerDictionaryTemp); Dictionary<string, CameraGroup> groupDicTemp = new Dictionary<string, CameraGroup>(); Dictionary<string, NodeRelation> nodeRelationDicTemp = new Dictionary<string, NodeRelation>(); List<NodeRelation> nodeRelationListTemp = new List<NodeRelation>(); //递归处理,获取组,摄像头、分组关系 RecursionCameraGroup(customTree, null, groupDicTemp, nodeRelationDicTemp, nodeRelationListTemp); //对于未分组的摄像头,父节点设置为空 foreach (KeyValuePair<string, TiandyCamera> tiandyCameraKeyValue in tiandyCameraDictionaryTemp) { if (!nodeRelationDicTemp.ContainsKey(tiandyCameraKeyValue.Key)) { NodeRelation nodeRelation = new NodeRelation(tiandyCameraKeyValue.Key, new List<string>(), CgwMonitorManage.Common.NodeType.CAMERA); nodeRelationListTemp.Add(nodeRelation); } } DateTime dtStart = DateTime.Now; DateTime dtNow = new DateTime(); while (!isGetDevicesFinish) { dtNow = DateTime.Now; if ((dtNow - dtStart).TotalSeconds > refreshDeviceListOverTime) { isRefreshSucess = false; return; } Thread.Sleep(1); continue; } if (this.cameraOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { this.tiandyCameraDictionary = tiandyCameraDictionaryTemp; this.hostDictionary = hostDictionaryTemp; this.mediaServerDictionary = mediaServerDictionaryTemp; this.groupDic = groupDicTemp; this.nodeRelationList = nodeRelationListTemp; isRefreshSucess = true; } catch (Exception ex) { isRefreshSucess = false; logEx.Error("Recursion camera failed.Execption message:{0}", ex.Message); } finally { this.cameraOperateLock.ExitWriteLock(); } } } catch (System.Exception ex) { isRefreshSucess = false; logEx.Error("GetAllCamerasTimer catch Exception:{0}", ex.Message); } }
/// <summary> /// 停止云台控制,摄像头控制 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <param name="ptzCommand">命令类型</param> /// <returns></returns> public SmcErr StopControlPtz(string cameraNo, PtzCommandType ptzCommand) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.StopControlPtz({0}).", cameraNo); SmcErr err = new CgwError(); logEx.Trace("Call ivsSdkClient.StopPtzControl({0}).", cameraNo); int result = this.ivsSdkClient.StopPtzControl(cameraNo); //如果为0,表示成功 if (result == CgwConst.IVS_SDK_SUCCESS_TAG) { logEx.Info("Stop control ptz success.Camera No:{0}.", cameraNo); } else { //直接将IVS的错误码返回 err.SetErrorNo(CgwError.STOP_CONTROL_PTZ_FAILED); logEx.Error("Stop control ptz failed.Camera No:{0}.Ivs sdk error code:{1}.", cameraNo, result); return err; } return err; }
/// <summary> /// 监控平台加载器,轮询加载,直到成功 /// </summary> /// <param name="mediaServerIdObj"></param> private void LoaderThread(Object mediaServerIdObj) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: TiandyVideoMonitor.LoadTiandyMonitorThread()."); try { bool loadResult = false; string mediaServerId = mediaServerIdObj as string; while (!loadResult) { this.GetAllCamerasTimer(null, null); if (this.cameraOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { loadResult = true; this.sdkClient.SdkMediaServer = null; //用户没有指定流媒体服务器,预览视频时,采用摄像头所连接的服务器。 if (!string.IsNullOrEmpty(mediaServerId)) { if (this.mediaServerDictionary.ContainsKey(mediaServerId)) { this.sdkClient.SdkMediaServer = this.mediaServerDictionary[mediaServerId]; } else { //流媒体服务器id配置错误,Id不存在 logEx.Error("Load Tiandy monitor failed.Media server id is not found.MediaServerId:{0}", mediaServerId); loadResult = false; } } if (loadResult) { //设置回调函数到SDK this.sdkClient.SetDataCallBackFunc(TiandyRealDataCallbackFunc); } } finally { this.cameraOperateLock.ExitReadLock(); } } if (!loadResult) { loadResult = false; Thread.Sleep(CgwConst.RELOAD_MONITOR_WAIT_TIME); continue; } if (!this.sdkClient.Load(this.monitorId)) { logEx.Error("Load video monitor failed.Monitor id:{0}.", this.monitorId); loadResult = false; Thread.Sleep(CgwConst.RELOAD_MONITOR_WAIT_TIME); continue; } //启动定时器 this.updateCameraTimer.Start(); loadResult = true; } } catch (System.Exception ex) { logEx.Error("LoaderThread catch exception:{0}", ex.Message); } logEx.Trace("Exit: TiandyVideoMonitor.LoadTiandyMonitorThread()."); }
/// <summary> /// 停止预览 /// </summary> /// <param name="cameraNo">摄像头编号</param> /// <returns>成功返回0,失败返回错误码</returns> public SmcErr StopReceiveVideo(string cameraNo) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: IvsVideoMonitor.StopReceiveVideo({0}).", cameraNo); SmcErr err = new CgwError(); //需要停止的预览句柄 int needToStopHandel = CgwConst.START_RECEIVE_VIDEO_DATA_FAILED; if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { if (this.cameraVideoHandeDic.ContainsKey(cameraNo)) { needToStopHandel = this.cameraVideoHandeDic[cameraNo]; this.videoHandleCameraDic.Remove(needToStopHandel); this.cameraVideoHandeDic.Remove(cameraNo); } else { logEx.Warn("Stop Receive camera video data failed. Don't need to end the preview.Camera No:{0}.", cameraNo); //如果预览句柄不存在,不需要处理,直接返回 return err; } } catch (Exception ex) { err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED); logEx.Error("Stop Receive camera video data failed.Execption message:{0}", ex.Message); return err; } finally { this.handelOperateLock.ExitWriteLock(); } } //调用sdk的停止方法,放在handelOperateLock外面,防止长时间占用锁 if (needToStopHandel != CgwConst.START_RECEIVE_VIDEO_DATA_FAILED) { int result = this.ivsSdkClient.StopRealPlay(needToStopHandel); //如果不为0,表示预览失败 if (result != CgwConst.IVS_SDK_SUCCESS_TAG) { err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED); logEx.Error("Stop Receive camera video data failed.Ivs sdk error code:{0}", result); return err; } logEx.Info("Stop Receive camera video data success.Camera No:{0},Handle:{1}.", cameraNo, needToStopHandel); } return err; }