using JT808.Gateway; using JT808.Gateway.PubSub; using JT808.Gateway.Services; using JT808.Protocol; using JT808.Protocol.Enums; using JT808.Protocol.Extensions; using JT808.Protocol.MessageBody; using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; namespace JT808.Gateway.Impls { internal class JT808MsgReplyConsumerDefaultImpl : IJT808MsgReplyConsumer { private readonly JT808MsgService JT808MsgService; private readonly JT808Serializer JT808Serializer; private Dictionary> HandlerDict; public JT808MsgReplyConsumerDefaultImpl( IJT808Config jT808Config, JT808MsgService jT808MsgService) { JT808MsgService = jT808MsgService; this.JT808Serializer = jT808Config.GetSerializer(); HandlerDict = new Dictionary> { {JT808MsgId.终端通用应答.ToUInt16Value(), Msg0x0001}, {JT808MsgId.终端鉴权.ToUInt16Value(), Msg0x0102}, {JT808MsgId.终端心跳.ToUInt16Value(), Msg0x0002}, {JT808MsgId.终端注销.ToUInt16Value(), Msg0x0003}, {JT808MsgId.终端注册.ToUInt16Value(), Msg0x0100}, {JT808MsgId.位置信息汇报.ToUInt16Value(),Msg0x0200 }, {JT808MsgId.定位数据批量上传.ToUInt16Value(),Msg0x0704 }, {JT808MsgId.数据上行透传.ToUInt16Value(),Msg0x0900 } }; } public CancellationTokenSource Cts =>new CancellationTokenSource(); public string TopicName => JT808GatewayConstants.MsgReplyTopic; public void Dispose() { Cts.Dispose(); } public void OnMessage(Action<(string TerminalNo, byte[] Data)> callback) { Task.Run(() => { foreach(var item in JT808MsgService.MsgQueue.GetConsumingEnumerable()) { try { var package = JT808Serializer.HeaderDeserialize(item.Data); if (HandlerDict.TryGetValue(package.Header.MsgId, out var func)) { var buffer = func(package); if (buffer != null) { callback((item.TerminalNo, buffer)); } } } catch (Exception ex) { } } }, Cts.Token); } public void Subscribe() { } public void Unsubscribe() { Cts.Cancel(); } /// /// 终端通用应答 /// 平台无需回复 /// 实现自己的业务 /// /// /// public byte[] Msg0x0001(JT808HeaderPackage request) { return null; } /// /// 终端心跳 /// /// /// public byte[] Msg0x0002(JT808HeaderPackage request) { return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() { MsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); } /// /// 终端注销 /// /// /// public byte[] Msg0x0003(JT808HeaderPackage request) { return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() { MsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); } /// /// 终端注册 /// /// /// public byte[] Msg0x0100(JT808HeaderPackage request) { return JT808Serializer.Serialize(JT808MsgId.终端注册应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8100() { Code = "J" + request.Header.TerminalPhoneNo, JT808TerminalRegisterResult = JT808TerminalRegisterResult.成功, MsgNum = request.Header.MsgNum })); } /// /// 终端鉴权 /// /// /// public byte[] Msg0x0102(JT808HeaderPackage request) { return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() { MsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); } /// /// 位置信息汇报 /// /// /// public byte[] Msg0x0200(JT808HeaderPackage request) { return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() { MsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); } /// /// 定位数据批量上传 /// /// /// public byte[] Msg0x0704(JT808HeaderPackage request) { return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() { MsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); } /// /// 数据上行透传 /// /// /// public byte[] Msg0x0900(JT808HeaderPackage request) { return JT808Serializer.Serialize(JT808MsgId.平台通用应答.Create(request.Header.TerminalPhoneNo, new JT808_0x8001() { MsgId = request.Header.MsgId, JT808PlatformResult = JT808PlatformResult.成功, MsgNum = request.Header.MsgNum })); } } }