Flutter如何实现发现设备并通过本地网络向设备发送数据

在Flutter中如何实现发现同一本地网络下的设备,并通过网络向这些设备发送数据?目前需要开发一个功能,要求能够自动扫描局域网内的设备,并建立连接进行数据传输。请问有哪些可靠的插件或方案可以实现这一功能?最好能提供具体的代码示例或实现思路,谢谢!

2 回复

使用Flutter实现设备发现与数据传输:

  1. 设备发现:通过mDNS(multicast DNS)使用mdns插件扫描局域网设备。
  2. 网络通信:使用socket_io_clientweb_socket_channel建立TCP/WebSocket连接。
  3. 数据传输:通过建立的Socket连接发送JSON或二进制数据。

需确保设备在同一局域网,并处理权限和网络状态。

更多关于Flutter如何实现发现设备并通过本地网络向设备发送数据的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,可以通过以下步骤实现设备发现和本地网络数据传输:

设备发现

1. 使用 mDNS (多播DNS)

import 'package:mdns_plugin/mdns_plugin.dart';

class DeviceDiscovery {
  void startDiscovery() {
    MDNS.startDiscovery('_http._tcp').listen((service) {
      print('发现设备: ${service.name}');
      print('IP地址: ${service.ip}');
      print('端口: ${service.port}');
    });
  }
}

2. 使用 network_discovery_plugin

import 'package:network_discovery_plugin/network_discovery_plugin.dart';

void discoverDevices() async {
  List<DiscoveredDevice> devices = 
      await NetworkDiscoveryPlugin.discoverDevices(
    timeout: 5000,
    port: 80,
  );
  
  devices.forEach((device) {
    print('设备: ${device.hostname} - ${device.ip}');
  });
}

数据传输

1. 使用 Socket 通信

import 'dart:io';

class NetworkCommunication {
  // 客户端发送数据
  Future<void> sendData(String ip, int port, String data) async {
    try {
      Socket socket = await Socket.connect(ip, port);
      socket.write(data);
      await socket.flush();
      socket.close();
    } catch (e) {
      print('发送失败: $e');
    }
  }

  // 服务端接收数据
  void startServer(int port) async {
    ServerSocket server = await ServerSocket.bind(InternetAddress.anyIPv4, port);
    
    server.listen((Socket socket) {
      socket.listen((List<int> data) {
        String received = String.fromCharCodes(data);
        print('收到数据: $received');
      });
    });
  }
}

2. 使用 http 包进行 REST API 通信

import 'package:http/http.dart' as http;

class HttpCommunication {
  Future<void> sendHttpRequest(String ip, int port, String data) async {
    final response = await http.post(
      Uri.parse('http://$ip:$port/api/data'),
      body: {'data': data},
    );
    
    if (response.statusCode == 200) {
      print('发送成功');
    }
  }
}

完整示例

import 'package:flutter/material.dart';
import 'package:mdns_plugin/mdns_plugin.dart';
import 'dart:io';

class NetworkApp extends StatefulWidget {
  @override
  _NetworkAppState createState() => _NetworkAppState();
}

class _NetworkAppState extends State<NetworkApp> {
  List<String> discoveredDevices = [];
  
  @override
  void initState() {
    super.initState();
    startDeviceDiscovery();
  }
  
  void startDeviceDiscovery() {
    MDNS.startDiscovery('_yourapp._tcp').listen((service) {
      setState(() {
        discoveredDevices.add('${service.name} - ${service.ip}:${service.port}');
      });
    });
  }
  
  void sendToDevice(String ip, int port) async {
    try {
      Socket socket = await Socket.connect(ip, port, timeout: Duration(seconds: 5));
      socket.write('Hello from Flutter!');
      await socket.flush();
      socket.close();
    } catch (e) {
      print('发送失败: $e');
    }
  }
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('设备发现')),
      body: ListView.builder(
        itemCount: discoveredDevices.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(discoveredDevices[index]),
            onTap: () {
              // 解析IP和端口并发送数据
              sendToDevice('192.168.1.100', 8080);
            },
          );
        },
      ),
    );
  }
}

注意事项

  1. 权限配置 (android/app/src/main/AndroidManifest.xml):
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. 依赖包 (pubspec.yaml):
dependencies:
  mdns_plugin: ^1.0.0
  http: ^0.13.0

这种方法适用于局域网内的设备发现和通信,确保设备在同一网络下,并处理好网络异常情况。

回到顶部