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); } }
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); } }
/// <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); }
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); } }