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);
            }
        }
Beispiel #2
0
        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);
        }