public static async Task <DeviceInformation> Parse(IPEndPoint endpoint, byte[] packet) { var version = packet[0]; var cmd = packet[1]; var length = packet[2]; if (length + 4 > packet.Length) { return(null); } if (version == 1 && cmd == 0 && length == 0) { return(null); // drop ubnt-dp request } if (version == 1 && cmd == 0) { return(await Task.FromResult(DeviceInformationV1.Parse(packet))); } else if (version == 2) { return(await DeviceInformationV2.Parse(endpoint, cmd, packet)); } else { return(null); } }
internal static async Task <DeviceInformationV2> Parse(IPEndPoint info, byte cmd, byte[] data) { var msg = new DeviceInformationV2(); var i = 4; UInt16 l = 2; msg.DiscoveredBy = 2; if (cmd != 6 && cmd != 9 && cmd != 11) { return(null); } while (i < data.Length) { var type = data[i++]; var piece = new byte[] { data[i + 1], data[i] }; // endianness swap l = BitConverter.ToUInt16(piece, 0); i += 2; piece = data.Skip(i).Take(l).ToArray(); switch (type) { case PKT_V2_FWVERSION: msg.Firmware = piece.ToString(); break; case PKT_V2_UPTIME: msg.Uptime = TimeSpan.FromSeconds(BitConverter.ToInt32(piece, 0)); break; case PKT_V2_HOSTNAME: msg.Hostname = piece.ToString(); break; case PKT_V2_IPINFO: if (piece.Length == 10) { msg.MacAddress = BitConverter.ToString(piece.Take(6).ToArray()); msg.IPAddress = string.Join(".", piece.Skip(6).Take(4)); // aa.bb.cc.dd } break; case PKT_V2_HWADDR: msg.MacAddress = BitConverter.ToString(piece.Take(6).ToArray()); break; case PKT_V2_WMODE: if (piece.Length == 4) { msg.WMode = BitConverter.ToInt32(piece, 0); } break; case PKT_V2_SEQ: msg.Seq = BitConverter.ToInt32(piece, 0); break; case PKT_V2_SOURCE_MAC: msg.SourceMac = BitConverter.ToString(piece); break; case PKT_V2_DEFAULT: msg.IsDefault = piece[0] == 1; break; case PKT_V2_LOCATING: msg.IsLocating = piece[0] == 1; break; case PKT_V2_DHCPC: msg.IsDhcpClient = piece[0] == 1; break; case PKT_V2_DHCPC_BOUND: msg.IsDhcpClientBound = piece[0] == 1; break; case PKT_V2_SSHD_PORT: msg.SshdPort = BitConverter.ToInt32(piece, 0); break; case PKT_V2_REQ_FW: msg.ReqFirmwareVersion = ASCIIEncoding.ASCII.GetString(piece); break; case PKT_V2_SHORT_VER: msg.ShortVer = ASCIIEncoding.ASCII.GetString(piece); break; case PKT_V2_ESSID: msg.ESSID = ASCIIEncoding.ASCII.GetString(piece); break; case PKT_V2_MODEL: msg.Model = ASCIIEncoding.ASCII.GetString(piece); break; case PKT_V2_PLATFORM: msg.Platform = ASCIIEncoding.ASCII.GetString(piece); break; } i += l; } // TODO: (unimplemented) // cmd == 6 -> set timestamp // not sure on precision required for this if (cmd == 1 && msg.SshdPort != default(int)) { var udp = new UdpClient(); await udp.SendAsync(new byte[] { 0x02, 0x0a, 0x00, 0x00 }, 4, info); } return(msg); }