搜尋套件、儲存庫與 APP 分類

套件詳情v0.1.1

flutter_p2p

適用於 Flutter 的 WiFi 直接連接外掛程式。此外掛程式使用 Android 的原生 WiFi P2P API。

近 30 天下載
34
喜歡數
62
Pub 分數
40

安裝套件

flutter pub add flutter_p2p

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

flutter_p2p 是一個 Flutter 插件,可在 Android 設備上使用平台原生的 WiFi P2P API 實現 WiFi 直連。它允許應用程式在無需中心接入點的情況下,發現並直接連接到附近的設備。這非常適合用於點對點檔案分享、即時通訊或本地設備協作。該插件提供了一個簡單的介面,用於管理連接、掃描對等設備以及傳輸資料。它專為 Android 設計,不支援 iOS 或其他平台。

適用情境

  • 直接設備到設備的檔案傳輸
  • 本地多人遊戲
  • 離線資料同步
  • 物聯網裝置配對
  • 即時感測器資料分享

主要特色

  • 原生安卓WiFi P2P整合
  • 設備發現和連接管理
  • 安全的點對點通訊
  • 簡單的 Dart API
  • 平台特定的實現

適合對象

  • 僅限 Android 的應用程式
  • 本地網路通訊
  • 低延遲設備互動
  • 需要直接設備連結的應用程式
  • 專案避免集中式基礎設施

使用建議

  • 僅適用於 Android
  • 需要WiFi P2P權限
  • 限於本地網路範圍
  • 無 iOS 支援
  • 取決於設備硬體相容性

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

GitHub license Pub

flutter_p2p

A Wi-Fi Direct Plugin for Flutter.

This plugin is in alpha and only supports android at the moment.

Getting Started

Required permissions

Put this into your AndroidManifest.xml

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Request permission

In order to scan for devices and connect to devices you need to ask for the location Permission

Future<bool> _checkPermission() async {
  if (!await FlutterP2p.isLocationPermissionGranted()) {
    await FlutterP2p.requestLocationPermission();
    return false;
  }
  return true;
}
Register / unregister from WiFi events

To receive notifications for connection changes or device changes (peers discovered etc.) you have to subscribe to the wifiEvents and register the plugin to the native events.

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    _register();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    // Stop handling events when the app doesn't run to prevent battery draining

    if (state == AppLifecycleState.resumed) {
      _register();
    } else if (state == AppLifecycleState.paused) {
      _unregister();
    }
  }

  List<StreamSubscription> _subscriptions = [];

  void _register() async {
    if (!await _checkPermission()) {
      return;
    }
    _subscriptions.add(FlutterP2p.wifiEvents.stateChange.listen((change) {
      // Handle wifi state change
    }));

    _subscriptions.add(FlutterP2p.wifiEvents.connectionChange.listen((change) {
      // Handle changes of the connection
    }));

    _subscriptions.add(FlutterP2p.wifiEvents.thisDeviceChange.listen((change) {
      // Handle changes of this device
    }));

    _subscriptions.add(FlutterP2p.wifiEvents.peersChange.listen((change) {
      // Handle discovered peers
    }));

    _subscriptions.add(FlutterP2p.wifiEvents.discoveryChange.listen((change) {
      // Handle discovery state changes
    }));

    FlutterP2p.register();  // Register to the native events which are send to the streams above
  }

  void _unregister() {
    _subscriptions.forEach((subscription) => subscription.cancel()); // Cancel subscriptions
    FlutterP2p.unregister(); // Unregister from native events
  }
}
Discover devices

After you subscribed to the events you only need to call the FlutterP2p.discoverDevices() method.


List<WifiP2pDevice> _peers = [];

void _register() async {

  /// ...

  _subscriptions.add(FlutterP2p.wifiEvents.peersChange.listen((change) {
    setState(() {
      _peers = change.devices;
    });
  }));

  /// ...
}

void _discover() {
  FlutterP2p.discoverDevices();
}
Connect to a device

Call FlutterP2p.connect(device); and listen to the FlutterP2p.wifiEvents.connectionChange


 bool _isConnected = false;
 bool _isHost = false;
 String _deviceAddress = "";

 void _register() async {
    // ...

    _subscriptions.add(FlutterP2p.wifiEvents.connectionChange.listen((change) {
      setState(() {
        _isConnected = change.networkInfo.isConnected;
        _isHost = change.wifiP2pInfo.isGroupOwner;
        _deviceAddress = change.wifiP2pInfo.groupOwnerAddress;
      });
    }));

    // ...
  }
Disconnect from current P2P group

Call FlutterP2p.removeGroup()

 void _disconnect() async {
   FlutterP2p.removeGroup();
 }
Transferring data between devices

After you are connected to a device you can transfer data async in both directions (client -> host, host -> client).

On the host:

  // Open a port and create a socket

  P2pSocket _socket;
  void _openPortAndAccept(int port) async {
    var socket = await FlutterP2p.openHostPort(port);
    setState(() {
      _socket = socket;
    });

    var buffer = "";
    socket.inputStream.listen((data) {
      var msg = String.fromCharCodes(data.data);
      buffer += msg;

      if (data.dataAvailable == 0) {
        _showSnackBar("Data Received: $buffer");
        buffer = "";
      }
    });

    // Write data to the client using the _socket.write(UInt8List) or `_socket.writeString("Hello")` method


    print("_openPort done");

    // accept a connection on the created socket
    await FlutterP2p.acceptPort(port);
    print("_accept done");
  }

On the client:

  // Connect to the port and create a socket

  P2pSocket _socket;
  _connectToPort(int port) async {
    var socket = await FlutterP2p.connectToHost(
      _deviceAddress, // see above `Connect to a device`
      port,
      timeout: 100000, // timeout in milliseconds (default 500)
    );

    setState(() {
      _socket = socket;
    });

    var buffer = "";
    socket.inputStream.listen((data) {
      var msg = String.fromCharCodes(data.data);
      buffer += msg;

      if (data.dataAvailable == 0) {
        _showSnackBar("Received from host: $buffer");
        buffer = "";
      }
    });

    // Write data to the host using the _socket.write(UInt8List) or `_socket.writeString("Hello")` method

    print("_connectToPort done");
  }

所屬分類

依賴

依賴清單 1 項

原始碼儲存庫

使用此套件的專案

暫無相關資料。