Flutter多播DNS发现插件flutter_mdns_plugin的使用
Flutter多播DNS发现插件flutter_mdns_plugin的使用
flutter_mdns_plugin
是一个用于在Flutter中发现多播DNS(mDNS)服务的简单插件,适用于Android和iOS平台。默认情况下,示例项目配置为仅发现Chromecast设备,但你可以通过修改 device_scanner.dart
文件中的 discovery_service
字符串来设置任何mDNS服务。
安装说明
iOS安装
确保在Xcode中将Foundation框架添加到你的iOS项目中。
Android安装
无需额外安装。只需确保在 AndroidManifest.xml
中添加了 android.permission.INTERNET
权限,但这个权限在创建新的Flutter项目时通常会自动添加。
示例代码
以下是一个完整的示例demo,展示了如何使用 flutter_mdns_plugin
插件来发现mDNS服务。该示例默认发现Chromecast设备,但你可以根据需要修改 discovery_service
字符串来发现其他类型的设备。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_mdns_plugin/flutter_mdns_plugin.dart';
void main() => runApp(MyApp());
const String discovery_service = "_googlecast._tcp"; // 你可以修改这个字符串来发现其他类型的mDNS服务
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late FlutterMdnsPlugin _mdnsPlugin;
List<String> messageLog = <String>[];
late DiscoveryCallbacks discoveryCallbacks;
List<ServiceInfo> _discoveredServices = <ServiceInfo>[];
[@override](/user/override)
void initState() {
super.initState();
// 定义回调函数,处理mDNS服务的发现、启动、停止和解析事件
discoveryCallbacks = DiscoveryCallbacks(
onDiscovered: (ServiceInfo info) {
print("Discovered ${info.toString()}"); // 打印发现的服务信息
setState(() {
messageLog.insert(0, "DISCOVERY: Discovered ${info.toString()}"); // 更新日志
});
},
onDiscoveryStarted: () {
print("Discovery started"); // 打印发现开始的信息
setState(() {
messageLog.insert(0, "DISCOVERY: Discovery Running"); // 更新日志
});
},
onDiscoveryStopped: () {
print("Discovery stopped"); // 打印发现停止的信息
setState(() {
messageLog.insert(0, "DISCOVERY: Discovery Not Running"); // 更新日志
});
},
onResolved: (ServiceInfo info) {
print("Resolved Service ${info.toString()}"); // 打印解析的服务信息
setState(() {
messageLog.insert(0, "DISCOVERY: Resolved ${info.toString()}"); // 更新日志
});
},
);
messageLog.add("Starting mDNS for service [$discovery_service]"); // 初始化日志
startMdnsDiscovery(discovery_service); // 开始mDNS发现
}
void startMdnsDiscovery(String serviceType) {
_mdnsPlugin = FlutterMdnsPlugin(discoveryCallbacks: discoveryCallbacks);
// 由于iOS平台需要等待初始化完成,因此使用Timer延迟3秒后再开始发现
Timer(Duration(seconds: 3), () => _mdnsPlugin.startDiscovery(serviceType));
}
[@override](/user/override)
void reassemble() {
super.reassemble();
if (_mdnsPlugin != null) {
_discoveredServices = <ServiceInfo>[]; // 重置已发现的服务列表
_mdnsPlugin.restartDiscovery(); // 重新启动发现
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('mDNS Discovery'),
),
body: ListView.builder(
reverse: true, // 日志从底部显示
itemCount: messageLog.length,
itemBuilder: (BuildContext context, int index) {
return Text(messageLog[index]); // 显示日志信息
},
),
),
);
}
}
更多关于Flutter多播DNS发现插件flutter_mdns_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复