130 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			130 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);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |