'HP/Printer', 631 => 'CUPS/Apple', 548 => 'Apple/AFP', 445 => 'Microsoft/SMB', 22 => null, // Too common ]; foreach ($portVendorMap as $port => $vendor) { if ($vendor !== null && in_array($port, $openPorts, true)) { return $vendor; } } if ($hostname !== null) { $hostname = strtolower($hostname); if (str_contains($hostname, 'apple') || str_contains($hostname, 'macbook') || str_contains($hostname, 'iphone')) { return 'Apple'; } if (str_contains($hostname, 'synology') || str_contains($hostname, 'nas')) { return 'Synology'; } if (str_contains($hostname, 'router') || str_contains($hostname, 'gateway')) { return 'Router/Network'; } } return null; } /** * Calculate confidence score 0-100 based on found data. */ public function calculateConfidence(int $openPortCount, bool $hasHostname): int { $score = 10; // Base: host is alive if ($openPortCount > 0) { $score += min(40, $openPortCount * 5); } if ($hasHostname) { $score += 30; } return min(100, $score); } }