native_mdns_scanner 1.0.2
native_mdns_scanner: ^1.0.2 copied to clipboard
Dart FFI bindings for macOS mDNS/Bonjour services. Provides native access to multicast DNS functionality on macOS.
example/native_mdns_scanner_example.dart
import 'package:native_mdns_scanner/native_mdns_scanner.dart';
void main() async {
final mdnsFfi = MdnsFfi();
try {
print('π Basic mDNS scanning example\n');
// Example 1: Simple scan for Chromecast devices
print('π± Scanning for Chromecast devices...');
mdnsFfi.startScan('_googlecast._tcp');
// Wait for 10 seconds
await Future.delayed(Duration(seconds: 10));
mdnsFfi.stopScan();
final devices = mdnsFfi.foundDevices;
print('Found ${devices.length} Chromecast devices:');
for (final device in devices) {
print(' β’ ${device.name} at ${device.ip}:${device.port}');
if (device.txtRecords.isNotEmpty) {
print(' TXT records: ${device.txtRecords}');
}
}
print('\n' + '=' * 50);
// Example 2: Scan multiple service types
print('π― Scanning multiple service types simultaneously...');
mdnsFfi.clearFoundDevices();
final multiDevices = await mdnsFfi.scanMultipleServices([
'_googlecast._tcp',
'_airplay._tcp',
'_raop._tcp',
], timeout: Duration(seconds: 15));
print('\nFound ${multiDevices.length} devices total:');
final devicesByType = mdnsFfi.getDevicesByServiceType();
for (final serviceType in devicesByType.keys) {
final typeDevices = devicesByType[serviceType]!;
print('\n$serviceType (${typeDevices.length} devices):');
for (final device in typeDevices) {
print(' β’ ${device.name} (${device.ip}:${device.port})');
}
}
print('\n' + '=' * 50);
// Example 3: Periodic scanning
print('π Periodic scanning example...');
print('Sending queries every 3 seconds for 12 seconds total\n');
mdnsFfi.clearFoundDevices();
final periodicDevices = await mdnsFfi.scanMultipleServicesWithPeriodic(
[
'_googlecast._tcp',
],
timeout: Duration(seconds: 12),
queryInterval: Duration(seconds: 3),
);
print('\nPeriodic scan results:');
for (final device in periodicDevices) {
print(
' β’ ${device.name} found in query #${device.queryNumber} at ${TimingAnalyzer.formatTime(device.foundAt)}');
}
// Show timing analysis
if (periodicDevices.isNotEmpty) {
print('\nπ Timing Analysis:');
TimingAnalyzer.analyzeTimings(periodicDevices);
}
} catch (e) {
print('β Error during scanning: $e');
} finally {
print('\nπ§Ή Cleaning up...');
mdnsFfi.dispose();
print('β
Done!');
}
}