public bool StartDynamicDecode(CameraConf camera, int iWnd) { CHCNetSDK.NET_DVR_PU_STREAM_CFG_V41 struStreamCfgV41 = new CHCNetSDK.NET_DVR_PU_STREAM_CFG_V41(); CHCNetSDK.NET_DVR_DEC_STREAM_DEV_EX struStreamDev = new CHCNetSDK.NET_DVR_DEC_STREAM_DEV_EX(); struStreamCfgV41.dwSize = (uint)Marshal.SizeOf(struStreamCfgV41); struStreamCfgV41.byStreamMode = 1; //取流模式 struStreamDev.struDevChanInfo.byChanType = 0; //通道类型 struStreamDev.struDevChanInfo.byChannel = 0; //该参数无效,通道号见dwChannel struStreamDev.struDevChanInfo.byTransProtocol = 0; //传输协议类型0-TCP,1-UDP struStreamDev.struDevChanInfo.byFactoryType = 0; //前端设备厂家类型,通过接口获取 struStreamDev.struDevChanInfo.byAddress = camera.CameraIP; struStreamDev.struDevChanInfo.wDVRPort = (ushort)camera.CameraPort; struStreamDev.struDevChanInfo.dwChannel = (uint)camera.DwChannel; //通道号 struStreamDev.struDevChanInfo.byTransMode = (byte)camera.Mllx; //传输码流模式 struStreamDev.struDevChanInfo.sUserName = camera.RasUser; struStreamDev.struDevChanInfo.sPassword = camera.RasPassword; if (!string.IsNullOrEmpty(camera.MediaIP)) //流媒体 IP 不为空 { struStreamDev.struStreamMediaSvrCfg.byValid = 1; //启用流媒体 struStreamDev.struStreamMediaSvrCfg.wDevPort = 554; //端口 struStreamDev.struStreamMediaSvrCfg.byTransmitType = 0; //TCP struStreamDev.struStreamMediaSvrCfg.byAddress = camera.MediaIP; } uint dwUnionSize = (uint)Marshal.SizeOf(struStreamCfgV41.uDecStreamMode); IntPtr ptrStreamUnion = Marshal.AllocHGlobal((Int32)dwUnionSize); Marshal.StructureToPtr(struStreamDev, ptrStreamUnion, false); struStreamCfgV41.uDecStreamMode = (CHCNetSDK.NET_DVR_DEC_STREAM_MODE)Marshal.PtrToStructure(ptrStreamUnion, typeof(CHCNetSDK.NET_DVR_DEC_STREAM_MODE)); Marshal.FreeHGlobal(ptrStreamUnion); if (!CHCNetSDK.NET_DVR_MatrixStartDynamic_V41(m_userId, m_deChannel[iWnd], ref struStreamCfgV41)) { uint errorCode = CHCNetSDK.NET_DVR_GetLastError(); Log.GetLogger().ErrorFormat("NET_DVR_MatrixStartDynamic_V41 failed, error code = {0}", errorCode); return(false); } Log.GetLogger().InfoFormat("开启动态解码,考车{0},ecode={1},子窗口={2},mediaIP={3},码流={4}(0主码流,1子码流),{5}_{6}", m_kch, camera.CameraBH, m_deChannel[iWnd], camera.MediaIP, camera.Mllx, camera.CameraIP, camera.DwChannel); return(true); }
private bool HandleM17C52(int kch, int bh) { string key = string.Format("{0}_{1}", kch, bh); if (!m_dicCameras.ContainsKey(key)) { Log.GetLogger().ErrorFormat("摄像头配置 {0} 不存在,请检查配置", key); return(false); } CameraConf camera = m_dicCameras[key]; if (!m_dicCars[kch].StartDynamicDecode(camera, 1)) { Log.GetLogger().ErrorFormat("HandleM17C52 画面切换失败,{0}", key); return(false); } Log.GetLogger().InfoFormat("HandleM17C52 画面切换,{0}", key); return(true); }
/// <summary> /// 项目完成 /// </summary> /// <param name="kch">考车号</param> /// <param name="strZkzmbh">准考证明</param> /// <param name="strXmbh">项目编号</param> /// <returns></returns> private bool HandleM17C55(int kch, string strZkzmbh, string strXmbh) { //项目开始编号与项目完成编号不一样,车载没有把完成编号传过来,这里需要根据开始编号进行转换 int xmBeginCode = string.IsNullOrEmpty(strXmbh) ? 0 : int.Parse(strXmbh); int xmEndCode = 0; int kskm = BaseMethod.INIGetIntValue(BaseDefine.CONFIG_FILE_PATH_ENV, BaseDefine.CONFIG_SECTION_CONFIG, BaseDefine.CONFIG_KEY_KSKM, 0); //考试科目 if (BaseDefine.CONFIG_VALUE_KSKM_3 == kskm) //科目三 { string key = string.Format("考车{0}_2", kch); if (!m_dicCameras.ContainsKey(key)) { Log.GetLogger().ErrorFormat("找不到 {0} 摄像头配置,请检查配置", key); //return false; } else { CameraConf camera = m_dicCameras[key]; m_dicCars[kch].StartDynamicDecode(camera, 1); //车载视频动态,第二画面车外 } //科目三的项目完成编号为,开始编号+700 //218 --> 918 if (xmBeginCode < BaseDefine.XMBH_700) { xmEndCode = xmBeginCode + BaseDefine.XMBH_700; } else { xmEndCode = xmBeginCode; } } else //科目二 { //项目编号转换,科目二专用,数据库升级后可以不需要这段代码 xmBeginCode = GetKM2NewXmBh(xmBeginCode); //e.g. 201500 --> 201990 // 201500 先除以 1000,得到 201。再乘以 1000,得到 201000。再加上 990,得到 201990。 xmEndCode = (xmBeginCode / 1000) * 1000 + 990; //科目二切换到场地远景视频 string key = BaseDefine.STRING_KM2_PUBLIC_VIDEO; if (!m_dicCameras.ContainsKey(key)) { Log.GetLogger().ErrorFormat("找不到 {0} 摄像头配置,请检查配置", key); //return false; } else { CameraConf camera = m_dicCameras[key]; m_dicCars[kch].StartDynamicDecode(camera, 1); } } //获取项目类型 if (!m_dicJudgeRules.ContainsKey(xmEndCode.ToString())) { Log.GetLogger().ErrorFormat("ErrorData 表不存在 {0} 记录,请检查配置", xmEndCode); return(false); } string xmlx = m_dicJudgeRules[xmEndCode.ToString()].JudgementType; if (!m_dicExamProcedures.ContainsKey(kch)) { Log.GetLogger().ErrorFormat("m_dicExamProcedures 字典找不到考车号 : {0}", kch); return(false); } ExamProcedure examProcedure = m_dicExamProcedures[kch]; if (!examProcedure.Handle17C55(xmBeginCode, xmlx)) { Log.GetLogger().ErrorFormat("examProcedure.Handle17C55 failed, kch={0}", kch); return(false); } return(true); }
/// <summary> /// 项目开始 /// </summary> /// <param name="kch">考车号</param> /// <param name="zkzmbh">准考证明编号</param> /// <param name="xmbh">项目编号</param> /// <returns></returns> private bool HandleM17C52(int kch, string zkzmbh, string xmbh) { int xmCode = string.IsNullOrEmpty(xmbh) ? 0 : int.Parse(xmbh); int nWnd2 = BaseMethod.INIGetIntValue(BaseDefine.CONFIG_FILE_PATH_DISPLAY, BaseDefine.CONFIG_SECTION_CONFIG, BaseDefine.CONFIG_KEY_WND2, 1); //画面二状态 Log.GetLogger().DebugFormat("nWnd2 = {0}", nWnd2); if (1 == nWnd2) //值为1时进行项目动态切换 { string key = string.Format("{0}_1", xmbh); Log.GetLogger().DebugFormat("camera key = {0}", key); if (!m_dicCameras.ContainsKey(key)) { Log.GetLogger().ErrorFormat("摄像头 {0} 未配置,请检查配置文件。", key); return(false); } CameraConf camera = m_dicCameras[key]; m_dicCars[kch].StartDynamicDecode(camera, 1); //第二画面进项目 ////处理定点 ////半坡停车时,车载会发 15010 摄像头编号过来,切换摄像头后,另外开一个线程,休眠几秒时间后,切换为原来的摄像头 //if ((BaseDefine.XMBH_15010 == xmCode) || (BaseDefine.XMBH_15020 == xmCode) || (BaseDefine.XMBH_15030 == xmCode)) //{ // Log.GetLogger().InfoFormat("定点:{0}", xmCode); // if (BaseMethod.IsExistFile(BaseDefine.CONFIG_FILE_PATH_ZZIPChannel)) // { // XmInfo xmInfo = new XmInfo(kch, xmCode); // Thread QHThread = new Thread(new ParameterizedThreadStart(QHThreadProc)); // QHThread.Start(xmInfo); // } // return true; //} } //项目编号转换,科目二专用,数据库升级后可以不需要这段代码 int xmCodeNew = GetKM2NewXmBh(xmCode); Log.GetLogger().DebugFormat("xmCodeNew = {0}", xmCodeNew); //获取项目类型(因为数据库里扣分类型和项目类型存在同一张表,所以这里参考C++代码,全部存在同一张字典里) if (!m_dicJudgeRules.ContainsKey(xmbh)) { Log.GetLogger().ErrorFormat("扣分类型 {0} 未配置,请检查配置", xmbh); return(false); } string xmlx = m_dicJudgeRules[xmbh].JudgementType; //项目类型 if (!m_dicExamProcedures.ContainsKey(kch)) { Log.GetLogger().ErrorFormat("m_dicExamProcedures 字典找不到考车号 : {0}", kch); return(false); } ExamProcedure examProcedure = m_dicExamProcedures[kch]; if (!examProcedure.Handle17C52(xmCodeNew, xmlx)) { Log.GetLogger().ErrorFormat("examProcedure.Handle17C52 failed, kch={0}", kch); return(false); } //try //{ // //使用 C++ dll 进行绘制 // Log.GetLogger().DebugFormat("kch={0}, zkzmbh={1}, xmCode={2}, kflx={3}", kch, zkzmbh, xmCodeNew, kflx); // BaseMethod.TF17C52(kch, zkzmbh, xmCodeNew, kflx); //} //catch (Exception e) //{ // Log.GetLogger().ErrorFormat("TF17C52 catch an error : {0}, kch = {1}, zkzmbh = {2}, xmCodeNew = {3}, kflx = {4}", // e.Message, kch, zkzmbh, xmCodeNew, kflx); // return false; //} Log.GetLogger().InfoFormat("HandleM17C52 end, kch={0}, zkzmbh={1}", kch, zkzmbh); return(true); }
//开始运行 private bool RunMap() { string key = string.Empty; CameraConf cameraConf = new CameraConf(); //地图 Image imgMap = null; int nLoadMap = BaseMethod.INIGetIntValue(BaseDefine.CONFIG_FILE_PATH_ENV, BaseDefine.CONFIG_SECTION_CONFIG, BaseDefine.CONFIG_KEY_LOADMAP, 0); if (1 == nLoadMap) { try { imgMap = Image.FromFile(BaseDefine.IMG_PATH_MAPN); } catch (Exception e) { Log.GetLogger().ErrorFormat("Image.FromFile catch an error : {0}", e.Message); } } foreach (int iKch in dicCars.Keys) { Thread.Sleep(10); CarManager carManager = dicCars[iKch]; //动态解码 key = string.Format("考车{0}_1", iKch); if (!dicCameras.ContainsKey(key)) { Log.GetLogger().ErrorFormat("{0} 摄像头未配置,请检查", key); } else { cameraConf = dicCameras[key]; carManager.StartDynamicDecode(cameraConf, 0); } key = string.Format("考车{0}_2", iKch); if (!dicCameras.ContainsKey(key)) { Log.GetLogger().ErrorFormat("{0} 摄像头未配置,请检查", key); } else { cameraConf = dicCameras[key]; carManager.StartDynamicDecode(cameraConf, 1); } try { //被动解码 int thirdPH = -1; int fourthPH = -1; if (carManager.StartPassiveDecode(2, ref thirdPH) && carManager.StartPassiveDecode(3, ref fourthPH)) { ExamProcedure examProcedure = new ExamProcedure(); if (examProcedure.Init(m_userId, iKch, thirdPH, fourthPH, imgMap)) { dicExamProcedures.Add(iKch, examProcedure); } } else { Log.GetLogger().ErrorFormat("被动解码失败,kch={0}", iKch); } } catch (Exception e) { Log.GetLogger().ErrorFormat("catch an error : {0}", e.Message); } } return(true); }
/// <summary> /// 获取摄像头配置 /// </summary> /// <returns></returns> private bool GetCameraConf() { dicCameras.Clear(); string sql = string.Format("select {0},{1},{2},{3},{4},{5},{6},{7},{8} from {9} order by {10}", BaseDefine.DB_FIELD_BH, BaseDefine.DB_FIELD_SBIP, BaseDefine.DB_FIELD_YHM, BaseDefine.DB_FIELD_MM, BaseDefine.DB_FIELD_DKH, BaseDefine.DB_FIELD_TDH, BaseDefine.DB_FIELD_TRANSMODE, BaseDefine.DB_FIELD_MEDIAIP, BaseDefine.DB_FIELD_NID, BaseDefine.DB_TABLE_TBKVIDEO, BaseDefine.DB_FIELD_BH); try { DataSet ds = sqlDataProvider.RetriveDataSet(sql); if (null != ds) { for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { string bh = (null == ds.Tables[0].Rows[i][0]) ? string.Empty : ds.Tables[0].Rows[i][0].ToString(); string sbip = (null == ds.Tables[0].Rows[i][1]) ? string.Empty : ds.Tables[0].Rows[i][1].ToString(); string yhm = (null == ds.Tables[0].Rows[i][2]) ? string.Empty : ds.Tables[0].Rows[i][2].ToString(); string mm = (null == ds.Tables[0].Rows[i][3]) ? string.Empty : ds.Tables[0].Rows[i][3].ToString(); string dkh = (null == ds.Tables[0].Rows[i][4]) ? string.Empty : ds.Tables[0].Rows[i][4].ToString(); string tdh = (null == ds.Tables[0].Rows[i][5]) ? string.Empty : ds.Tables[0].Rows[i][5].ToString(); string transmode = (null == ds.Tables[0].Rows[i][6]) ? string.Empty : ds.Tables[0].Rows[i][6].ToString(); string mediaip = (null == ds.Tables[0].Rows[i][7]) ? string.Empty : ds.Tables[0].Rows[i][7].ToString(); string nid = (null == ds.Tables[0].Rows[i][8]) ? string.Empty : ds.Tables[0].Rows[i][8].ToString(); int iDkh = string.IsNullOrEmpty(dkh) ? 8000 : int.Parse(dkh); //端口号 int iTdh = string.IsNullOrEmpty(tdh) ? -1 : int.Parse(tdh); //通道号 int iTransmode = string.IsNullOrEmpty(transmode) ? 1 : int.Parse(transmode); //码流类型 CameraConf camera = new CameraConf(bh, sbip, yhm, mm, mediaip, iDkh, iTdh, iTransmode); string key = bh + "_" + nid; if (!dicCameras.ContainsKey(key)) { dicCameras.Add(key, camera); } } } } catch (Exception e) { Log.GetLogger().ErrorFormat("catch an error : {0}", e.Message); return(false); } if (0 == dicCameras.Count) { Log.GetLogger().ErrorFormat("初始化摄像头信息失败,数据库摄像头表解析结果为空"); return(false); } Log.GetLogger().InfoFormat("初始化摄像头信息成功"); return(true); }