lg_backend/langguanApi/Service/HJ212/NetSession.cs

131 lines
4.8 KiB
C#

using IceCoffee.FastSocket.Tcp;
using JT808.Protocol;
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using langguanApi.Common.Gps;
using langguanApi.Model;
using Npoi.Mapper;
using NPOI.SS.Formula.Functions;
using System.Text;
using static langguanApi.Common.Gps.ProtocolParser;
namespace langguanApi.Service.HJ212
{
public class NetSession : TcpSession
{
private StringBuilder _unpackCache;
public NetSession(TcpServer server) : base(server)
{
}
protected override void OnClosed()
{
base.OnClosed();
_unpackCache?.Clear();
}
/// <summary>
/// 获取分包缓存
/// </summary>
/// <returns></returns>
private StringBuilder GetUnpackCache()
{
return _unpackCache ??= new StringBuilder();
}
/// <summary>
///
/// </summary>
protected override void OnReceived()
{
//if (ReadBuffer.IndexOf(35) != 0L)// '#'
//{
// return;
// // throw new Exception("异常TCP连接 IP: " + RemoteIPEndPoint);
//}
string rawText = null;
while (ReadBuffer.CanReadLine)
{
try
{
byte[] data = ReadBuffer.ReadLine();
Console.WriteLine($"原始数据:{data}----------");
Console.WriteLine($"原始数据HexString:{data.ToHexString()}--------------------");
//Console.WriteLine($"原始数据ASCII:{Encoding.ASCII.GetString(data)}-");
//Position position = ParsePosition(data);
//Console.WriteLine($"Latitude: {position.Latitude}");
//Console.WriteLine($"Longitude: {position.Longitude}");
//Console.WriteLine($"Altitude: {position.Altitude}");
//int offset = 0;
//// 解析消息头
//var header = ProtocolParser.ParseHeader(data, ref offset);
//Console.WriteLine($"Message ID: {header.MessageId}, Terminal ID: {header.TerminalId}");
//// 解析终端注册消息
//var registerMessage = ProtocolParser.ParseTerminalRegisterMessage(data, ref offset);
//Console.WriteLine($"Province ID: {registerMessage.ProvinceId}, City ID: {registerMessage.CityId}");
//Console.WriteLine($"License Plate: {registerMessage.LicensePlate}");
// offset = 0;
//// 解析位置信息汇报消息
//var locationReportMessage = ProtocolParser.ParseLocationReportMessage(data, ref offset);
//Console.WriteLine($"Latitude: {locationReportMessage.Latitude}, Longitude: {locationReportMessage.Longitude}");
//Console.WriteLine($"Speed: {locationReportMessage.Speed}, Time: {locationReportMessage.Time}");
//var jT808Package = new JT808Serializer().Deserialize(data);
////4.数据包体
//JT808_0x0200 jT808_0x0200 = (JT808_0x0200)jT808Package.Bodies;
//var lon = jT808_0x0200.Lat;
//var lat = jT808_0x0200.Lng;
//Console.WriteLine("经度:" + lon + " 纬度:" + lat);
rawText = Encoding.UTF8.GetString(data);
NetPackage netPackage = NetPackage.Parse(rawText, GetUnpackCache);
((NetServer)Server).RaiseReceivedData(this, netPackage, rawText);
if (netPackage.DataSegment.PackageFlag != null && netPackage.DataSegment.PackageFlag.A == 1)
{
Response(netPackage);
}
}
catch (Exception ex)
{
Console.WriteLine($"error :OnReceived:{ex.Message},data:{ex.Data}");
}
}
}
/// <summary>
/// 应答
/// </summary>
private void Response(NetPackage netPackage)
{
try
{
netPackage.DataSegment.ST = DataSegment.ResponseST;
netPackage.DataSegment.CN = CommandNumber.DataResponse;
netPackage.DataSegment.PackageFlag.A = 0;
netPackage.DataSegment.PackageFlag.D = 0;
netPackage.DataSegment.CpCommand.ExeRtn = ResponseCode.ExecSucceeded;
string rawText = netPackage.Serialize();
byte[] data = Encoding.UTF8.GetBytes(rawText);
SendAsync(data);
((NetServer)Server).RaiseSendData(this, netPackage, rawText);
}
catch (Exception ex)
{
throw new Exception("Error in NetSession", ex);
}
}
}
}