diff --git a/lib/network_tools.dart b/lib/network_tools.dart index 2dc54e7..27eb944 100644 --- a/lib/network_tools.dart +++ b/lib/network_tools.dart @@ -11,6 +11,7 @@ import 'package:network_tools/src/services/arp_service.dart'; export 'src/device_info/net_interface.dart'; export 'src/device_info/vendor_table.dart'; export 'src/host_scanner.dart'; +export 'src/mdns_scanner/list_of_srv_records.dart'; export 'src/mdns_scanner/mdns_scanner.dart'; export 'src/models/active_host.dart'; export 'src/models/arp_data.dart'; diff --git a/lib/src/device_info/arp_table_helper.dart b/lib/src/device_info/arp_table_helper.dart index d42545c..60aae5b 100644 --- a/lib/src/device_info/arp_table_helper.dart +++ b/lib/src/device_info/arp_table_helper.dart @@ -1,8 +1,8 @@ import 'dart:convert'; -import 'dart:io'; import 'package:logging/logging.dart'; import 'package:network_tools/src/models/arp_data.dart'; +import 'package:universal_io/io.dart'; class ARPTableHelper { static final arpLogger = Logger("arp-table-logger"); diff --git a/lib/src/device_info/net_interface.dart b/lib/src/device_info/net_interface.dart index 09b1ab1..5837b16 100644 --- a/lib/src/device_info/net_interface.dart +++ b/lib/src/device_info/net_interface.dart @@ -1,4 +1,4 @@ -import 'dart:io'; +import 'package:universal_io/io.dart'; class NetInterface { NetInterface({ diff --git a/lib/src/device_info/vendor_table.dart b/lib/src/device_info/vendor_table.dart index fcb1fbe..e908e54 100644 --- a/lib/src/device_info/vendor_table.dart +++ b/lib/src/device_info/vendor_table.dart @@ -1,11 +1,11 @@ import 'dart:convert'; -import 'dart:io'; import 'package:csv/csv.dart'; import 'package:http/http.dart' as http; import 'package:network_tools/network_tools.dart'; import 'package:network_tools/src/network_tools_utils.dart'; import 'package:path/path.dart' as p; +import 'package:universal_io/io.dart'; class VendorTable { static Map _vendorTableMap = {}; diff --git a/lib/src/mdns_scanner/list_of_srv_records.dart b/lib/src/mdns_scanner/list_of_srv_records.dart index ecb302f..51a3eb1 100644 --- a/lib/src/mdns_scanner/list_of_srv_records.dart +++ b/lib/src/mdns_scanner/list_of_srv_records.dart @@ -70,8 +70,9 @@ List tcpSrvRecordsList = [ '_zwave-js-server._tcp', // "domain": "zwave_js" '_axis-video._tcp', // "properties": { "macaddress": "00408c*" } "properties": { "macaddress": "accc8e*" } "properties": { "macaddress": "b8a44f*" } '_androidtvremote2._tcp', - '_ewelink._tcp', + '_ewelink._tcp', // Ewelink devices '_nvstream_dbd._tcp', + '_smartview._tcp', // Samsung tv's ]; List udpSrvRecordsList = [ diff --git a/lib/src/mdns_scanner/mdns_scanner.dart b/lib/src/mdns_scanner/mdns_scanner.dart index 1cdeafc..1bc4eba 100644 --- a/lib/src/mdns_scanner/mdns_scanner.dart +++ b/lib/src/mdns_scanner/mdns_scanner.dart @@ -1,7 +1,6 @@ import 'package:multicast_dns/multicast_dns.dart'; import 'package:network_tools/network_tools.dart'; import 'package:network_tools/src/mdns_scanner/get_srv_list_by_os/srv_list.dart'; -import 'package:network_tools/src/mdns_scanner/list_of_srv_records.dart'; import 'package:network_tools/src/network_tools_utils.dart'; import 'package:universal_io/io.dart'; @@ -51,8 +50,6 @@ class MdnsScanner { static Future> findingMdnsWithAddress( String serviceType, ) async { - final List mdnsFoundList = []; - final MDnsClient client = MDnsClient( rawDatagramSocketFactory: ( dynamic host, @@ -70,6 +67,7 @@ class MdnsScanner { }, ); + final List listOfActiveHost = []; await client.start(); await for (final PtrResourceRecord ptr in client.lookup( @@ -79,42 +77,86 @@ class MdnsScanner { in client.lookup( ResourceRecordQuery.service(ptr.domainName), )) { - final MdnsInfo mdnsFound = MdnsInfo( - srvResourceRecord: srv, - ptrResourceRecord: ptr, + listOfActiveHost.addAll( + await findAllActiveHostForSrv( + addressType: AddressType.ipv4, + client: client, + ptr: ptr, + srv: srv, + ), + ); + listOfActiveHost.addAll( + await findAllActiveHostForSrv( + addressType: AddressType.ipv6, + client: client, + ptr: ptr, + srv: srv, + ), ); - mdnsFoundList.add(mdnsFound); } } client.stop(); + return listOfActiveHost; + } + + static Future> findAllActiveHostForSrv({ + required AddressType addressType, + required MDnsClient client, + required PtrResourceRecord ptr, + required SrvResourceRecord srv, + }) async { final List listOfActiveHost = []; - for (final MdnsInfo foundMdns in mdnsFoundList) { - final List? internetAddressList; - try { - internetAddressList = - await InternetAddress.lookup(foundMdns.mdnsSrvTarget); - - // There can be multiple devices with the same name - for (final InternetAddress internetAddress in internetAddressList) { - final ActiveHost tempHost = ActiveHost( - internetAddress: internetAddress, - mdnsInfoVar: foundMdns, - ); - listOfActiveHost.add(tempHost); - } - } catch (e) { - log.severe( - 'Error finding ip of mdns record ${foundMdns.ptrResourceRecord.name} srv target ${foundMdns.mdnsSrvTarget}, will add it with ip 0.0.0.0\n$e', + try { + Stream iPAddressResourceRecordStream; + + if (addressType == AddressType.ipv4) { + iPAddressResourceRecordStream = client.lookup( + ResourceRecordQuery.addressIPv4(srv.target), + ); + } else { + iPAddressResourceRecordStream = client.lookup( + ResourceRecordQuery.addressIPv6(srv.target), ); - final ActiveHost tempHost = ActiveHost( - internetAddress: InternetAddress('0.0.0.0'), - mdnsInfoVar: foundMdns, + } + await for (final IPAddressResourceRecord ip + in iPAddressResourceRecordStream) { + final ActiveHost activeHost = convertSrvToHostName( + internetAddress: ip.address, + ptr: ptr, + srv: srv, ); - listOfActiveHost.add(tempHost); + + listOfActiveHost.add(activeHost); } + } catch (e) { + log.severe( + 'Error finding ip of mdns record ${ptr.name} srv target ${srv.target}, will add it with ip 0.0.0.0\n$e', + ); + final ActiveHost activeHost = convertSrvToHostName( + internetAddress: InternetAddress('0.0.0.0'), + srv: srv, + ptr: ptr, + ); + listOfActiveHost.add(activeHost); } - return listOfActiveHost; } + + static ActiveHost convertSrvToHostName({ + required InternetAddress internetAddress, + required PtrResourceRecord ptr, + required SrvResourceRecord srv, + }) { + final MdnsInfo mdnsInfo = MdnsInfo( + srvResourceRecord: srv, + ptrResourceRecord: ptr, + ); + return ActiveHost( + internetAddress: internetAddress, + mdnsInfoVar: mdnsInfo, + ); + } } + +enum AddressType { ipv4, ipv6 } diff --git a/lib/src/models/active_host.dart b/lib/src/models/active_host.dart index 8fb0284..cbb5c7a 100644 --- a/lib/src/models/active_host.dart +++ b/lib/src/models/active_host.dart @@ -9,7 +9,7 @@ final _getIt = GetIt.instance; /// ActiveHost which implements comparable /// By default sort by hostId ascending -class ActiveHost extends Comparable { +class ActiveHost { ActiveHost({ required this.internetAddress, this.openPorts = const [], @@ -219,7 +219,6 @@ class ActiveHost extends Comparable { @override bool operator ==(Object o) => o is ActiveHost && address == o.address; - @override int compareTo(ActiveHost other) { return hostId.compareTo(other.hostId); } diff --git a/lib/src/models/arp_data.dart b/lib/src/models/arp_data.dart index 79456c4..83eb239 100644 --- a/lib/src/models/arp_data.dart +++ b/lib/src/models/arp_data.dart @@ -1,5 +1,5 @@ -import 'dart:io'; import 'package:json_annotation/json_annotation.dart'; +import 'package:universal_io/io.dart'; part 'arp_data.g.dart'; diff --git a/lib/src/models/open_port.dart b/lib/src/models/open_port.dart index 6381b20..045afff 100644 --- a/lib/src/models/open_port.dart +++ b/lib/src/models/open_port.dart @@ -1,9 +1,10 @@ import 'package:json_annotation/json_annotation.dart'; + part 'open_port.g.dart'; /// Represents open port for a target Address @JsonSerializable() -class OpenPort extends Comparable { +class OpenPort { OpenPort(this.port, {this.isOpen = true}); factory OpenPort.fromJson(Map json) => _$OpenPortFromJson(json); @@ -11,7 +12,6 @@ class OpenPort extends Comparable { final int port; final bool isOpen; - @override int compareTo(OpenPort other) { return port.compareTo(other.port); } diff --git a/pubspec.yaml b/pubspec.yaml index e3eaf2e..198d1f5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ issue_tracker: https://github.com/osociety/network_tools/issues repository: https://github.com/osociety/network_tools environment: - sdk: ">=2.17.6 <4.0.0" + sdk: ">=3.2.0 <4.0.0" topics: - network @@ -20,36 +20,36 @@ funding: dependencies: # A dart csv to list converter. - csv: ^5.0.2 + csv: ^5.1.1 # Multi-platform network ping utility. - dart_ping: ^9.0.0 + dart_ping: ^9.0.1 # Defines the annotations used by json_serializable - get_it: ^7.6.0 + get_it: ^7.6.4 # A composable, Future-based library for making HTTP requests. - http: ^1.1.0 + http: ^1.1.2 # Injectable is a convenient code generator for get_it. - injectable: ^2.2.0 + injectable: ^2.3.2 # Defines the annotations used by json_serializable. json_annotation: ^4.8.1 # Debugging and error logging. logging: ^1.2.0 # Performing mDNS queries (e.g. Bonjour, Avahi). - multicast_dns: ^0.3.2+2 + multicast_dns: ^0.3.2+6 # A comprehensive, cross-platform path manipulation library for Dart. path: ^1.8.3 # Process run helpers - process_run: ^0.13.1 + process_run: ^0.13.3+1 # Yet another NoSQL persistent store database solution for single process io apps. sembast: ^3.5.0+1 # Cross-platform 'dart:io' that works in all platforms. - universal_io: ^2.0.4 + universal_io: ^2.2.2 dev_dependencies: # Standalone generator and watcher for Dart - build_runner: ^2.4.6 + build_runner: ^2.4.7 # A generator for injectable library. - injectable_generator: ^2.4.0 + injectable_generator: ^2.4.1 # Provides Dart Build System builders for handling JSON. json_serializable: ^6.7.1 # Set of lint rules for Dart.