using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace LanDiscovery.Services { public class OuiVendorLookupService { private readonly Dictionary _ouiDatabase = new Dictionary(StringComparer.OrdinalIgnoreCase); public OuiVendorLookupService() { // Load common vendors for MVP immediate gratification _ouiDatabase["00:0C:29"] = "VMware"; _ouiDatabase["00:50:56"] = "VMware"; _ouiDatabase["00:15:5D"] = "Microsoft (Hyper-V)"; _ouiDatabase["B8:27:EB"] = "Raspberry Pi"; _ouiDatabase["DC:A6:32"] = "Raspberry Pi"; _ouiDatabase["E4:5F:01"] = "Raspberry Pi"; _ouiDatabase["00:11:32"] = "Synology"; _ouiDatabase["F0:9F:C2"] = "Ubiquiti"; _ouiDatabase["74:83:C2"] = "Ubiquiti"; _ouiDatabase["18:E8:29"] = "Ubiquiti"; _ouiDatabase["AC:87:A3"] = "Apple"; _ouiDatabase["00:1A:11"] = "Google"; _ouiDatabase["52:54:00"] = "QEMU/KVM"; // TODO: Load full "oui.txt" if present in Assets } public string GetVendor(string macAddress) { if (string.IsNullOrEmpty(macAddress)) return ""; // Normalize MAC: 00-11-22 -> 00:11:22 var formatted = macAddress.Replace("-", ":").ToUpper(); // Check first 3 bytes (XX:XX:XX) if (formatted.Length >= 8) { var prefix = formatted.Substring(0, 8); // "00:11:22" if (_ouiDatabase.TryGetValue(prefix, out var vendor)) { return vendor; } } return "Unknown"; } } }