using System; using System.Text; using GpsModels; using GPSBusiness.Helper; using Newtonsoft.Json; using GPSBusiness.Redis; using GPSBuSiness.Util; namespace GPSBusiness.GPSStandard { /// /// 车辆GPS数据处理器 /// public class BbStandardToCarGpsHandler : IStandardToCarGPSHandler { private static ICarService _service; public BbStandardToCarGpsHandler(ICarService service) { _service = service; } /// /// 获取gps数据 /// /// /// /// /// /// public GpsModel GetGps(byte[] buffer, string terminalNo, IntPtr conid, bool isHeartBeat) { try { var gpsModel = new GpsModel(); var vehicleModel = _service.Get(terminalNo); if (vehicleModel == null) return null; gpsModel.VehicleId = vehicleModel.Id; gpsModel.VehicleCode = vehicleModel.VehicleCode; gpsModel.VehiclePlate = vehicleModel.VehiclePlate; gpsModel.SimNo = vehicleModel.SimNo; gpsModel.CompanyId = vehicleModel.CompanyId; gpsModel.Status = vehicleModel.Status; gpsModel.TerminalType = vehicleModel.TerminalType; gpsModel.Acc = -1; gpsModel.Work = -1; gpsModel.GpsTime = gpsModel.RecTime = DateTime.Now; if (isHeartBeat) return gpsModel; //转译,转换为str var data = ByteConvert.Fzy(buffer); var dataStr = ByteConvert.ByteArrayToHexStr(data); //判断GPS解析结果,长度小于55认为异常GPS信息予以过滤 if (dataStr.Length > 55) { #region 获取,报警标识、状态 try { //报警 var BJ = dataStr.Substring(26, 8); // 欠压 gpsModel.GpsAlert = Convert.ToInt32(BJ.Substring(6)); // 掉电 gpsModel.Useing = Convert.ToInt32(BJ.Substring(7)); //定位状态:0未定位,1有定位; gpsModel.GpsState = Convert.ToInt32(dataStr.Substring(34, 8), 16); //转成2进制字符串 string stateTo2 = Convert.ToString(gpsModel.GpsState, 2).PadLeft(32, '0'); //===获取gps是否定位 gpsModel.LocationStatus = stateTo2.Substring((stateTo2.Length - 2), 1) == "1" ? 1 : 0; //Acc状态(0关,1开) gpsModel.Acc = stateTo2.Substring((stateTo2.Length - 1), 1) == "1" ? 1 : 0; //作业状态(0关,1开) gpsModel.Work = stateTo2.Substring((stateTo2.Length - 25), 1) == "1" ? 1 : 0; //if (gpsModel.LocationStatus == 0) return gpsModel; //===获取gps油电状态。 var oilElectricState = stateTo2.Substring((stateTo2.Length - 31), 1) == "1" ? 1 : 0; ////===获取gps防拆报警开关状态 //var breakToogle = stateTo2.Substring((stateTo2.Length - 32), 1) == "1" ? 1 : 0; //string alertTo2 = Convert.ToString(gpsModel.GpsAlert, 2).PadLeft(32, '0'); //转成2进制字符串 ////===获取gps超速报警 //var speedAlert = alertTo2.Substring((alertTo2.Length - 2), 1) == "1" ? 1 : 0; ////===获取gps被拆卸报警 //var breakAlert = alertTo2.Substring((alertTo2.Length - 18), 1) == "1" ? 1 : 0; this.Log().DebugFormat("{0}-gps是否定位【{1}】,[VehicleId:{2}],[dataStr:{3}]", gpsModel.VehicleId, gpsModel.LocationStatus, gpsModel.VehicleId, dataStr); } catch (Exception ex) { gpsModel.Acc = 0; gpsModel.Work = 0; //00000000 40000003 //7E 02000036 91850002 4576017A 00000000 40000003 0160B672 06C24DD5 000C0000 00001902 22110213 01040000 03443001 6431010A FF0C01CC 00000000 25250000 EFC7DE 7E this.Log().ErrorFormat("BB_GetTGps=定位状态报警状态Acc,dataStr=【{3}】,ex.Message={0},ex.InnerException={1},ex.StackTrace={2}", ex.Message, ex.InnerException, ex.StackTrace, dataStr); } #endregion #region 获取,经纬度 try { gpsModel.Longitude = 0; gpsModel.Latitude = 0; // gpsModel.GpsMode = 1; if (gpsModel.LocationStatus == 0 && dataStr.Length > 184) //未定位进行基站解析 { //int mcc = Convert.ToInt32(dataStr.Substring(166, 4), 16); //int mnc = Convert.ToInt32(dataStr.Substring(170, 2), 16); //int lac = Convert.ToInt32(dataStr.Substring(172, 4), 16); //int cellid = Convert.ToInt32(dataStr.Substring(176, 8), 16); //var baseStation = MapHelper.GetBaseStation(mcc, mnc, lac, cellid); ////基站解析失败调用卫星经纬度 //if (baseStation.infocode == 10000 && baseStation.result.location != null) //{ // var location = baseStation.result.location.Split(','); // gpsModel.Longitude = Convert.ToDecimal(location[0]); // gpsModel.Latitude = Convert.ToDecimal(location[1]); // // gpsModel.GpsMode = 2; //} //else //{ // //获取经度纬度 // var lati = Convert.ToUInt32(dataStr.Substring(42, 8), 16).ToString(); // var longti = Convert.ToUInt32(dataStr.Substring(50, 8), 16).ToString(); // //经度 // if (longti.Length > 3) // { // string strLongti1 = longti.Substring(0, 3); // string strLongti2 = longti.Substring(3); // if (Convert.ToInt32(strLongti1) > 135) // { // strLongti1 = longti.Substring(0, 2); // strLongti2 = longti.Substring(2); // } // decimal dbLongti = decimal.Parse(strLongti1 + "." + strLongti2); // gpsModel.Longitude = dbLongti; // } // //纬度 // if (lati.Length > 2) // { // string strLati1 = lati.Substring(0, 2); // string strLati2 = lati.Substring(2); // decimal dbLati = decimal.Parse(strLati1 + "." + strLati2); // gpsModel.Latitude = dbLati; // } //} this.Log().InfoFormat($"基站定位,车辆Id:{gpsModel.VehicleId}"); } else { //获取经度纬度 var lati = Convert.ToUInt32(dataStr.Substring(42, 8), 16).ToString(); var longti = Convert.ToUInt32(dataStr.Substring(50, 8), 16).ToString(); //经度 if (longti.Length > 3) { string strLongti1 = longti.Substring(0, 3); string strLongti2 = longti.Substring(3); if (Convert.ToInt32(strLongti1) > 135) { strLongti1 = longti.Substring(0, 2); strLongti2 = longti.Substring(2); } decimal dbLongti = decimal.Parse(strLongti1 + "." + strLongti2); gpsModel.Longitude = dbLongti; } //纬度 if (lati.Length > 2) { string strLati1 = lati.Substring(0, 2); string strLati2 = lati.Substring(2); decimal dbLati = decimal.Parse(strLati1 + "." + strLati2); gpsModel.Latitude = dbLati; } //if (longti.Length <= 3 || lati.Length <= 2) //{ // this.Log().ErrorFormat("BB_GetTGps=经纬度解析异常,经度值或纬度值异常,dataStr=【{0}】", dataStr); //} //高德 // gpsModel.Address = MapHelper.GetLocationByLngLat(gpsModel.Longitude, gpsModel.Latitude); //腾讯 // gpsModel.Address = MapHelper.GetTXLocationByLngLat(gpsModel.Longitude, gpsModel.Latitude); } } catch (Exception ex) { //0160B672 和 06C24DD5 //7E 02000036 91850002 4576017A 00000000 40000003 0160B672 06C24DD5 000C0000 00001902 22110213 01040000 03443001 6431010A FF0C01CC 00000000 25250000 EFC7DE 7E this.Log().ErrorFormat("BB_GetTGps=经纬度解析异常,dataStr=【{3}】,ex.Message={0},ex.InnerException={1},ex.StackTrace={2}", ex.Message, ex.InnerException, ex.StackTrace, dataStr); } #endregion #region 获取,高程速度方向 try { int speed = 0; int direct = 0; //定位模式为基站 if (gpsModel.LocationStatus == 0) { //取出上一个时间节点的经纬度 var LastGpsTime = RedisRepository.GetLastGpsTime(gpsModel); var LastGpsTimeRepeatCount = RedisRepository.GetLastGpsTimeRepeatCount(gpsModel); if (LastGpsTime != null) { var distance = GPSUtil.GetDistance(Convert.ToDouble(LastGpsTime.Latitude), Convert.ToDouble(LastGpsTime.Longitude), Convert.ToDouble(gpsModel.Latitude), Convert.ToDouble(gpsModel.Longitude)); //移动 if (distance != 0) { speed = Convert.ToInt32(distance / 10); if (speed < 15 || speed > 85) { speed = new Random().Next(10, 37); } //清空 RedisRepository.SetLastGpsTimeRepeatCount(gpsModel); } //未移动 else { if (LastGpsTime.Speed > 5&& LastGpsTimeRepeatCount<3) { speed = new Random().Next(10, 37); RedisRepository.IncrementLastGpsTimeRepeatCount(gpsModel); } } direct = Convert.ToInt32(GPSUtil.GetAngle(Convert.ToDouble(LastGpsTime.Longitude), Convert.ToDouble(LastGpsTime.Latitude), Convert.ToDouble(gpsModel.Longitude), Convert.ToDouble(gpsModel.Latitude))); if (direct > 360 || direct < 0) { direct = new Random().Next(120, 355); } gpsModel.Direct = direct; gpsModel.Speed = speed; } else { gpsModel.Speed = 0; gpsModel.Direct = 0; } } else { ////高程 //int tall = Convert.ToInt32(dataStr.Substring(58, 4), 16); //速度 speed = Convert.ToInt32(Convert.ToInt32(dataStr.Substring(62, 4), 16) / 10); gpsModel.Speed = speed; //方向 direct = Convert.ToInt32(dataStr.Substring(66, 4), 16); gpsModel.Direct = direct; } //当GPS速度小于5时,默认为静态飘逸,修改速度及其状态 if(speed<5) { gpsModel.Speed = 0; gpsModel.GpsState = 3; } } catch (Exception ex) { //000C0000 0000 //7E 02000036 91850002 4576017A 00000000 40000003 0160B672 06C24DD5 000C0000 00001902 22110213 01040000 03443001 6431010A FF0C01CC 00000000 25250000 EFC7DE 7E this.Log().ErrorFormat("BB_GetTGps=高程速度方向获取dataStr=【{3}】,,ex.Message={0},ex.InnerException={1},ex.StackTrace={2}", ex.Message, ex.InnerException, ex.StackTrace, dataStr); } //存储这一次的信息 RedisRepository.SetLastGpsTime(gpsModel); #endregion #region 获取时间 StringBuilder sb = new StringBuilder(); try { sb.Append("20"); sb.Append(dataStr.Substring(70, 2)); sb.Append("-"); sb.Append(dataStr.Substring(72, 2)); sb.Append("-"); sb.Append(dataStr.Substring(74, 2)); sb.Append(" "); sb.Append(dataStr.Substring(76, 2)); sb.Append(":"); sb.Append(dataStr.Substring(78, 2)); sb.Append(":"); sb.Append(dataStr.Substring(80, 2)); gpsModel.GpsTime = Convert.ToDateTime(sb.ToString()); gpsModel.RecTime = DateTime.Now; //00001902 22110213==>190222110213 //7E 02000036 91850002 4576017A 00000000 40000003 0160B672 06C24DD5 000C0000 00001902 22110213 01040000 03443001 6431010A FF0C01CC 00000000 25250000 EFC7DE 7E } //7E 02000040 01415005 727304C0 00000000 0000000301587E catch (Exception ex) { gpsModel.GpsTime = gpsModel.RecTime = DateTime.Now; this.Log().ErrorFormat("BB_GetTGps=gps时间获取【{3}】,dataStr=【{4}】,ex.Message={0},ex.InnerException={1},ex.StackTrace={2}", ex.Message, ex.InnerException, ex.StackTrace, sb, dataStr); } #endregion } return gpsModel; } catch (Exception ex) { this.Log().ErrorFormat("BB_GetTGps=报错=,ex.Message={0},ex.InnerException={1},ex.StackTrace={2}", ex.Message, ex.InnerException, ex.StackTrace); return null; } } } }