private void PacketReceivingThread() { try { while (_running) { var datapacket = new DataPacket(DefaultCodec); datapacket.ReadFromStream(_rawReadCodec, RemoteBoundTo, () => CompressThreshold, () => State); if (!PacketProvider.TryCreatePacket(datapacket.PacketId, datapacket.BoundTo, datapacket.State, out var packet) && ((packet = OnUnknownPacketReceived(datapacket)) is DataPacket || packet is null)) { _logger.Warn($"Unknown packet 0x{datapacket.PacketId:X2}"); continue; } packet.ReadFromStream(datapacket.Content); if (!OnPacketReceived(packet)) { continue; } lock (_receivePacketQueue) { _receivePacketQueue.Enqueue(packet); if (_waitReceiveCount != 0) { Monitor.Pulse(_receivePacketQueue); } } } } catch (EndOfStreamException) { _receivePacketQueue.Enqueue(null); } catch (Exception ex) { _logger.Error(ex); ExceptionOccurred?.Invoke(this, ex); } finally { lock (_receivePacketQueue) { if (_waitReceiveCount != 0) { Monitor.PulseAll(_receivePacketQueue); } } _running = false; State = ProtocolState.Closed; } }
static void Main(string[] args) { IPacketProvider pConvert = PacketProvider.CreateProvider(); string phone = "18212001111"; //终端连接鉴权平台回复通用应答 byte[] body = new REQ_PB_8001().Encode(new PB8001() { MessageId = JT808Cmd.RSP_0102, Serialnumber = 0, Result = 0 }); byte[] buffer = pConvert.Encode(new PacketFrom() { msgBody = body, msgId = JT808Cmd.REQ_8001, msgSerialnumber = 0, pEncryptFlag = 0, pSerialnumber = 1, pSubFlag = 0, pTotal = 1, simNumber = phone.ToBCD(), }); //解析终端发回的数据包 PacketMessage msg = pConvert.Decode(buffer, 0, buffer.Length); //解析消息体内容 if (msg.pmPacketHead.phMessageId == JT808Cmd.RSP_0102) { PB0102 bodyInfo = new REP_PB_0102().Decode(msg.pmMessageBody); } else if (msg.pmPacketHead.phMessageId == JT808Cmd.RSP_0100) { PB0100 bodyinfo = new REP_PB_0100().Decode(msg.pmMessageBody); } }
public PacketDumpProcessor(PacketProvider packetProvider) { _packetProvider = packetProvider; InitFakeGame(); }