Exemplo n.º 1
0
 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));
 }
Exemplo n.º 2
0
 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));
 }