protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg)
 {
     try
     {
         JT809Package jT809Package = JT809Serializer.Deserialize(msg);
         jT809AtomicCounterService.MsgSuccessIncrement();
         if (logger.IsEnabled(LogLevel.Debug))
         {
             logger.LogDebug("accept package success count<<<" + jT809AtomicCounterService.MsgSuccessCount.ToString());
         }
         Func <JT809Request, JT809Response> handlerFunc;
         if (handler.HandlerDict.TryGetValue(jT809Package.Header.BusinessType, out handlerFunc))
         {
             JT809Response jT808Response = handlerFunc(new JT809Request(jT809Package, msg));
             if (jT808Response != null)
             {
                 ctx.WriteAndFlushAsync(jT808Response);
             }
         }
     }
     catch (JT809Exception ex)
     {
         jT809AtomicCounterService.MsgFailIncrement();
         logger.LogError("accept package fail count<<<" + jT809AtomicCounterService.MsgFailCount.ToString());
         logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg));
     }
     catch (Exception ex)
     {
         jT809AtomicCounterService.MsgFailIncrement();
         logger.LogError("accept package fail count<<<" + jT809AtomicCounterService.MsgFailCount.ToString());
         logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg));
     }
 }
 public void Notify(JT809_0x9007_ReasonCode reasonCode, uint msgGNSSCENTERID)
 {
     if (configuration.SubordinateClientEnable)
     {
         var session = jT809SuperiorMainSessionManager.GetSession(msgGNSSCENTERID);
         if (session != null)
         {
             //发送从链路注销请求
             var package = JT809BusinessType.从链路断开通知消息.Create(new JT809_0x9007()
             {
                 ReasonCode = reasonCode
             });
             package.Header.MsgGNSSCENTERID = msgGNSSCENTERID;
             package.Header.Version         = JT809HeaderOptions.Version;
             package.Header.EncryptKey      = JT809HeaderOptions.EncryptKey;
             package.Header.EncryptFlag     = JT809HeaderOptions.EncryptFlag;
             JT809Response jT809Response = new JT809Response(package, 100);
             if (logger.IsEnabled(LogLevel.Information))
             {
                 logger.LogInformation($"从链路断开通知消息>>>{JT809Serializer.Serialize(package, 100).ToHexString()}");
             }
             session.Channel.WriteAndFlushAsync(jT809Response);
         }
     }
 }
        public async void ConnectAsync(string ip, int port, int delay = 3000)
        {
            var verifyCode = verifyCodeGenerator.Get();

            if (logger.IsEnabled(LogLevel.Information))
            {
                logger.LogInformation($"ip:{ip},port:{port},verifycode:{verifyCode}");
            }
            await Task.Delay(delay);

            try
            {
                if (channel == null)
                {
                    channel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(ip), port));

                    //从链路连接请求消息
                    var package = JT809BusinessType.从链路连接请求消息.Create(new JT809_0x9001()
                    {
                        VerifyCode = verifyCode
                    });
                    if (logger.IsEnabled(LogLevel.Information))
                    {
                        logger.LogInformation($"从链路连接请求消息>>>{JT809Serializer.Serialize(package, 100).ToHexString()}");
                    }
                    JT809Response jT809Response = new JT809Response(package, 100);
                    SendAsync(jT809Response);
                }
                else
                {
                    await channel.CloseAsync();

                    channel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(ip), port));

                    //从链路连接请求消息
                    var package = JT809BusinessType.从链路连接请求消息.Create(new JT809_0x9001()
                    {
                        VerifyCode = verifyCode
                    });
                    if (logger.IsEnabled(LogLevel.Information))
                    {
                        logger.LogInformation($"从链路连接请求消息>>>{JT809Serializer.Serialize(package, 100).ToHexString()}");
                    }
                    JT809Response jT809Response = new JT809Response(package, 100);
                    SendAsync(jT809Response);
                }
            }
            catch (ConnectException ex)
            {
                subordinateLinkNotifyService.Notify(JT809_0x9007_ReasonCode.无法连接下级平台指定的服务IP与端口);
                logger.LogError(ex.InnerException, $"ip:{ip},port:{port},verifycode:{verifyCode}");
            }
            catch (Exception ex)
            {
                subordinateLinkNotifyService.Notify(JT809_0x9007_ReasonCode.其他原因);
                logger.LogError(ex, $"ip:{ip},port:{port},verifycode:{verifyCode}");
            }
        }
 public async void SendAsync(JT809Response jT809Response)
 {
     if (channel == null)
     {
         throw new NullReferenceException("Channel Not Open");
     }
     if (jT809Response == null)
     {
         throw new ArgumentNullException("Data is null");
     }
     if (channel.Open && channel.Active)
     {
         await channel.WriteAndFlushAsync(jT809Response);
     }
 }
Exemple #5
0
 public async void SendAsync(JT809Response jT809Response)
 {
     if (disposed)
     {
         return;
     }
     if (channel == null)
     {
         throw new NullReferenceException("Channel Not Open");
     }
     if (jT809Response == null)
     {
         throw new ArgumentNullException("Data is null");
     }
     try
     {
         if (channel.Open && channel.Active)
         {
             manualResetEvent.Pause();
             await channel.WriteAndFlushAsync(jT809Response);
         }
         else
         {
             manualResetEvent.Reset();
             _ = Policy.HandleResult(channel.Open && channel.Active)
                 .WaitAndRetryForeverAsync(retryAttempt =>
             {
                 return(TimeSpan.FromSeconds(10));
             }, (exception, timespan, ctx) =>
             {
                 logger.LogError($"服务端断开{channel.RemoteAddress},重试结果{exception.Result},重试次数{timespan},下次重试间隔(s){ctx.TotalSeconds}");
             })
                 .ExecuteAsync(async() =>
             {
                 channel     = await bootstrap.ConnectAsync(iPEndPoint);
                 var package = Protocol.Enums.JT809BusinessType.主链路登录请求消息.Create(_jT809_0x1001);
                 await channel.WriteAndFlushAsync(new JT809Response(package, 256));
                 logger.LogInformation("尝试重连,等待登录应答结果...");
                 manualResetEvent.Pause();
                 return(await Task.FromResult(channel.Open && channel.Active));
             });
         }
     }
     catch (ClosedChannelException ex)
     {
         logger.LogError(ex.Message);
     }
 }
Exemple #6
0
 /// <summary>
 /// 超时策略
 /// </summary>
 /// <param name="context"></param>
 /// <param name="evt"></param>
 public override void UserEventTriggered(IChannelHandlerContext context, object evt)
 {
     if (evt is IdleStateEvent idleStateEvent)
     {
         if (idleStateEvent.State == IdleState.WriterIdle)
         {
             string channelId = context.Channel.Id.AsShortText();
             logger.LogInformation($"{idleStateEvent.State}>>>Heartbeat-{channelId}");
             //发送主链路保持请求数据包
             var           package       = JT809BusinessType.主链路连接保持请求消息.Create();
             JT809Response jT809Response = new JT809Response(package, 256);
             context.WriteAndFlushAsync(jT809Response);
         }
     }
     base.UserEventTriggered(context, evt);
 }
 /// <summary>
 /// 超时策略
 /// </summary>
 /// <param name="context"></param>
 /// <param name="evt"></param>
 public override void UserEventTriggered(IChannelHandlerContext context, object evt)
 {
     if (evt is IdleStateEvent idleStateEvent)
     {
         if (idleStateEvent.State == IdleState.WriterIdle)
         {
             string channelId = context.Channel.Id.AsShortText();
             //发送从链路保持请求数据包
             var           package       = JT809BusinessType.从链路连接保持请求消息.Create();
             JT809Response jT809Response = new JT809Response(package, 256);
             if (logger.IsEnabled(LogLevel.Information))
             {
                 logger.LogInformation($"{idleStateEvent.State}>>>Heartbeat-{channelId}-{serializer.Serialize(package, 256).ToHexString()}");
             }
             context.WriteAndFlushAsync(jT809Response);
             //context.WriteAndFlushAsync(Unpooled.WrappedBuffer(JT809Serializer.Serialize(package,100)));
         }
     }
     base.UserEventTriggered(context, evt);
 }
Exemple #8
0
 protected override async void ChannelRead0(IChannelHandlerContext ctx, byte[] msg)
 {
     try
     {
         JT809Package jT809Package = JT809Serializer.Deserialize(msg);
         jT809AtomicCounterService.MsgSuccessIncrement();
         if (logger.IsEnabled(LogLevel.Debug))
         {
             logger.LogDebug("accept package success count<<<" + jT809AtomicCounterService.MsgSuccessCount.ToString());
         }
         SuperiorMainSessionManager.TryAdd(ctx.Channel, jT809Package.Header.MsgGNSSCENTERID);
         Func <JT809Request, JT809Response> handlerFunc;
         if (handler.HandlerDict.TryGetValue(jT809Package.Header.BusinessType, out handlerFunc))
         {
             JT809Response jT808Response = handlerFunc(new JT809Request(jT809Package, msg));
             if (jT808Response != null)
             {
                 var sendData = JT809Serializer.Serialize(jT808Response.Package, jT808Response.MinBufferSize);
                 await ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(sendData));
             }
         }
     }
     catch (JT809Exception ex)
     {
         jT809AtomicCounterService.MsgFailIncrement();
         if (logger.IsEnabled(LogLevel.Error))
         {
             logger.LogError("accept package fail count<<<" + jT809AtomicCounterService.MsgFailCount.ToString());
             logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg));
         }
     }
     catch (Exception ex)
     {
         jT809AtomicCounterService.MsgFailIncrement();
         if (logger.IsEnabled(LogLevel.Error))
         {
             logger.LogError("accept package fail count<<<" + jT809AtomicCounterService.MsgFailCount.ToString());
             logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg));
         }
     }
 }
 private void Dispose(bool disposing)
 {
     if (disposed)
     {
         return;
     }
     if (disposing)
     {
         try
         {
             //发送从链路注销请求
             var package = JT809BusinessType.从链路注销请求消息.Create(new JT809_0x9003()
             {
                 VerifyCode = verifyCodeGenerator.Get()
             });
             JT809Response jT809Response = new JT809Response(package, 100);
             if (logger.IsEnabled(LogLevel.Information))
             {
                 logger.LogInformation($"发送从链路注销请求>>>{JT809Serializer.Serialize(package, 100).ToHexString()}");
             }
             SendAsync(jT809Response);
         }
         catch (Exception ex)
         {
             logger.LogError(ex, "发送从链路注销请求");
         }
         finally
         {
             //清理托管资源
             channel.CloseAsync();
             group.ShutdownGracefullyAsync(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(3));
         }
     }
     //让类型知道自己已经被释放
     disposed = true;
 }
        public async Task <bool> ReConnectAsync(EndPoint ipEndPoint)
        {
            var verifyCode = verifyCodeGenerator.Get();

            try
            {
                if (logger.IsEnabled(LogLevel.Information))
                {
                    logger.LogInformation($"IPAddress:{ipEndPoint.ToString()},verifycode:{verifyCode}");
                }
                channel = await bootstrap.ConnectAsync(ipEndPoint);

                //从链路连接请求消息
                var package = JT809BusinessType.从链路连接请求消息.Create(new JT809_0x9001()
                {
                    VerifyCode = verifyCode
                });
                if (logger.IsEnabled(LogLevel.Information))
                {
                    logger.LogInformation($"从链路连接请求消息>>>{JT809Serializer.Serialize(package, 100).ToHexString()}");
                }
                JT809Response jT809Response = new JT809Response(package, 100);
                SendAsync(jT809Response);
                return(channel.Open);
            }
            catch (ConnectException ex)
            {
                logger.LogError(ex.InnerException, $"IPAddress:{ipEndPoint.ToString()},verifycode:{verifyCode}");
                return(false);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"IPAddress:{ipEndPoint.ToString()},verifycode:{verifyCode}");
                return(false);
            }
        }