protected override Task OnMessageAsync(MessageDirection direction, uint messageId, RfpIdentifier rfp, Memory <byte> data, CancellationToken cancellationToken) { try { var length = data.Span[15]; if (length == 8) { var iedata = data.Slice(16); var ie = new NwkIePortableIdentity(iedata); if (ie.IdentityType == NwkIePortableIdentity.PortableIdentityType.IPUI) { var ipui = ie.Ipui; if (ipui.Put == NwkIePortableIdentity.IPUITypeCoding.O) { if (direction == MessageDirection.FromOmm) { var emc = (ushort)(ipui.Number >> 20); if (EMCs.Contains(emc)) { Console.WriteLine(data.ToHex()); var span = iedata.Span; span[2] = (byte)(0x10 | (emc >> 12)); span[3] = (byte)(0xff & (emc >> 4)); span[4] = (byte)((0xf & emc) << 4); span[4] |= (byte)(ipui.Number >> 16 & 0xf); BinaryPrimitives.WriteUInt16BigEndian(span.Slice(5), (ushort)ipui.Number); span[7] = 0x00; Console.WriteLine($"shifted {data.ToHex()}"); } } else { var emc = (ushort)(ipui.Number >> 28); if (EMCs.Contains(emc)) { Console.WriteLine(data.ToHex()); //00000080 b0100301 400fdf var span = iedata.Span; span[2] = 0x10; span[3] = (byte)(emc >> 12); BinaryPrimitives.WriteUInt32BigEndian(span.Slice(4), (uint)(ipui.Number >> 8)); Console.WriteLine($"unshifted {data.ToHex()}"); } } } } } } catch (Exception ex) { Console.WriteLine(ex); Console.WriteLine(data.ToHex()); } return(WriteAsync(direction, messageId, rfp, data, cancellationToken)); }
protected override Task OnMessageAsync(MessageDirection direction, uint messageId, RfpIdentifier rfp, Memory <byte> data, CancellationToken cancellationToken) { try { var ies = data.Slice(14); while (!ies.IsEmpty) { var current = ies.Span[0]; if (current > SignalType) { break; } if (current >= 128) { //fixed length if (current >= 224) { if (ies.Length < 2) { break; } if (current == SignalType) { ies.Span[1] = 0x41; Console.WriteLine("patched alerting pattern"); } ies = ies.Slice(2); } else { ies = ies.Slice(1); } } else { if (ies.Length < 2) { break; } var length = ies.Span[1]; ies = ies.Slice(2); if (current == (byte)NwkVariableLengthElementType.PortableIdentity) { //portable identity var ie = new NwkIePortableIdentity(ies); if (ie.IdentityType == NwkIePortableIdentity.PortableIdentityType.IPUI) { if (ie.Ipui.Put == NwkIePortableIdentity.IPUITypeCoding.O && ies.Length >= 5) { var span = ies.Slice(3).Span; var emc = (ushort)((span[0] & 0xf) << 12 | (span[1] << 4) | (span[2] >> 4)); if (!EMCs.Contains(emc)) { break; } } } } if (ies.Length < length) { break; } ies = ies.Slice(length); } } } catch (Exception ex) { Console.WriteLine(ex); } return(WriteAsync(direction, messageId, rfp, data, cancellationToken)); }