You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

332 lines
17 KiB

using System;
using System.Text;
using GpsModels;
using GPSBusiness.Helper;
using Newtonsoft.Json;
using GPSBusiness.Redis;
using GPSBuSiness.Util;
namespace GPSBusiness.GPSStandard
{
/// <summary>
/// 车辆GPS数据处理器
/// </summary>
public class BbStandardToCarGpsHandler : IStandardToCarGPSHandler
{
private static ICarService _service;
public BbStandardToCarGpsHandler(ICarService service)
{
_service = service;
}
/// <summary>
/// 获取gps数据
/// </summary>
/// <param name="buffer"></param>
/// <param name="simNo"></param>
/// <param name="conid"></param>
/// <param name="isHeartBeat"></param>
/// <returns></returns>
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;
}
}
}
}