/// <summary> /// 分析结构 /// </summary> /// <param name="packageInfo">消息包</param> /// <param name="obj">当前对象</param> /// <param name="structure">结构</param> /// <returns></returns> protected byte[] AnalysisStructure(IJTTPackageInfo packageInfo, object obj, StructureInfo structure) { try { if (structure.StructureType == StructureType.empty) { return(Array.Empty <byte>()); } if (structure.StructureType != StructureType.additional && !obj.ContainsProperty(structure.Property.Split('.'))) { throw new JTTException($"在类型 {obj.GetType().FullName}中未找到指定属性 {structure.Property}."); } byte[] value = Array.Empty <byte>(); if (structure.IsCollection) { var list = (IList)obj.GetPropertyValue(structure.Property.Split('.')); var bytes = new List <byte>(); var count = (list?.Count) ?? 0; if (count > 0) { foreach (var item in list) { var item_bytes = Analysis(item); bytes.AddRange(item_bytes); } } //var fieldWithMultiLevel = structure.Collection.CountProperty.Split('.'); //var countProperty = obj.GetProperty(fieldWithMultiLevel); //obj.SetValueToProperty(fieldWithMultiLevel, Convert.ChangeType(count, countProperty.PropertyType)); value = bytes.ToArray(); } else { value = Analysis(obj); } Encrypt(packageInfo, value, structure); return(value); } catch (Exception ex) { throw new JTTException($"分析结构时发生错误, structureId: {structure.Id}.", ex); } byte[] Analysis(object obj) { return(structure.StructureType switch { StructureType.@internal => AnalysisInternalStructure(packageInfo, obj, structure), StructureType.additional => AnalysisAdditionalStructure(packageInfo, obj, structure), _ => AnalysisNormalStructure(obj, structure), }); }
/// <summary> /// 设置消息包 /// </summary> /// <param name="packageInfo">消息包</param> public abstract void SetupPackInfo(IJTTPackageInfo packageInfo);
/// <summary> /// 消息包处理 /// </summary> /// <param name="buffer"></param> /// <returns></returns> async ValueTask PackageHandler(EasyClient <IJTTPackageInfo> sender, IJTTPackageInfo packageInfo) { try { var jtt809PackageInfo = packageInfo as JTT809PackageInfo; switch (jtt809PackageInfo.JTT809MessageHeader.Msg_ID) { case MsgID.LoginReply: var body_LoginReply = jtt809PackageInfo.MessageBody as LoginReplyBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"接收[主链路登录应答信息], " + $"\r\n\tServer: {Config.ServerHost}:{Config.ServerPort}, " + $"\r\n\tResult: {body_LoginReply.Result}, " + $"\r\n\tResult_Mapping: {body_LoginReply.Result_Mapping}, " + $"\r\n\tVerify_Code: {body_LoginReply.Verify_Code}."); break; case MsgID.GetForwardEndpointReply: var body_GetForwardEndpointReply = jtt809PackageInfo.MessageBody as GetForwardEndpointReplyBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"接收[获取转发终端清单请求应答消息], " + $"\r\n\tServer: {Config.ServerHost}:{Config.ServerPort}, " + $"\r\n\tTotal: {body_GetForwardEndpointReply.Total}, " + $"\r\n\tEndpoints: \r\n\t\t{string.Join("\r\n\t\t", (body_GetForwardEndpointReply.Endpoints ?? new System.Collections.Generic.List<ForwardEndpoint>()).Select(o => $"{o.IP}:{o.Port}"))}."); break; case MsgID.ForwardReply: var body_ForwardReply = jtt809PackageInfo.MessageBody as ForwardReplyBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"接收[开始转发应答信息], " + $"\r\n\tServer: {Config.ServerHost}:{Config.ServerPort}, " + $"\r\n\tResult: {body_ForwardReply.Result}, " + $"\r\n\tResult_Mapping: {body_ForwardReply.Result_Mapping}."); break; case MsgID.CancelForwardReply: var body_CancelForwardReply = jtt809PackageInfo.MessageBody as CancelForwardReplyBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"接收[取消转发应答信息], " + $"\r\n\tServer: {Config.ServerHost}:{Config.ServerPort}, " + $"\r\n\tResult: {body_CancelForwardReply.Result}, " + $"\r\n\tResult_Mapping: {body_CancelForwardReply.Result_Mapping}."); break; case MsgID.ForwardErrorBody: var body_ForwardError = jtt809PackageInfo.MessageBody as ForwardErrorBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"接收[转发异常消息], " + $"\r\n\tServer: {Config.ServerHost}:{Config.ServerPort}, " + $"\r\n\tReason: {body_ForwardError.Reason}, " + $"\r\n\tReason_Mapping: {body_ForwardError.Reason_Mapping}."); break; default: Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"接收[其他信息], " + $"\r\n\tServer: {Config.ServerHost}:{Config.ServerPort}, " + $"\r\n\tMsg_ID: {Protocol.JTT809Handler.Decode(Protocol.JTT809Handler.Encode(jtt809PackageInfo.JTT809MessageHeader.Msg_ID, new SuperSocket.JTT.JTTBase.Model.CodeInfo { CodeType = SuperSocket.JTT.JTTBase.Model.CodeType.uint16_hex }), new SuperSocket.JTT.JTTBase.Model.CodeInfo { CodeType = SuperSocket.JTT.JTTBase.Model.CodeType.string_hex })}, " + $"\r\n\tbuffer: {string.Join('\t', jtt809PackageInfo.Buffer.ToArray().Select(o => o.To0XString()))}."); break; } await Task.FromResult(true); } catch (Exception ex) { Logger.Log( NLog.LogLevel.Error, LogType.系统异常, $"处理消息包时异常, " + $"\r\n\tServer: {Config.ServerHost}:{Config.ServerPort}, " + $"\r\n\tbuffer: {string.Join('\t', packageInfo.Buffer.ToArray().Select(o => o.To0XString()))}.", null, ex); await Task.FromResult(false); } }
/// <summary> /// 加密 /// </summary> /// <param name="packageInfo">消息包</param> /// <param name="buffer">数据</param> /// <param name="structure">结构</param> /// <returns></returns> public abstract void Encrypt(IJTTPackageInfo packageInfo, byte[] buffer, StructureInfo structure);
/// <summary> /// 处理消息包 /// </summary> /// <param name="session">会话</param> /// <param name="packageInfo">消息包</param> /// <returns></returns> public static async ValueTask Handler(IAppSession session, IJTTPackageInfo packageInfo) { try { if (!packageInfo.Success) { if (packageInfo.Step > DecoderStep.AnalysisBuffer) { Forward.Add(session.SessionID, session.RemoteEndPoint, packageInfo.HeadFlag.ToArray() .Concat(packageInfo.Buffer.ToArray()) .Concat(packageInfo.Crc_Code.ToArray()) .Concat(packageInfo.EndFlag.ToArray()) .ToArray()); } throw packageInfo.Exception; } var packageInfo_JTT809 = packageInfo as JTT809PackageInfo; switch (packageInfo_JTT809.JTT809MessageHeader.Msg_ID) { case MsgID.LoginRequest: var body_LoginRequest = packageInfo_JTT809.MessageBody as LoginRequestBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"LoginRequest, " + $"\r\n\tUserID: {body_LoginRequest.UserID}, " + $"\r\n\tPassword: {body_LoginRequest.Password}, " + $"\r\n\tMsg_GnsscenterID: {body_LoginRequest.Msg_GnsscenterID}, " + $"\r\n\tDown_link_IP: {body_LoginRequest.Down_link_IP}, " + $"\r\n\tDown_link_Port: {body_LoginRequest.Down_link_Port}."); await AuthenticateHandler.Authenticate(session, body_LoginRequest); break; case MsgID.GetForwardEndpointRequest: var body_GetForwardEndpointRequest = packageInfo_JTT809.MessageBody as GetForwardEndpointRequestBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"GetForwardEndpointRequest."); await Forward.GetClientList(session); break; case MsgID.ForwardRequest: var body_ForwardRequest = packageInfo_JTT809.MessageBody as ForwardRequestBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"ForwardRequest, " + $"\r\n\tTarget_IP: {body_ForwardRequest.Target_IP}, " + $"\r\n\tTarget_Port: {body_ForwardRequest.Target_Port}."); await Forward.Add(session, body_ForwardRequest.Target_IP, body_ForwardRequest.Target_Port); break; case MsgID.CancelForwardRequest: var body_CancelForwardRequest = packageInfo_JTT809.MessageBody as CancelForwardRequestBody; Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"CancelForwardRequest."); await Forward.Remove(session); break; default: Logger.Log( NLog.LogLevel.Trace, LogType.系统跟踪, $"\r\n\tMsg_ID: {Protocol.JTT809Handler.Decode(Protocol.JTT809Handler.Encode(packageInfo_JTT809.JTT809MessageHeader.Msg_ID, new CodeInfo { CodeType = CodeType.uint16_hex }), new CodeInfo { CodeType = CodeType.string_hex })}"); Forward.Add( session.SessionID, session.RemoteEndPoint, packageInfo.HeadFlag.ToArray() .Concat(packageInfo.Buffer.ToArray()) .Concat(packageInfo.Crc_Code.ToArray()) .Concat(packageInfo.EndFlag.ToArray()) .ToArray()); break; } } catch (Exception ex) { Logger.Log( NLog.LogLevel.Error, LogType.系统异常, $"处理消息包时异常, " + $"\r\n\tSessionID: {session.SessionID}, " + $"\r\n\tBuffer: {string.Join('\t', packageInfo.Buffer.ToArray().Select(o => o.To0XString()))}.", null, ex); } }
/// <summary> /// 发送消息 /// </summary> /// <param name="session"></param> /// <param name="packageInfo">消息包</param> /// <returns></returns> public static async ValueTask SendAsync(this IAppSession session, IJTTPackageInfo packageInfo) { await session.SendAsync(Protocol.Encoder, packageInfo); }
/// <summary> /// 发送消息 /// </summary> /// <param name="sessionID"></param> /// <param name="packageInfo">消息包</param> /// <returns></returns> public static async ValueTask SendAsync(this string sessionID, IJTTPackageInfo packageInfo) { await SessionContainer.GetSessionByID(sessionID).SendAsync(packageInfo); }
/// <summary> /// 计算Crc校验码 /// </summary> /// <param name="info"></param> /// <returns></returns> public virtual void ComputeCrcCode(IJTTPackageInfo info) { var crc = ComputeCrcValue(info.Buffer.ToArray()); info.Crc_Code = new ReadOnlyMemory <byte>(crc); }
/// <summary> /// 分析结构 /// </summary> /// <param name="packageInfo">消息包</param> /// <returns></returns> public abstract byte[] Analysis(IJTTPackageInfo packageInfo);