Flutter多播DNS发现插件flutter_mdns_plugin的使用

发布于 1周前 作者 sinazl 来自 Flutter

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 回复

更多关于Flutter多播DNS发现插件flutter_mdns_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 flutter_mdns_plugin 进行多播DNS(mDNS)发现的Flutter代码示例。这个插件允许你的Flutter应用发现并连接到同一局域网内的其他设备或服务。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_mdns_plugin 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_mdns_plugin: ^x.y.z  # 替换为最新的版本号

然后,运行 flutter pub get 来安装依赖。

接下来,你可以在你的 Flutter 应用中使用这个插件。以下是一个简单的示例,展示了如何启动 mDNS 服务发现并在发现服务时打印信息。

import 'package:flutter/material.dart';
import 'package:flutter_mdns_plugin/flutter_mdns_plugin.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  FlutterMdnsPlugin _mdnsPlugin = FlutterMdnsPlugin();
  List<MdnsService> _discoveredServices = [];

  @override
  void initState() {
    super.initState();
    initMdns();
  }

  void initMdns() async {
    // 启动mDNS服务发现
    _mdnsPlugin.startDiscovery().then((_) {
      // 监听发现的服务
      _mdnsPlugin.serviceDiscovered.listen((MdnsService service) {
        setState(() {
          _discoveredServices.add(service);
        });
        print("Discovered service: ${service.name} on ${service.address}:${service.port}");
      });
    }).catchError((error) {
      print("Error starting mDNS discovery: $error");
    });
  }

  @override
  void dispose() {
    // 停止mDNS服务发现
    _mdnsPlugin.stopDiscovery();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('mDNS Discovery Example'),
        ),
        body: ListView.builder(
          itemCount: _discoveredServices.length,
          itemBuilder: (context, index) {
            MdnsService service = _discoveredServices[index];
            return ListTile(
              title: Text("Service: ${service.name}"),
              subtitle: Text("Address: ${service.address}:${service.port}"),
            );
          },
        ),
      ),
    );
  }
}

class MdnsService {
  String name;
  String address;
  int port;

  MdnsService({required this.name, required this.address, required this.port});
}

注意

  1. FlutterMdnsPlugin 的 API 可能会根据插件版本有所不同,所以请查阅最新的 flutter_mdns_plugin 文档 以获取准确的信息。
  2. 上面的代码示例假设 FlutterMdnsPlugin 提供了 startDiscoveryserviceDiscovered 流。实际使用时,请根据插件的API进行调整。
  3. MdnsService 类是一个简单的数据模型,用于存储发现的服务信息。实际使用时,可能需要根据实际返回的数据结构进行调整。

这个示例展示了如何使用 flutter_mdns_plugin 进行基本的 mDNS 服务发现,并在UI中展示发现的服务。你可以根据需求进一步扩展这个示例,比如处理服务解析、连接到服务等。

回到顶部