public DecodedLoraPacket DecodeMessage(string encodedPhysicalPayload) { // conver to hex var byteArray = Convert.FromBase64String(encodedPhysicalPayload); var hexValuesList = BitConverter.ToString(byteArray).Split("-").ToList(); // create packet DecodedLoraPacket decodedPacket = new DecodedLoraPacket() { OriginalHexString = string.Join("", hexValuesList) }; var physicalPayload = new PhysicalPayload { MacHeader = hexValuesList[0], MIC = string.Join("", hexValuesList).Substring((hexValuesList.Count * 2) - 8, 8) }; hexValuesList.RemoveRange(hexValuesList.Count - 4, 4); hexValuesList.RemoveAt(0); var frameHeader = new FrameHeader { DeviceAddress = hexValuesList[3] + hexValuesList[2] + hexValuesList[1] + hexValuesList[0], // big endian FrameControlOctet = hexValuesList[4], FrameCounter = hexValuesList[6] + hexValuesList[5] // big endian }; // frame options is optional, need to work out size / if its present using octet var binaryFrameControl = Convert.ToString(Convert.ToInt32(frameHeader.FrameControlOctet, 16), 2); var frameOptionsOffset = Convert.ToInt32(binaryFrameControl.Substring(binaryFrameControl.Length - 3, 3)); if (frameOptionsOffset != 0) { for (int i = 1; i <= frameOptionsOffset; i++) { frameHeader.FrameOptions += hexValuesList[6 + i]; } } // FramePayload var values = string.Join("", hexValuesList); var payloadOffset = 16 + (frameOptionsOffset * 2); var macPayload = new MacPayload { FramePort = hexValuesList[7 + frameOptionsOffset], FramePayload = values.Substring(payloadOffset, values.Length - payloadOffset), FrameHeader = frameHeader }; // combine structures physicalPayload.MacPayload = macPayload; decodedPacket.PhysicalPayload = physicalPayload; return(decodedPacket); }
public string ToVerboseString() { StringBuilder sb = new StringBuilder(); sb.AppendFormat("Message Type = {0}", Mhdr.MessageType).AppendLine(); sb.AppendFormat(" PHYPayload = {0}", Packet.ToHexString()).AppendLine(); sb.AppendLine(); sb.AppendFormat(" (PHYPayload = MHDR[1] | MACPayload[..] | MIC[4])").AppendLine(); sb.AppendFormat(" MHDR = {0}", Mhdr.RawData.ToHexString()).AppendLine(); sb.AppendFormat(" MACPayload = {0}", MacPayload.RawData.ToHexString()).AppendLine(); sb.AppendFormat(" MIC = {0}", Mic.RawData.ToHexString()).AppendLine(); sb.AppendLine(); sb.Append(MacPayload.ToVerboseString()); return(sb.ToString()); }