private T Decode <T>(string hex) where T : AaMiDeMessage { var data = HexEncoding.HexToByte(hex.Replace(" ", String.Empty)); var rfpConnectionTracker = _reassembler.Get(new RfpIdentifier(new byte[6])); if (data.Length >= 7) { var mac = rfpConnectionTracker.Get(data[6]); if (!mac.IsConnected) { mac.Open(new MacConIndPayload(new byte[4])); } } var message = AaMiDeMessage.Create(data, rfpConnectionTracker); return(Assert.IsType <T>(message)); }
public void OnMessage(MessageDirection direction, RfpIdentifier rfp, ReadOnlyMemory <byte> data, DateTimeOffset timestamp) { if (data.IsEmpty) { return; } AaMiDeMessage message; string prefix; MacConnectionTracker reassembler; if (direction == MessageDirection.FromOmm) { reassembler = _ommTracker; prefix = "OMM:"; } else { reassembler = _rfpTracker; prefix = "RFP:"; } try { message = AaMiDeMessage.Create(data, reassembler.Get(rfp)); } catch (Exception ex) { Console.WriteLine($"{timestamp:yyyy/MM/dd HH:mm:ss.fff} {prefix}{rfp} Cannot parse {data.ToHex()}"); Console.WriteLine(ex); return; } if (message is DnmMessage dnm) { if (dnm.Payload is MacDisIndPayload || dnm.DnmType == DnmType.MacDisReq) { RfpConnectionTracker rfpTracker; if (direction == MessageDirection.FromOmm) { rfpTracker = _rfpTracker.Get(rfp); } else { rfpTracker = _ommTracker.Get(rfp); } var nwk = rfpTracker.Get(dnm.MCEI); nwk.Close(); } else if (dnm.Payload is MacConIndPayload macConInd) { RfpConnectionTracker rfpTracker; if (direction == MessageDirection.FromOmm) { rfpTracker = _rfpTracker.Get(rfp); } else { rfpTracker = _ommTracker.Get(rfp); } var nwk = rfpTracker.Get(dnm.MCEI); nwk.Open(macConInd); } } if (_unknown && !message.HasUnknown) { return; } Console.Write($"{timestamp:yyyy/MM/dd HH:mm:ss.fff} {prefix}{rfp} "); message.Log(Console.Out); Console.WriteLine(); if (_logRaw) { Console.Write("\t"); int i = 0; var span = data.Span; for (; i < span.Length - 4; i += 4) { Console.Write(span.Slice(i, 4).ToHex()); Console.Write(' '); } Console.WriteLine(span.Slice(i).ToHex()); } return; }