protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg) { try { //解析到头部,然后根据具体的消息Id通过队列去进行消费 //要是一定要解析到数据体可以在JT808MsgIdHandlerBase类中根据具体的消息, //解析具体的消息体,具体调用JT808Serializer.Deserialize<T> JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize <JT808HeaderPackage>(msg); if (logger.IsEnabled(LogLevel.Trace)) { logger.LogTrace($"accept package success count=>{jT808AtomicCounterService.MsgSuccessCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg)}"); } jT808AtomicCounterService.MsgSuccessIncrement(); jT808SessionManager.TryAdd(jT808HeaderPackage.Header.TerminalPhoneNo, ctx.Channel); JT808MsgProducer.ProduceAsync(jT808HeaderPackage.Header.TerminalPhoneNo, msg); } catch (JT808Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError(ex, $"accept package fail count=>{jT808AtomicCounterService.MsgFailCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg)}"); } } catch (Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError(ex, $"accept package fail count=>{jT808AtomicCounterService.MsgFailCount.ToString()},accept msg=>{ByteBufferUtil.HexDump(msg)}"); } } }
/// <summary> /// 重写消息处理器 /// </summary> /// <param name="request"></param> /// <param name="session"></param> public override byte[] Processor(JT808HeaderPackage request, IUnionSession session) { //AOP 可以自定义添加一些东西:上下行日志、数据转发 logger.LogDebug("可以自定义添加一些东西:上下行日志、数据转发"); //流量 jT808Traffic.Increment(request.Header.TerminalPhoneNo, DateTime.Now.ToString("yyyyMMdd"), request.OriginalData.Length); var parameter = (request.Header.TerminalPhoneNo, request.OriginalData.ToArray()); //转发数据(可同步也可以使用队列进行异步) try { jT808TransmitService.SendAsync(parameter); } catch (Exception ex) { logger.LogError(ex, ""); } //上行日志(可同步也可以使用队列进行异步) jT808MsgLogging.Processor(parameter, UnionMsgLoggingType.up); //处理上行消息 var down = base.Processor(request, session); //下行日志(可同步也可以使用队列进行异步) jT808MsgLogging.Processor((request.Header.TerminalPhoneNo, down), UnionMsgLoggingType.down); return(down); }
/// <summary> /// 平台通用应答 /// </summary> /// <param name="request"></param> /// <param name="session"></param> public virtual byte[] CommonReply(JT808HeaderPackage request, IJT808Session session) { if (request.Version == JT808Version.JTT2019) { byte[] data = JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create_平台通用应答_2019(request.Header.TerminalPhoneNo, new JT808_0x8001() { AckMsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); session.SendAsync(data); return(data); } else { byte[] data = JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() { AckMsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); session.SendAsync(data); return(data); } }
/// <summary> /// 重写自带的消息 /// </summary> /// <param name="request"></param> /// <param name="session"></param> public override byte[] Msg0x0200(JT808HeaderPackage request, IJT808Session session) { logger.LogDebug("重写自带Msg0x0200的消息"); var data = base.Msg0x0200(request, session); logger.LogDebug("往应答服务发送相同数据进行测试"); MsgReplyProducer.ProduceAsync(request.Header.TerminalPhoneNo, data).ConfigureAwait(false); return(data); }
protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg) { try { jT808SourcePackageDispatcher.SendAsync(msg); jT808UplinkPacket.ProcessorAsync(msg, JT808TransportProtocolType.tcp); //解析到头部,然后根据具体的消息Id通过队列去进行消费 //要是一定要解析到数据体可以在JT808MsgIdHandlerBase类中根据具体的消息, //解析具体的消息体,具体调用JT808Serializer.Deserialize<T> JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize <JT808HeaderPackage>(msg); jT808AtomicCounterService.MsgSuccessIncrement(); jT808TrafficService.ReceiveSize(msg.Length); if (logger.IsEnabled(LogLevel.Trace)) { logger.LogTrace("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); logger.LogTrace("accept msg <<< " + ByteBufferUtil.HexDump(msg)); } jT808SessionManager.TryAdd(jT808HeaderPackage.Header.TerminalPhoneNo, ctx.Channel); if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out var handlerFunc)) { IJT808Reply jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg)); if (jT808Response != null) { if (!jT808TransmitAddressFilterService.ContainsKey(ctx.Channel.RemoteAddress)) { ctx.WriteAndFlushAsync(jT808Response); } } } else { //未知的消息类型已日志形式输出 if (unknownLogger.IsEnabled(LogLevel.Debug)) { unknownLogger.LogDebug(ByteBufferUtil.HexDump(msg)); } } } catch (JT808.Protocol.Exceptions.JT808Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg)); } } catch (Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg)); } } }
/// <summary> /// /// </summary> /// <param name="request">请求数据</param> /// <param name="session">当前会话</param> /// <returns>应答消息数据</returns> public virtual byte[] Processor(JT808HeaderPackage request, IJT808Session session) { if (HandlerDict.TryGetValue(request.Header.MsgId, out var func)) { return(func(request, session)); } else { //处理不了的消息统一回复通用应答 return(CommonReply(request, session)); } }
/// <summary> /// 消息处理 /// </summary> /// <param name="request">请求数据</param> /// <param name="session">当前会话</param> /// <returns>应答消息数据</returns> public virtual byte[] Processor(JT808HeaderPackage request, IJT808Session session) { if (HandlerDict.TryGetValue(request.Header.MsgId, out var func)) { if (JT808ConfigurationOptionsMonitor.CurrentValue.FilterMsgIdHandlerForQueue != null) { // 网关不做消息业务处理,往队列发送 if (JT808ConfigurationOptionsMonitor.CurrentValue.FilterMsgIdHandlerForQueue.Contains(request.Header.MsgId)) { if (MsgProducer != null) { MsgProducer.ProduceAsync(request.Header.TerminalPhoneNo, request.OriginalData.ToArray()); } return(default);
protected override void ChannelRead0(IChannelHandlerContext ctx, byte[] msg) { try { jT808SourcePackageDispatcher?.SendAsync(msg); //解析到头部,然后根据具体的消息Id通过队列去进行消费 //要是一定要解析到数据体可以在JT808MsgIdHandlerBase类中根据具体的消息, //解析具体的消息体,具体调用JT808Serializer.Deserialize<T> JT808HeaderPackage jT808HeaderPackage = JT808Serializer.Deserialize <JT808HeaderPackage>(msg); jT808AtomicCounterService.MsgSuccessIncrement(); jT808TrafficService.ReceiveSize(msg.Length); if (logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug("accept package success count<<<" + jT808AtomicCounterService.MsgSuccessCount.ToString()); } jT808SessionManager.TryAdd(jT808HeaderPackage.Header.TerminalPhoneNo, ctx.Channel); Func <JT808Request, JT808Response> handlerFunc; if (handler.HandlerDict.TryGetValue(jT808HeaderPackage.Header.MsgId, out handlerFunc)) { JT808Response jT808Response = handlerFunc(new JT808Request(jT808HeaderPackage, msg)); if (jT808Response != null) { if (!jT808TransmitAddressFilterService.ContainsKey(ctx.Channel.RemoteAddress)) { var sendData = JT808Serializer.Serialize(jT808Response.Package, jT808Response.MinBufferSize); jT808TrafficService.SendSize(sendData.Length); ctx.WriteAndFlushAsync(Unpooled.WrappedBuffer(sendData)); } } } } catch (JT808.Protocol.Exceptions.JT808Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg)); } } catch (Exception ex) { jT808AtomicCounterService.MsgFailIncrement(); if (logger.IsEnabled(LogLevel.Error)) { logger.LogError("accept package fail count<<<" + jT808AtomicCounterService.MsgFailCount.ToString()); logger.LogError(ex, "accept msg<<<" + ByteBufferUtil.HexDump(msg)); } } }
public void Package3() { byte[] bytes = "7e080123000138123456782032000a000205060708090a0bffc400b5100002010303020403050504040000017d0101020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffdd00040000ffda000c03010002110311003f006c6a2a755ce299a5c942e0f35281c5004aa72314a54e38a07b8841ef4840a0673de21b4ff498ee402038dade991fe7f4acc110f4a0cd8ef2f1405cd01d45f2e9360a062edc5745616a6dad511861cfccff0053499512e056cf1460e3348a0ed4b8e338fc2819cb5edbfd9ee648b18556f97fdd3d3f4aafb4d332ea433a6573e9550d3131d18c9c558031c0a4083a503039a60c42c2984e4f4a06260d370690098ef4751400c615132d021868a621431a33480ef235e05595403eb54cbb0b8e7069dc0e3a9a41b12a024f4a9d40f4a18c5651e951c88179268194ee614b989a2719461ffea35cfdcda4b6b2ed71c1e55874345c96ba91819a704c50217613db349b39031c9e945c66a69ba794713cebf30fb8be9ee6b540c1e948a48760e3a526d2dc77a0a144471d297cb623a71484646bb685234b81d01d8e7d018f43f9ff003ac16386c552225b8300c2a84c8c8c4ed247b502616cc0517e".ToHexBytes(); JT808HeaderPackage jT808_0X0801 = JT808Serializer.HeaderDeserialize(bytes); }
public JT808Request(JT808HeaderPackage package, byte[] originalPackage) { Package = package; OriginalPackage = originalPackage; }
/// <summary> /// 自定义消息 /// </summary> /// <param name="request"></param> /// <returns></returns> public byte[] Msg0x9999(JT808HeaderPackage request, IJT808Session session) { logger.LogDebug("自定义消息"); return(default);
/// <summary> /// 重写自带的消息 /// </summary> /// <param name="request"></param> /// <param name="session"></param> public override byte[] Msg0x0200(JT808HeaderPackage request, IJT808Session session) { logger.LogDebug("重写自带Msg0x0200的消息"); return(base.Msg0x0200(request, session)); }
/// <summary> /// 终端通用应答 /// 平台无需回复 /// 实现自己的业务 /// </summary> /// <param name="request"></param> /// <returns></returns> public virtual byte[] Msg0x0001(JT808HeaderPackage request, IJT808Session session) { return(default);
/// <summary> /// 重写自带的消息 /// </summary> /// <param name="request"></param> /// <param name="session"></param> public override byte[] Msg0x0200(JT808HeaderPackage request, IJT808Session session) { //logger.LogDebug("重写自带Msg0x0200的消息"); logger.LogDebug($"重写自带Msg0x0200的消息{request.Header.TerminalPhoneNo}-{request.OriginalData.ToArray().ToHexString()}"); return(base.Msg0x0200(request, session)); }
/// <summary> /// 自定义消息 /// </summary> /// <param name="request"></param> /// <returns></returns> public byte[] Msg0x9999(JT808HeaderPackage request) { return(default);
/// <summary> /// 重写消息 /// </summary> /// <param name="request"></param> /// <returns></returns> public override byte[] Msg0x0001(JT808HeaderPackage request) { return(base.Msg0x0001(request)); }