You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Flutter实现自动连接指定Wi-Fi(ESP8266)并自动断开

问题解答

可以通过Flutter实现该功能,但需要借助**平台通道(MethodChannel)**调用Android原生(Kotlin/Java)的Wi-Fi操作API——因为Flutter框架本身没有直接提供自动连接指定Wi-Fi并定时断开的能力,现有第三方库也很少覆盖这类需求。

实现步骤拆解

1. Flutter层逻辑

在Flutter中创建按钮和MethodChannel,触发原生端的Wi-Fi连接/断开操作:

import 'package:flutter/services.dart';

class WifiConnector {
  static const MethodChannel _channel = MethodChannel('wifi_connector');

  /// 连接指定Wi-Fi并在延迟后断开
  static Future<void> connectAndAutoDisconnect(String ssid, String password, int delaySeconds) async {
    try {
      await _channel.invokeMethod('connectAndDisconnect', {
        'ssid': ssid,
        'password': password,
        'delay': delaySeconds,
      });
    } on PlatformException catch (e) {
      print('操作失败: ${e.message}');
    }
  }
}

// 按钮调用示例
ElevatedButton(
  onPressed: () {
    WifiConnector.connectAndAutoDisconnect('ESP8266_SSID', 'ESP8266_PASSWORD', 60);
  },
  child: const Text('连接ESP8266并自动断开'),
)

2. Android原生层实现(Kotlin)

在Android项目中配置权限,并通过MethodChannel处理Wi-Fi连接和定时断开逻辑:

  • 添加权限(AndroidManifest.xml):
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 10+ 必须 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • 实现MethodChannel处理类:
import android.content.Context
import android.net.wifi.WifiManager
import android.net.wifi.WifiNetworkSpecifier
import android.os.Build
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : FlutterActivity() {
    private val CHANNEL = "wifi_connector"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "connectAndDisconnect") {
                val ssid = call.argument<String>("ssid")
                val password = call.argument<String>("password")
                val delaySeconds = call.argument<Int>("delay") ?: 60

                if (ssid.isNullOrEmpty() || password.isNullOrEmpty()) {
                    result.error("INVALID_ARGS", "SSID或密码不能为空", null)
                    return@setMethodCallHandler
                }

                connectToWifi(ssid, password) { success ->
                    if (success) {
                        GlobalScope.launch {
                            delay(delaySeconds * 1000L)
                            disconnectWifi()
                        }
                        result.success("已启动连接,将在${delaySeconds}秒后断开")
                    } else {
                        result.error("CONNECT_FAILED", "连接Wi-Fi失败", null)
                    }
                }
            } else {
                result.notImplemented()
            }
        }
    }

    private fun connectToWifi(ssid: String, password: String, callback: (Boolean) -> Unit) {
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // Android 10+ 新API
            val specifier = WifiNetworkSpecifier.Builder()
                .setSsid(ssid)
                .setWpa2Passphrase(password)
                .build()
            val request = android.net.wifi.WifiNetworkRequest.Builder()
                .setNetworkSpecifier(specifier)
                .build()

            wifiManager.requestNetwork(request, object : WifiManager.NetworkCallback() {
                override fun onAvailable(network: android.net.wifi.WifiNetworkInfo) {
                    super.onAvailable(network)
                    callback(true)
                }

                override fun onUnavailable() {
                    super.onUnavailable()
                    callback(false)
                }
            })
        } else {
            // Android 9及以下旧API
            val config = android.net.wifi.WifiConfiguration()
            config.SSID = "\"$ssid\""
            config.preSharedKey = "\"$password\""
            val networkId = wifiManager.addNetwork(config)
            wifiManager.disconnect()
            val connected = wifiManager.enableNetwork(networkId, true)
            wifiManager.reconnect()
            callback(connected)
        }
    }

    private fun disconnectWifi() {
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        wifiManager.disconnect()
    }
}

3. 关键注意事项

  • Android版本兼容:Android 10(API 29)及以上必须使用WifiNetworkSpecifier,旧版本用WifiConfiguration。
  • 动态权限申请:Android 6及以上需动态申请位置权限,否则无法扫描和连接Wi-Fi。
  • iOS限制:如果需要支持iOS,同样需要调用原生API,但iOS对Wi-Fi自动连接的限制极严格,通常需要用户手动确认,很难实现完全无交互的自动连接。

内容的提问来源于stack exchange,提问作者Giuseppe Brandi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:55:15