using DotNetty.Buffers;
using DotNetty.Handlers.Timeout;
using DotNetty.Transport.Channels;
using JT809.DotNetty.Core.Metadata;
using JT809.Protocol;
using JT809.Protocol.Enums;
using JT809.Protocol.Extensions;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace JT809.DotNetty.Core.Handlers
{
///
/// JT809主链路服务端连接处理器
///
public class JT809MainServerConnectionHandler : ChannelHandlerAdapter
{
private readonly ILogger logger;
public JT809MainServerConnectionHandler(
ILoggerFactory loggerFactory)
{
logger = loggerFactory.CreateLogger();
}
///
/// 通道激活
///
///
public override void ChannelActive(IChannelHandlerContext context)
{
string channelId = context.Channel.Id.AsShortText();
if (logger.IsEnabled(LogLevel.Debug))
logger.LogDebug($"<<<{ channelId } Successful client connection to server.");
base.ChannelActive(context);
}
///
/// 客户端主动断开
///
///
public override void ChannelInactive(IChannelHandlerContext context)
{
string channelId = context.Channel.Id.AsShortText();
if (logger.IsEnabled(LogLevel.Debug))
logger.LogDebug($">>>{ channelId } The client disconnects from the server.");
base.ChannelInactive(context);
}
///
/// 服务器主动断开
///
///
///
public override Task CloseAsync(IChannelHandlerContext context)
{
string channelId = context.Channel.Id.AsShortText();
if (logger.IsEnabled(LogLevel.Debug))
logger.LogDebug($"<<<{ channelId } The server disconnects from the client.");
return base.CloseAsync(context);
}
public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush();
///
/// 超时策略
///
///
///
public override void UserEventTriggered(IChannelHandlerContext context, object evt)
{
IdleStateEvent idleStateEvent = evt as IdleStateEvent;
if (idleStateEvent != null)
{
if (idleStateEvent.State == IdleState.WriterIdle)
{
string channelId = context.Channel.Id.AsShortText();
logger.LogInformation($"{idleStateEvent.State.ToString()}>>>Heartbeat-{channelId}");
//发送主链路保持请求数据包
var package = JT809BusinessType.主链路连接保持请求消息.Create();
JT809Response jT809Response = new JT809Response(package, 100);
context.WriteAndFlushAsync(jT809Response);
}
}
base.UserEventTriggered(context, evt);
}
public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)
{
string channelId = context.Channel.Id.AsShortText();
logger.LogError(exception, $"{channelId} {exception.Message}");
context.CloseAsync();
}
}
}