Flutter网络发现与探测插件ping_discover_network_forked的使用
Flutter网络发现与探测插件ping_discover_network_forked的使用
简介
ping_discover_network
是一个用于 Dart/Flutter 的库,它允许对 IP 子网进行 ping 操作以发现网络设备。可以用来查找打印机(例如,在端口 9100 上)以及其他任何本地网络中的设备和服务。该库已在 Android 和 iOS 平台上进行了测试。
快速开始
示例:发现给定子网和端口上的可用网络设备
import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';
void main() async {
// NetworkAnalyzer.discover2 同时对所有 PORT:IP 地址进行 ping 操作。
const port = 80;
final stream = NetworkAnalyzer.discover2(
'192.168.0', // 子网地址
port,
timeout: Duration(milliseconds: 5000), // 超时时间
);
int found = 0;
stream.listen((NetworkAddress addr) {
if (addr.exists) {
found++;
print('Found device: ${addr.ip}:$port');
}
}).onDone(() => print('Finish. Found $found device(s)'));
}
示例:获取本地 IP 并发现网络设备
import 'package:wifi/wifi.dart';
import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';
void main() async {
final String ip = await Wifi.ip; // 获取本地 IP 地址
final String subnet = ip.substring(0, ip.lastIndexOf('.')); // 提取子网部分
final int port = 80;
final stream = NetworkAnalyzer.discover2(subnet, port);
stream.listen((NetworkAddress addr) {
if (addr.exists) {
print('Found device: ${addr.ip}');
}
});
}
示例:在给定子网和端口范围内发现可用网络设备
import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';
void checkPortRange(String subnet, int fromPort, int toPort) {
if (fromPort > toPort) {
return;
}
print('Checking port ${fromPort}');
final stream = NetworkAnalyzer.discover2(subnet, fromPort);
stream.listen((NetworkAddress addr) {
if (addr.exists) {
print('Found device: ${addr.ip}:${fromPort}');
}
}).onDone(() {
checkPortRange(subnet, fromPort + 1, toPort); // 递归检查下一个端口
});
}
void main() {
checkPortRange('192.168.0', 400, 410);
}
完整示例代码
以下是一个完整的 main.dart
文件示例,展示了如何使用 ping_discover_network_forked
插件来发现本地网络中的设备:
/*
* ping_discover_network_forked
* Created by Andrey Ushakov
*
* See LICENSE for distribution and usage details.
*/
import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';
import 'package:wifi/wifi.dart';
void main() async {
// 获取本地 IP 地址并提取子网部分
final String ip = await Wifi.ip;
final String subnet = ip.substring(0, ip.lastIndexOf('.'));
final int port = 80;
// 使用 NetworkAnalyzer.discover2 对所有 PORT:IP 地址进行 ping 操作
final stream = NetworkAnalyzer.discover2(subnet, port, timeout: Duration(milliseconds: 5000));
int found = 0;
stream.listen((NetworkAddress addr) {
if (addr.exists) {
found++;
print('Found device: ${addr.ip}:$port');
}
}).onDone(() => print('Finish. Found $found device(s)'));
}
通过以上内容,您可以根据需要选择适合您的应用场景,并使用 ping_discover_network_forked
插件轻松实现网络设备的发现功能。希望这些信息对您有所帮助!
更多关于Flutter网络发现与探测插件ping_discover_network_forked的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络发现与探测插件ping_discover_network_forked的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用ping_discover_network_forked
插件来进行网络发现与探测的示例代码。这个插件可以用于发现局域网内的设备,并通过ping操作来检测设备的可达性。
首先,你需要在你的pubspec.yaml
文件中添加这个插件的依赖:
dependencies:
flutter:
sdk: flutter
ping_discover_network_forked:
git:
url: https://github.com/some-forked-repo/ping_discover_network_forked.git # 替换为实际的forked仓库URL
ref: main # 或者其他你需要的分支或标签
注意:由于这个插件可能是一个forked版本,你需要替换URL为实际的forked仓库地址。
接下来,你可以在你的Flutter项目中创建一个页面,用于显示发现的设备和ping结果。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:ping_discover_network_forked/ping_discover_network_forked.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Network Discovery',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: NetworkDiscoveryPage(),
);
}
}
class NetworkDiscoveryPage extends StatefulWidget {
@override
_NetworkDiscoveryPageState createState() => _NetworkDiscoveryPageState();
}
class _NetworkDiscoveryPageState extends State<NetworkDiscoveryPage> {
List<String> devices = [];
Map<String, bool> pingResults = {};
@override
void initState() {
super.initState();
_discoverDevices();
}
Future<void> _discoverDevices() async {
try {
// 假设插件提供了一个方法来发现设备,这里我们假设它是discoverDevices()
var discoveredDevices = await PingDiscoverNetworkForked.discoverDevices();
// 更新状态以显示发现的设备
setState(() {
devices = discoveredDevices;
// 初始化ping结果
pingResults = devices.map((device) => MapEntry(device, false)).toMap();
// 对每个设备进行ping操作
for (var device in devices) {
_pingDevice(device);
}
});
} catch (e) {
print("Error discovering devices: $e");
}
}
Future<void> _pingDevice(String device) async {
try {
bool result = await PingDiscoverNetworkForked.ping(device);
// 更新ping结果
setState(() {
pingResults[device] = result;
});
} catch (e) {
print("Error pinging device $device: $e");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Network Discovery'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Discovered Devices:', style: TextStyle(fontSize: 20)),
SizedBox(height: 16),
Expanded(
child: ListView.builder(
itemCount: devices.length,
itemBuilder: (context, index) {
var device = devices[index];
var result = pingResults[device] ?? false;
return ListTile(
title: Text(device),
trailing: Text(result ? 'Reachable' : 'Unreachable'),
);
},
),
),
],
),
),
);
}
}
注意:
- 插件的API可能会有所不同,因此你需要查看
ping_discover_network_forked
插件的文档或源代码,以确定正确的方法名和用法。 - 示例中的
PingDiscoverNetworkForked.discoverDevices()
和PingDiscoverNetworkForked.ping(device)
是假设的方法名,你需要根据实际的插件API进行替换。 - 由于网络发现可能涉及权限问题(如访问网络状态、使用Wi-Fi扫描等),你可能需要在
AndroidManifest.xml
和Info.plist
中添加相应的权限声明。
希望这个示例能帮助你开始在Flutter项目中使用ping_discover_network_forked
插件进行网络发现与探测。