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
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|