public CameraGroup CreateCameraGroup() { var cameraGroup = new CameraGroup(this); _cameraGroups.Add(cameraGroup); return(cameraGroup); }
public Program() { scriptStartTime = DateTime.Now; tag_match = new System.Text.RegularExpressions.Regex(tag_pattern); SCAN_RATE = Convert.ToInt32(SCAN_DISTANCE * SCAN_DISTANCE_PER_TICK); LCDDisplay = new LCDGroup("Display", this); LCDDebug = new LCDGroup("Debug", this); LCDScan = new LCDGroup("Scan", this); LCDRemote = new LCDGroup("Remote", this); SG = new ScanGyro(this); Cameras = new CameraGroup(this); Power = new EnergyGroup(this); states.Add(ProgramStates.Startup, new StartupState(this, ProgramStates.Startup)); states.Add(ProgramStates.Error, new ErrorState(this, ProgramStates.Error)); states.Add(ProgramStates.Idle, new IdleState(this, ProgramStates.Idle)); transitions.Add(ProgramTransitions.error, new ErrorTransition(this)); transitions.Add(ProgramTransitions.boot, new BootTransition(this)); _CurrentState = states[ProgramStates.Startup]; _CurrentState.Init(); //Runtime.UpdateFrequency = UpdateFrequency.Update10; try { Echo(DrawApp()); Echo(DrawDev()); } catch (Exception e) { Echo("Exception in DrawApp() " + e.Message); } LCDDebug.writeToLine("Booting..."); LCDDisplay.writeToLine("Booting..."); LCDScan.writeToLine("Booting..."); LCDRemote.writeToLine("Booting..."); }
/// <summary> /// 过滤设备列表,获取摄像机和目录列表 /// </summary> /// <param name="deviceList">输入设备列表</param> /// <param name="cameraListTemp">返回摄像机列表</param> /// <param name="groupListTemp">返回组列表</param> private void FilterDeviceList(List <DeviceItem> deviceList, ref List <Camera> cameraListTemp, ref List <CameraGroup> groupListTemp) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: T28181VideoMonitor.FilterDeviceList()."); try { foreach (DeviceItem item in deviceList) { //根据设备ID获取设备类型 string devType = GetResourceType(item.DeviceID); //共享摄像机类型、共享主设备类型,需要通过主设备来查找设备的父节点 if (devType == "01" || devType == "00") { Camera camera = new Camera(item.DeviceID, item.Name); camera.Status = item.Status == "ON" ? CameraStatus.Online : CameraStatus.Offline; camera.ParentID = item.ParentID; camera.DeviceType = devType; cameraListTemp.Add(camera); } //共享目录类型 else if (devType == "99") { CameraGroup group = new CameraGroup(item.DeviceID, item.Name); group.ParentID = item.ParentID; groupListTemp.Add(group); } } } catch (System.Exception ex) { logEx.Error("FilterDeviceList failed. {0} ", ex.Message); } }
/// <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); }
void changeCamera(ref CameraGroup c) { v = v == 0 ? 1 : 0; if (c.c1.enabled) { c.c1.enabled = false; c.c2.enabled = true; } else { c.c1.enabled = true; c.c2.enabled = false; } }
public SkiUiScene(Action invalidateSurface, Func <Node, CameraComponent, Action, SkiUiComponent> createUiComponent) { _invalidateSurface = invalidateSurface; _canvasComponent = new CanvasComponent(); _cameraGroup = _canvasComponent.CreateCameraGroup(); _camera = _scene.RootNode .CreateChild() .AddComponent(new CameraComponent(_cameraGroup, 0)); _scene.RootNode.AddComponent(_canvasComponent); UiComponent = _scene.RootNode .CreateChild() .AddComponent(createUiComponent(_scene.RootNode, _camera, InvalidateSurface)) .AddToCamera(_camera); _scene.Start(); InvalidateSurface(); }
static private CameraGroup FindOrAddCameraGroup(ManagementServer ms, string groupName) { CameraGroup groupExist = ms.CameraGroupFolder.CameraGroups.Where(x => x.Name == groupName).FirstOrDefault(); if (groupExist != null) { return(groupExist); } CameraGroupFolder folder = ms.CameraGroupFolder; ServerTask task = folder.AddDeviceGroup(groupName, "group added by tool"); Console.WriteLine("Camera group add (" + groupName + ") task: " + task.State); if (task.State == StateEnum.Success) { string path = task.Path; return(new CameraGroup(EnvironmentManager.Instance.MasterSite.ServerId, path)); } return(null); }
/// <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> /// 递归天地伟业返回的自定义设备列表,只获取分组节点(TypeId为1000)和通道(摄像头)节点(TypeId为5),舍弃其他节点(如主机,中间件服务器等) /// </summary> /// <param name="customTree">天地伟业返回的自定义设备列表树</param> /// <param name="pathList">节点路径,如果为跟节点,传null即可,主要是用于递归函数处理</param> /// <param name="groupDic">组列表</param> /// <param name="nodeRelationDic">组、摄像头关系列表Dic,不能重复</param> /// <param name="nodeRelationListT">组、摄像头关系列表,可以重复,解决同一摄像头在不同分组下,融合网关报错的问题</param> /// private void RecursionCameraGroup(List<Resource> customTree, List<string> pathList, Dictionary<string, CameraGroup> groupDic, Dictionary<string, NodeRelation> nodeRelationDic, List<NodeRelation> nodeRelationListT) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); if (customTree == null) { logEx.Error("RecursionCameraGroup failed.CustomTree is null."); return; } if (pathList == null) { pathList = new List<string>(); } if (groupDic == null) { groupDic = new Dictionary<string, CameraGroup>(); } if (nodeRelationDic == null) { nodeRelationDic = new Dictionary<string, NodeRelation>(); } if (nodeRelationListT == null) { nodeRelationListT = new List<NodeRelation>(); } foreach (Resource custom in customTree) { //TypeId为5时,表示该节点为通道,对应一个摄像头 if (((int)NodeType.CAMERA).ToString().Equals(custom.TypeId)) { //pathList.Add(custom.Id); NodeRelation nodeRelation = new NodeRelation(custom.Id, new List<string>(pathList), CgwMonitorManage.Common.NodeType.CAMERA); if (!nodeRelationDic.ContainsKey(custom.Id)) { nodeRelationDic.Add(custom.Id, nodeRelation); } nodeRelationListT.Add(nodeRelation); //获取完路径后,要返回上一级路径 //pathList.Remove(custom.Id); } //TypeId为1000时,表示该节点为分组 else if (((int)NodeType.GROUP).ToString().Equals(custom.TypeId)) { //添加组信息 CameraGroup cameraGroup = new CameraGroup(custom.Id, custom.Caption); groupDic.Add(custom.Id, cameraGroup); NodeRelation nodeRelation = new NodeRelation(custom.Id, new List<string>(pathList), CgwMonitorManage.Common.NodeType.GROUP); if (!nodeRelationDic.ContainsKey(custom.Id)) { nodeRelationDic.Add(custom.Id, nodeRelation); } nodeRelationListT.Add(nodeRelation); //添加分组关系 pathList.Add(custom.Id); //如果是组,还需要递归处理,遍历子节点 RecursionCameraGroup(custom.items, pathList, groupDic, nodeRelationDic, nodeRelationListT); //获取完路径后,要返回上一级路径 pathList.Remove(custom.Id); } else { //其他类型节点不做处理 } } }
/// <summary> /// 播放命令操作 /// </summary> /// <param name="tvConfig"></param> public void PlayOnTV(TvConfig tvConfig) { // 处理数据对象,转换为封装的 Camera 等对象 CameraPanel cameraPanel = new CameraPanel { LayoutInfo = tvConfig.LayoutInfo }; if (tvConfig.MonitorInfo != null) { List <int> indexs = tvConfig.MonitorInfo.Select(t => t.Index).Distinct().ToList(); foreach (int index in indexs) { List <MonitorInfo> monitors = tvConfig.MonitorInfo.Where(t => t.Index == index).ToList(); CameraPanelItem panelItem = new CameraPanelItem { Index = index, RtspStrs = new List <string>(), RtmpStrs = new List <string>() }; if (monitors.Count > 1) { CameraGroup cameraGroup = new CameraGroup { Interval = monitors[0].TimeInterval }; foreach (var monitor in monitors) { DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera { StreamType = monitor.StreamType, DVR = dvr, Number = monitor.Channel }; cameraGroup.Items.Add(camera); panelItem.RtspStrs.Add(monitor.Rtsp); panelItem.RtmpStrs.Add(monitor.Rtmp); } panelItem.CameraGroup = cameraGroup; panelItem.Flag = monitors[0].Flag; panelItem.PlayType = PlayContentType.Group; } else { MonitorInfo monitor = monitors[0]; DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera() { DVR = dvr, StreamType = monitor.StreamType, Number = monitor.Channel }; panelItem.RtspStrs.Add(monitor.Rtsp); panelItem.RtmpStrs.Add(monitor.Rtmp); panelItem.Camera = camera; panelItem.Flag = monitor.Flag; panelItem.PlayType = PlayContentType.One; } cameraPanel.Cameras.Add(panelItem); } } gridVideo.SetValue(GridHelpers.CamearPanelProperty, cameraPanel); }
/// <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> 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; } }
void Start() { m_cameraGroupComponent = new CameraGroup(); //SetHeroActive(false); }
public MainPage() { InitializeComponent(); _scene.Start(); // Canvas components _canvasComponent1 = _scene.RootNode.AddComponent(new CanvasComponent()); _canvasComponent2 = _scene.RootNode.AddComponent(new CanvasComponent()); // Camera groups _cameraGroup1 = _canvasComponent1.CreateCameraGroup(); _cameraGroup2 = _canvasComponent2.CreateCameraGroup(); // Cameras _camera1 = _scene.RootNode .CreateChild() .AddComponent(new CameraComponent(_cameraGroup1, 0)); _camera2 = _scene.RootNode .CreateChild(new SKPoint(50, 200), 0, (float)Math.PI / 8, new SKPoint(3, 3)) .AddComponent(new CameraComponent(_cameraGroup2, 0)); // Scribble _scene.RootNode .CreateChild() .AddComponent( new DrawableComponent( (canvas, camera) => { using ( var touchPathStroke = new SKPaint { IsAntialias = true, Style = SKPaintStyle.Stroke, Color = SKColors.Purple, StrokeWidth = 1 } ) { foreach (var touchPath in _temporaryPaths) { canvas.DrawPath(touchPath.Value, touchPathStroke); } foreach (var touchPath in _paths) { canvas.DrawPath(touchPath, touchPathStroke); } } } ) ) .AddToCamera(_camera1) .AddToCamera(_camera2); //Sprites var zeroSprite = CreateTileSprite(_scene.RootNode, new InitialNodeTransform()); var secondSprite = CreateTileSprite( zeroSprite.Node, new InitialNodeTransform(new SKPoint(50, 0), 0, (float)Math.PI / 2, new SKPoint(2, 2)) ); var thirdSprite = CreateTileSprite( secondSprite.Node, new InitialNodeTransform(new SKPoint(50, 0), 0, (float)Math.PI / 2, new SKPoint(2, 2)) ); var fourthSprite = CreateTileSprite( thirdSprite.Node, new InitialNodeTransform(new SKPoint(50, 0), 0, (float)Math.PI / 2, new SKPoint(2, 2)) ); }
/// <summary> /// 递归天地伟业返回的自定义设备列表,只获取分组节点(TypeId为1000)和通道(摄像头)节点(TypeId为5),舍弃其他节点(如主机,中间件服务器等) /// </summary> /// <param name="customTree">天地伟业返回的自定义设备列表树</param> /// <param name="pathList">节点路径,如果为跟节点,传null即可,主要是用于递归函数处理</param> /// <param name="groupDic">组列表</param> /// <param name="nodeRelationDic">组、摄像头关系列表Dic,不能重复</param> /// <param name="nodeRelationListT">组、摄像头关系列表,可以重复,解决同一摄像头在不同分组下,融合网关报错的问题</param> /// private void RecursionCameraGroup(List <Resource> customTree, List <string> pathList, Dictionary <string, CameraGroup> groupDic, Dictionary <string, NodeRelation> nodeRelationDic, List <NodeRelation> nodeRelationListT) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); if (customTree == null) { logEx.Error("RecursionCameraGroup failed.CustomTree is null."); return; } if (pathList == null) { pathList = new List <string>(); } if (groupDic == null) { groupDic = new Dictionary <string, CameraGroup>(); } if (nodeRelationDic == null) { nodeRelationDic = new Dictionary <string, NodeRelation>(); } if (nodeRelationListT == null) { nodeRelationListT = new List <NodeRelation>(); } foreach (Resource custom in customTree) { //TypeId为5时,表示该节点为通道,对应一个摄像头 if (((int)NodeType.CAMERA).ToString().Equals(custom.TypeId)) { //pathList.Add(custom.Id); NodeRelation nodeRelation = new NodeRelation(custom.Id, new List <string>(pathList), CgwMonitorManage.Common.NodeType.CAMERA); if (!nodeRelationDic.ContainsKey(custom.Id)) { nodeRelationDic.Add(custom.Id, nodeRelation); } nodeRelationListT.Add(nodeRelation); //获取完路径后,要返回上一级路径 //pathList.Remove(custom.Id); } //TypeId为1000时,表示该节点为分组 else if (((int)NodeType.GROUP).ToString().Equals(custom.TypeId)) { //添加组信息 CameraGroup cameraGroup = new CameraGroup(custom.Id, custom.Caption); groupDic.Add(custom.Id, cameraGroup); NodeRelation nodeRelation = new NodeRelation(custom.Id, new List <string>(pathList), CgwMonitorManage.Common.NodeType.GROUP); if (!nodeRelationDic.ContainsKey(custom.Id)) { nodeRelationDic.Add(custom.Id, nodeRelation); } nodeRelationListT.Add(nodeRelation); //添加分组关系 pathList.Add(custom.Id); //如果是组,还需要递归处理,遍历子节点 RecursionCameraGroup(custom.items, pathList, groupDic, nodeRelationDic, nodeRelationListT); //获取完路径后,要返回上一级路径 pathList.Remove(custom.Id); } else { //其他类型节点不做处理 } } }
/// <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) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: T28181VideoMonitor.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(); } } logEx.Debug("cameraList.{0}", cameraList.Count); logEx.Debug("groupList.{0}", groupList.Count); logEx.Debug("nodeRelationList.{0}", nodeRelationList.Count); logEx.Debug("Get all cameras success."); return err; }
static private bool AddCamera(string parms) { string[] parameters = parms.Split(','); string ip = parameters[0]; string user = parameters[1]; string pass = parameters[2]; string drivernr = parameters[3]; string hwname = parameters[4]; string cameraName = parameters[5]; string rsName = parameters[6]; string groupName = parameters[7]; int drivernum = int.Parse(drivernr); ManagementServer managementServer = new ManagementServer(EnvironmentManager.Instance.MasterSite); RecordingServer recordingServer = managementServer.RecordingServerFolder.RecordingServers.FirstOrDefault(x => x.Name == rsName); if (recordingServer == null) { Console.WriteLine("Error. Did not find recording server: " + rsName); return(false); } string hardwareDriverPath = recordingServer.HardwareDriverFolder.HardwareDrivers.Where(x => x.Number == drivernum).FirstOrDefault()?.Path; if (hardwareDriverPath == null) { Console.WriteLine("Error. Did not find hardware driver: " + drivernum); return(false); } Console.WriteLine("Will now attempt to add: " + cameraName); ServerTask addHardwareServerTask = recordingServer.AddHardware(ip, hardwareDriverPath, user, pass); while (addHardwareServerTask.State != StateEnum.Error && addHardwareServerTask.State != StateEnum.Success) { System.Threading.Thread.Sleep(1000); addHardwareServerTask.UpdateState(); } Console.WriteLine("Hardware add task: " + addHardwareServerTask.State); if (addHardwareServerTask.State == StateEnum.Error) { Console.WriteLine("Hardware add error: " + addHardwareServerTask.ErrorText); return(false); } else if (addHardwareServerTask.State == StateEnum.Success) { string path = addHardwareServerTask.Path; // For the added hardware Hardware hardware = new Hardware(EnvironmentManager.Instance.MasterSite.ServerId, path); hardware.Name = hwname; hardware.Enabled = true; hardware.Save(); Camera camera = hardware.CameraFolder.Cameras.First(); camera.Name = cameraName; camera.Enabled = true; camera.Save(); // alter other camera properties(?) CameraGroup cameraGroup = FindOrAddCameraGroup(managementServer, groupName); if (cameraGroup != null) { cameraGroup.CameraFolder.AddDeviceGroupMember(camera.Path); // make sure the camera is member of one group } } return(true); }
/// <summary> /// 过滤设备列表,获取摄像机和目录列表 /// </summary> /// <param name="deviceList">输入设备列表</param> /// <param name="cameraListTemp">返回摄像机列表</param> /// <param name="groupListTemp">返回组列表</param> private void FilterDeviceList(List<DeviceItem> deviceList, ref List<Camera> cameraListTemp, ref List<CameraGroup> groupListTemp) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: T28181VideoMonitor.FilterDeviceList()."); try { foreach (DeviceItem item in deviceList) { //根据设备ID获取设备类型 string devType = GetResourceType(item.DeviceID); logEx.Debug("FilterDeviceList.devType = {0}", devType); //共享摄像机类型、共享主设备类型,需要通过主设备来查找设备的父节点 if (devType == CgwConst.RESOURCE_TYPE_CAMERA || devType == CgwConst.RESOURCE_TYPE_MAIN) { Camera camera = new Camera(item.DeviceID, item.Name); camera.Status = item.Status == "ON" ? CameraStatus.Online : CameraStatus.Offline; camera.ParentID = item.ParentID; camera.DeviceType = devType; cameraListTemp.Add(camera); } //共享目录类型 else if (devType == CgwConst.RESOURCE_TYPE_DIR) { CameraGroup group = new CameraGroup(item.DeviceID, item.Name); group.ParentID = item.ParentID; groupListTemp.Add(group); } } } catch (System.Exception ex) { logEx.Error("FilterDeviceList failed. {0} ", ex.Message); } }
/// <summary> /// 获取摄像头列表及分组信息 /// </summary> private void GetAllCamerasMethod() { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Info("Enter:GetAllCamerasMethod"); try { List<Camera> cameraListTemp = new List<Camera>(); List<CameraGroup> groupListTemp = new List<CameraGroup>(); List<NodeRelation> nodeRelationListTemp = new List<NodeRelation>(); List<eLTEGroupInfo> lsteLTEGroupInfo = new List<eLTEGroupInfo>(); List<eLTEGrpUserInfo> lsteLTEGrpUserInfo = new List<eLTEGrpUserInfo>(); List<eLTEUserInfo> dcUsersList = new List<eLTEUserInfo>(); //获得本DC管理的所有User ELTE_RESULT iRet = (ELTE_RESULT)lteSdkClient.GetAllDcUsers(0, out dcUsersList); if (ELTE_RESULT.RET_SUCCESS != iRet) { isRefreshSuccess = false; logEx.Error("GetAllDcUsers Failed,ELTE_Result:{0}",iRet.ToString()); return; } //获得本DC管理的所有Group,返回值为一份克隆的数据,由调用者负责操纵并最终销毁、dcid:本调度台的用户号,如果 Dcid==0,则返回全网所有的Group iRet = (ELTE_RESULT)lteSdkClient.GetAllGroups(0, out lsteLTEGroupInfo); if (ELTE_RESULT.RET_SUCCESS != iRet) { isRefreshSuccess = false; logEx.Error("GetAllGroups Failed,ELTE_Result:{0}",iRet.ToString()); return; } foreach (eLTEGroupInfo group in lsteLTEGroupInfo) { //保存分组信息 CameraGroup cameraGroup = new CameraGroup(group.grpid.ToString(), group.grpname); groupListTemp.Add(cameraGroup); List<eLTEGrpUserInfo> groupUserList = new List<eLTEGrpUserInfo>(); //获得某个组里的所有User,返回值为一份克隆的数据,由调用者负责操纵并最终销毁、grpid:组号;如果该组不存在,则返回NULL iRet=(ELTE_RESULT)lteSdkClient.GetGroupUsers(group.grpid, out groupUserList); if (ELTE_RESULT.RET_SUCCESS != iRet) { logEx.Error("GetGroupUsers Failed,GroupID:{0},ELTE_Result:{1}", group.grpid,iRet.ToString()); break; } foreach (eLTEGrpUserInfo user in groupUserList) { //动态重组中的组成员 if (user.memberType == eLTEGroup_Member_t.MEMBER_GROUP) { eLTEUserInfo userInfo = new eLTEUserInfo(); iRet=(ELTE_RESULT)lteSdkClient.GetUserInfo(user.userid, out userInfo); if (ELTE_RESULT.RET_SUCCESS != iRet) { logEx.Error("GetUserInfo Failed,UserID:{0},ELTE_Result:{1}", user.userid,iRet.ToString()); break; } //保存分组信息 if (!groupListTemp.Exists(x => x.No == group.grpid.ToString())) { cameraGroup = new CameraGroup(userInfo.userid.ToString(), userInfo.username); cameraGroup.ParentID = group.grpid.ToString(); groupListTemp.Add(cameraGroup); } } //普通用户成员 else if (user.memberType == eLTEGroup_Member_t.MEMBER_USER) { eLTEUserInfo userInfo = new eLTEUserInfo(); userInfo = dcUsersList.Find(x => { return x.userid == user.userid; }); if (userInfo != null) { if ((userInfo.usercategory == eLTEUser_Category_t.PTTUSER && bPttUser) || (userInfo.usercategory == eLTEUser_Category_t.FIXEDCAMERA && bFixedCamera)) { //保存用户信息 Camera camera = new Camera(userInfo.userid.ToString(), userInfo.username); camera.ParentID = group.grpid.ToString(); try { if (this.cameraStatusOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { camera.Status = onlineUser.Exists((x) => { if (x == camera.No) { return true; } else { return false; } }) == true ? CameraStatus.Online : CameraStatus.Offline; } cameraListTemp.Add(camera); } finally { this.cameraStatusOperateLock.ExitReadLock(); } } } else { logEx.Error("UserInfo is null,UserID:{0}", user.userid); } } } } logEx.Trace("GetElteCameras cameraListTemp:{0}", cameraListTemp.Count); logEx.Trace("GetElteCameras groupListTemp:{0}", groupListTemp.Count); //获取摄像头和组之间的关联 GetCameraAndGroupRelation(cameraListTemp, groupListTemp, nodeRelationListTemp); ////增加组外的设备信息 //List<eLTEUserInfo> dcUsersList = new List<eLTEUserInfo>(); ////获得本DC管理的所有User //lteSdkClient.GetAllDcUsers(0, out dcUsersList); foreach (eLTEUserInfo userInfo in dcUsersList) { if ((userInfo.usercategory == eLTEUser_Category_t.PTTUSER && bPttUser) || (userInfo.usercategory == eLTEUser_Category_t.FIXEDCAMERA && bFixedCamera)) { if (cameraListTemp.Exists(x => x.No == userInfo.userid.ToString())) { continue; } else { Camera camera = new Camera(userInfo.userid.ToString(), userInfo.username); try { if (this.cameraStatusOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { camera.Status = onlineUser.Exists((x) => { if (x == camera.No) { return true; } else { return false; } }) == true ? CameraStatus.Online : CameraStatus.Offline; } cameraListTemp.Add(camera); } finally { this.cameraStatusOperateLock.ExitReadLock(); } List<string> pathList = new List<string>(); NodeRelation nodeRelation = new NodeRelation(camera.No, pathList, NodeType.CAMERA); nodeRelationListTemp.Add(nodeRelation); } } } DateTime dtStart = DateTime.Now; DateTime dtNow = new DateTime(); while (!isGetDevicesFinish) { dtNow = DateTime.Now; if ((dtNow - dtStart).TotalSeconds > refreshDeviceListOverTime) { isRefreshSuccess = 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; isRefreshSuccess = true; } catch (Exception ex) { isRefreshSuccess = false; logEx.Error("Set the list to the buffer failed. ", ex.Message); } finally { this.cameraOperateLock.ExitWriteLock(); } } } catch (System.Exception ex) { isRefreshSuccess = false; logEx.Error("GetAllCamerasMethod failed.Exception message:{0}", ex.Message); } logEx.Debug("GetAllCameras eLTE cameraList:{0}", cameraList.Count); logEx.Debug("GetAllCameras eLTE groupList:{0}", groupList.Count); logEx.Debug("GetAllCameras eLTE nodeRelationList:{0}", nodeRelationList.Count); }
/// <summary> /// 获取摄像头列表及分组信息 /// </summary> /// <param name="isRealTime">是否实时获取,融合网关有个缓存,间隔一段时间获取,默认是从融合网关获取列表,如果该值为true,则实时获取</param> /// <param name="cameraList">摄像头列表</param> /// <param name="groupList">组信息</param> /// <param name="nodeRelationList">分组关系</param> /// <returns></returns> public SmcError.SmcErr GetAllCameras(out List<Camera> cameraList, out List<CameraGroup> groupList, out List<NodeRelation> nodeRelationList) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Trace("Enter: eLTEVideoMonitor.GetAllCameras()."); SmcErr err = new CgwError(); cameraList = new List<Camera>(); groupList = new List<CameraGroup>(); nodeRelationList = new List<NodeRelation>(); isGetDevicesFinish = false; 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); try { if (this.cameraStatusOperateLock.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { camera.Status = onlineUser.Exists((x) => { if (x == camera.No) { return true; } else { return false; } }) == true ? CameraStatus.Online : CameraStatus.Offline; } } finally { this.cameraStatusOperateLock.ExitReadLock(); } 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(); } } logEx.Info("Get all cameras success."); return err; }
/// <summary> /// 播放命令操作 /// </summary> /// <param name="tvConfig"></param> public void PlayOnTV(TvConfig tvConfig) { // 当布局变化时视频信息会变,清楚全部的 CameraPanelItem 信息 if (tvConfig.LayoutInfo != null) { this.cameras = new Dictionary <int, CameraPanelItem>(); } // 处理数据对象,转换为封装的 Camera 等对象 CameraPanel cameraPanel = new CameraPanel { LayoutInfo = tvConfig.LayoutInfo }; if (tvConfig.MonitorInfo != null) { List <int> indexs = tvConfig.MonitorInfo.Select(t => t.Index).Distinct().ToList(); foreach (int index in indexs) { List <MonitorInfo> monitors = tvConfig.MonitorInfo.Where(t => t.Index == index).ToList(); CameraPanelItem panelItem = new CameraPanelItem { Index = index }; if (monitors.Count > 1) { CameraGroup cameraGroup = new CameraGroup { Interval = monitors[0].TimeInterval }; foreach (var monitor in monitors) { DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera { StreamType = monitor.StreamType, DVR = dvr, Number = monitor.Channel }; cameraGroup.Items.Add(camera); } panelItem.CameraGroup = cameraGroup; panelItem.Flag = monitors[0].Flag; panelItem.PlayType = PlayContentType.Group; } else { MonitorInfo monitor = monitors[0]; DVR dvr = new DVR() { IP = monitor.Ip, Port = monitor.AdminPort, UserName = monitor.User, Password = monitor.PassWord, Id = monitor.Id }; Camera camera = new Camera() { DVR = dvr, StreamType = monitor.StreamType, Number = monitor.Channel }; panelItem.Camera = camera; panelItem.Flag = monitor.Flag; panelItem.PlayType = PlayContentType.One; if (monitor.Ip == null && monitor.User == null) { panelItem.Flag = 0; } } cameraPanel.Cameras.Add(panelItem); if (this.cameras.ContainsKey(index)) { this.cameras.Remove(index); } this.cameras.Add(index, panelItem); } // 登录各个设备,为后面播放, // 这里再返回赋值,因为每次都需要登录信息,否则失败 foreach (var item2 in cameraPanel.Cameras) { if (item2.Camera != null) { item2.Camera.DVR.Connection(false); } else if (item2.CameraGroup != null) { foreach (var item in item2.CameraGroup.Items) { item.DVR.Connection(false); } } } } this.gridVideo.SetValue(GridHelpers.CamearPanelProperty, cameraPanel); }