private void DealGpsDataProc(object obj) { try { Byte[] data = (Byte[])obj; //1-4字节为包类型,默认传的是1,这里没有用到 int type = System.BitConverter.ToInt32(data.Skip(0).Take(4).ToArray(), 0); //5-8字节为考车号 int kch = System.BitConverter.ToInt32(data.Skip(4).Take(4).ToArray(), 0); if (kch <= 0) { Log.GetLogger().ErrorFormat("udp 数据解析得到的考车号为 {0}", kch); return; } if (!m_dicCars.ContainsKey(kch) || !m_dicExamProcedures.ContainsKey(kch)) { Log.GetLogger().ErrorFormat("不存在考车 {0},请检查配置", kch); return; } ExamProcedure examProcedure = m_dicExamProcedures[kch]; Log.GetLogger().DebugFormat("考车 {0} 接收到 GPS 数据", kch); //接下来的数据结构可以参考 GPSData 类 //8个字节存放double类型的经度 //8个字节存放double类型的纬度 //4个字节存放float类型的方向角 //4个字节存放float类型的速度 //4个字节存放float类型的里程 double longitude = System.BitConverter.ToDouble(data.Skip(8).Take(8).ToArray(), 0); double latitude = System.BitConverter.ToDouble(data.Skip(16).Take(8).ToArray(), 0); float directionAngle = System.BitConverter.ToSingle(data.Skip(24).Take(4).ToArray(), 0); float speed = System.BitConverter.ToSingle(data.Skip(28).Take(4).ToArray(), 0); float mileage = System.BitConverter.ToSingle(data.Skip(32).Take(4).ToArray(), 0); Log.GetLogger().DebugFormat("longitude={0}, latitude={1}, angle={2}, speed={3}, mileage={4}", longitude, latitude, directionAngle, speed, mileage); GPSData gpsData = new GPSData(longitude, latitude, directionAngle, speed, mileage); if (!examProcedure.HandleGPS(gpsData)) { Log.GetLogger().ErrorFormat("examProcedure.HandleGPS failed, kch={0}", kch); } } catch (Exception e) { Log.GetLogger().ErrorFormat("catch an error : {0}", e.Message); } Log.GetLogger().DebugFormat("DealGpsDataProc end"); }
/// <summary> /// 项目扣分 /// </summary> /// <param name="kch">考车号</param> /// <param name="xmbh">项目编号,包含项目编号和错误编号,用@分隔</param> /// <param name="time">时间</param> /// <returns></returns> private bool HandleM17C53(int kch, string xmbh, string time) { string errorMsg = string.Empty; string[] strArray = BaseMethod.SplitString(xmbh, BaseDefine.SPLIT_CHAR_AT, out errorMsg); if (!string.IsNullOrEmpty(errorMsg) || strArray.Length != 2) { Log.GetLogger().ErrorFormat("17C53 接口存在错误,{0}", errorMsg); return(false); } string strXmCode = strArray[0]; string strErrrorCode = strArray[1]; int xmCode = string.IsNullOrEmpty(strXmCode) ? 0 : int.Parse(strXmCode); int kskm = BaseMethod.INIGetIntValue(BaseDefine.CONFIG_FILE_PATH_ENV, BaseDefine.CONFIG_SECTION_CONFIG, BaseDefine.CONFIG_KEY_KSKM, 0); //考试科目 string xmName = string.Empty; //项目名称 if (BaseDefine.CONFIG_VALUE_KSKM_3 == kskm) //科目三 { xmName = GetKM3Name(xmCode); } else //科目二 { xmName = GetKM2Name(xmCode); } //扣分类型、扣除分数 if (!m_dicJudgeRules.ContainsKey(strErrrorCode)) { Log.GetLogger().ErrorFormat("数据库扣分规则表中不存在错误编号为 {0} 的记录,请检查配置。", strErrrorCode); return(false); } string kflx = m_dicJudgeRules[strErrrorCode].JudgementType; int kcfs = m_dicJudgeRules[strErrrorCode].Points; if (!m_dicExamProcedures.ContainsKey(kch)) { Log.GetLogger().ErrorFormat("m_dicExamProcedures 字典找不到考车号 : {0}", kch); return(false); } ExamProcedure examProcedure = m_dicExamProcedures[kch]; if (!examProcedure.Handle17C53(xmName, kflx, kcfs)) { Log.GetLogger().ErrorFormat("examProcedure.Handle17C53 failed, kch={0}", kch); return(false); } Log.GetLogger().InfoFormat("HandleM17C53 end, kch={0}, xmName={1}, kflx={2}, kcfs={3}", kch, xmName, kflx, kcfs); return(true); }
/// <summary> /// 考试开始 /// </summary> /// <param name="kch">考车号</param> /// <param name="zkzmbh">准考证明编号</param> /// <returns></returns> private bool HandleM17C51(int kch, string zkzmbh) { int kscs = 0; //考试次数 int drcs = 0; //当日次数 //if (!GetExamCount(zkzmbh, ref kscs, ref drcs)) //{ // return false; //} if (!m_dicExamProcedures.ContainsKey(kch)) { Log.GetLogger().ErrorFormat("m_dicExamProcedures 字典找不到考车号 : {0}", kch); return(false); } ExamProcedure examProcedure = m_dicExamProcedures[kch]; //获取考生信息 StudentInfo studentInfo = new StudentInfo(); if (!GetStudentInfo(zkzmbh, ref studentInfo)) { return(false); } if (!examProcedure.Handle17C51(studentInfo)) { Log.GetLogger().ErrorFormat("examProcedure.Handle17C51 failed, kch={0}", kch); return(false); } //try //{ // BaseMethod.TF17C51(kch, zkzmbh, kscs, drcs); //} //catch (Exception e) //{ // Log.GetLogger().ErrorFormat("TF17C51 catch an error : {0}, kch = {1}, zkzmbh = {2}, kscs = {3}, drcs = {4}", // e.Message, kch, zkzmbh, kscs, drcs); // return false; //} Log.GetLogger().InfoFormat("HandleM17C51 end, kch={0}, zkzmbh={1}, kscs={2}, drcs={3}", kch, zkzmbh, kscs, drcs); return(true); }
/// <summary> /// 考试完成 /// </summary> /// <param name="kch">考车号</param> /// <param name="kscj">考试成绩</param> /// <returns></returns> private bool HandleM17C56(int kch, int kscj) { int kshgfs = 0; //考试合格分数 if (!m_dicExamProcedures.ContainsKey(kch)) { Log.GetLogger().ErrorFormat("HandleM17C56错误,找不到考车 {0}", kch); return(false); } ExamProcedure examPorcedure = m_dicExamProcedures[kch]; 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) //科目三 { kshgfs = BaseDefine.CONFIG_VALUE_KSHGFS_3; } else //科目二 { kshgfs = BaseDefine.CONFIG_VALUE_KSHGFS_2; } bool bPass = (kscj >= kshgfs) ? true : false; examPorcedure.Handle17C56(bPass); //try //{ // if (kscj >= kshgfs) //考试合格 // { // BaseMethod.TF17C56(kch, 1, kscj); // } //} //catch (Exception e) //{ // Log.GetLogger().ErrorFormat("TF17C56 catch an error : {0}, 考车号={1}, 科目{2}, 考试成绩={3}", e.Message, // kch, kskm, kscj); // return false; //} Log.GetLogger().InfoFormat("TF17C56 end, 考车号={0}, 科目{1}, 考试成绩={2}", kch, kskm, kscj); 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); }