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(); } /// /// 获取分包缓存 /// /// private StringBuilder GetUnpackCache() { return _unpackCache ??= new StringBuilder(); } /// /// /// 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}"); } } } /// /// 应答 /// 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); } } } }