Ejemplo n.º 1
0
        /// <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),
                });
            }
Ejemplo n.º 2
0
 /// <summary>
 /// 设置消息包
 /// </summary>
 /// <param name="packageInfo">消息包</param>
 public abstract void SetupPackInfo(IJTTPackageInfo packageInfo);
Ejemplo n.º 3
0
        /// <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);
            }
        }
Ejemplo n.º 4
0
 /// <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);
Ejemplo n.º 5
0
        /// <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);
            }
        }
Ejemplo n.º 6
0
 /// <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);
 }
Ejemplo n.º 7
0
 /// <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);
 }
Ejemplo n.º 8
0
        /// <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);
        }
Ejemplo n.º 9
0
 /// <summary>
 /// 分析结构
 /// </summary>
 /// <param name="packageInfo">消息包</param>
 /// <returns></returns>
 public abstract byte[] Analysis(IJTTPackageInfo packageInfo);