wifi_direct_plugin 0.0.8 copy "wifi_direct_plugin: ^0.0.8" to clipboard
wifi_direct_plugin: ^0.0.8 copied to clipboard

A comprehensive Flutter plugin for WiFi Direct (P2P) communication with real-time messaging, file transfer, and cross-platform support for Android and iOS.

WiFi Direct Plugin #

A comprehensive Flutter plugin for peer-to-peer device communication using WiFi Direct on Android and MultipeerConnectivity on iOS. Enable seamless device-to-device communication without requiring an internet connection.

Features #

🔗 Cross-Platform P2P Communication

  • Android: WiFi P2P (WiFi Direct) support
  • iOS: MultipeerConnectivity framework integration

📱 Device Discovery & Connection

  • Automatic peer discovery
  • Server/Client connection models
  • Real-time connection status monitoring

💬 Multi-Type Data Transfer

  • Text messaging
  • File transfer with progress tracking
  • Image sharing with chunked transmission
  • Binary data communication

🔄 Reliable Communication

  • Automatic message buffering and reassembly
  • MD5 checksum verification for file integrity
  • Connection resilience with automatic reconnection

Installation #

Add this to your package's pubspec.yaml file:

dependencies:
  wifi_direct_plugin: ^0.0.8

Then run:

flutter pub get

Platform Setup #

Android Setup #

Add the following permissions to your android/app/src/main/AndroidManifest.xml:

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

<uses-feature android:name="android.hardware.wifi.direct" android:required="true" />

iOS Setup #

Add the following to your ios/Runner/Info.plist:

<key>NSLocalNetworkUsageDescription</key>
<string>This app needs to access your local network for WiFi Direct communication</string>
<key>NSBonjourServices</key>
<array>
    <string>_wifi-direct._tcp</string>
    <string>_wifi-direct._udp</string>
</array>

Quick Start #

1. Initialize the Plugin #

import 'package:wifi_direct_plugin/wifi_direct_plugin.dart';

// Initialize the plugin
await WifiDirectPlugin.initialize();

2. Setup Event Listeners #

// Listen for connection changes
WifiDirectPlugin.connectionStream.listen((connectionInfo) {
  print('Connection status: ${connectionInfo.isConnected}');
  print('Is Group Owner: ${connectionInfo.isGroupOwner}');
});

// Listen for peer discovery
WifiDirectPlugin.peersStream.listen((peers) {
  print('Found ${peers.length} peers');
  for (var peer in peers) {
    print('Peer: ${peer.deviceName} (${peer.deviceAddress})');
  }
});

// Setup data reception callbacks
WifiDirectPlugin.onTextReceived = (text) {
  print('Received text: $text');
};

WifiDirectPlugin.onFileReceived = (file) {
  print('Received file: ${file.path}');
};

WifiDirectPlugin.onImageReceived = (image) {
  print('Received image: ${image.path}');
};

3. Start as Server or Client #

// Start as server (Group Owner)
await WifiDirectPlugin.startAsServer('MyDevice');
await WifiDirectPlugin.startDiscovery();

// OR start as client
await WifiDirectPlugin.startAsClient('MyClientDevice');
await WifiDirectPlugin.startDiscovery();

4. Connect to Peers #

// Connect to a discovered peer
await WifiDirectPlugin.connect(peerDeviceAddress);

5. Send Data #

// Send text message
await WifiDirectPlugin.sendText('Hello, peer device!');

// Send file
await WifiDirectPlugin.sendFile('/path/to/your/file.pdf');

// Send image
await WifiDirectPlugin.sendImage('/path/to/your/image.jpg');

Advanced Usage #

Progress Tracking #

Monitor file and image transfer progress:

WifiDirectPlugin.onSendProgress = (fileName, progress) {
  print('Sending $fileName: ${(progress * 100).toStringAsFixed(1)}%');
};

WifiDirectPlugin.onFileProgress = (fileName, progress) {
  print('Receiving $fileName: ${(progress * 100).toStringAsFixed(1)}%');
};

Connection Management #

// Get current connection info
WifiDirectConnectionInfo? info = await WifiDirectPlugin.getCurrentConnectionInfo();

// Get connected device details
Map<String, dynamic>? deviceInfo = await WifiDirectPlugin.getConnectedDeviceInfo();

// Get peer display information
String peerInfo = await WifiDirectPlugin.getPeerDisplayInfo();

// Disconnect from current peer
await WifiDirectPlugin.disconnect();

Complete Example #

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

class WiFiDirectExample extends StatefulWidget {
  @override
  _WiFiDirectExampleState createState() => _WiFiDirectExampleState();
}

class _WiFiDirectExampleState extends State<WiFiDirectExample> {
  List<WifiDirectDevice> peers = [];
  bool isConnected = false;
  String connectionStatus = 'Disconnected';

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

  Future<void> initializeWiFiDirect() async {
    // Initialize plugin
    await WifiDirectPlugin.initialize();

    // Setup listeners
    WifiDirectPlugin.connectionStream.listen((info) {
      setState(() {
        isConnected = info.isConnected;
        connectionStatus = info.isConnected ? 'Connected' : 'Disconnected';
      });
    });

    WifiDirectPlugin.peersStream.listen((discoveredPeers) {
      setState(() {
        peers = discoveredPeers;
      });
    });

    WifiDirectPlugin.onTextReceived = (text) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Received: $text')),
      );
    };
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WiFi Direct Example'),
      ),
      body: Column(
        children: [
          Text('Status: $connectionStatus'),
          ElevatedButton(
            onPressed: () async {
              await WifiDirectPlugin.startAsServer('MyDevice');
              await WifiDirectPlugin.startDiscovery();
            },
            child: Text('Start as Server'),
          ),
          ElevatedButton(
            onPressed: () async {
              await WifiDirectPlugin.startAsClient('MyClient');
              await WifiDirectPlugin.startDiscovery();
            },
            child: Text('Start as Client'),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: peers.length,
              itemBuilder: (context, index) {
                final peer = peers[index];
                return ListTile(
                  title: Text(peer.deviceName),
                  subtitle: Text(peer.deviceAddress),
                  onTap: () async {
                    await WifiDirectPlugin.connect(peer.deviceAddress);
                  },
                );
              },
            ),
          ),
          if (isConnected)
            ElevatedButton(
              onPressed: () async {
                await WifiDirectPlugin.sendText('Hello from Flutter!');
              },
              child: Text('Send Message'),
            ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    WifiDirectPlugin.cleanup();
    super.dispose();
  }
}

API Reference #

Core Methods #

Method Description
initialize() Initialize the WiFi Direct plugin
startAsServer(deviceName) Start as server/group owner
startAsClient(deviceName) Start as client
startDiscovery() Begin peer discovery
stopDiscovery() Stop peer discovery
connect(deviceAddress) Connect to a specific peer
disconnect() Disconnect from current peer
cleanup() Clean up plugin resources

Data Transfer Methods #

Method Description
sendText(text) Send text message
sendFile(filePath) Send file with progress tracking
sendImage(imagePath) Send image with chunked transfer

Information Methods #

Method Return Type Description
getCurrentConnectionInfo() WifiDirectConnectionInfo? Get current connection details
getConnectedDeviceInfo() Map<String, dynamic>? Get connected device information
getPeerDisplayInfo() String Get formatted peer information
getPeerIpAddress() String? Get peer IP address

Streams and Callbacks #

Stream/Callback Type Description
connectionStream Stream<WifiDirectConnectionInfo> Connection status updates
peersStream Stream<List<WifiDirectDevice>> Discovered peers
onTextReceived Function(String) Text message received
onFileReceived Function(File) File received
onImageReceived Function(File) Image received
onSendProgress Function(String, double) Send progress updates
onFileProgress Function(String, double) Receive progress updates

Requirements #

Android #

  • Minimum SDK: API 21 (Android 5.0)
  • WiFi Direct capable device
  • Location permissions for peer discovery

iOS #

  • Minimum version: iOS 9.0
  • MultipeerConnectivity framework support
  • Local network access permissions

Limitations #

  • Range: Communication range depends on WiFi Direct/MultipeerConnectivity capabilities (typically 30-200 meters)
  • Device Limit: Limited number of simultaneous connections (typically 8 devices max)
  • iOS: Uses MultipeerConnectivity which may have different behavior compared to Android WiFi Direct
  • Background: Limited background operation support depending on platform

Contributing #

Contributions are welcome! Please read our contributing guidelines and submit pull requests to our repository.

License #

This project is licensed under the MIT License - see the LICENSE file for details.

Changelog #

See CHANGELOG.md for a detailed list of changes and updates.

1
likes
0
points
48
downloads

Publisher

unverified uploader

Weekly Downloads

A comprehensive Flutter plugin for WiFi Direct (P2P) communication with real-time messaging, file transfer, and cross-platform support for Android and iOS.

Homepage

License

unknown (license)

Dependencies

crypto, device_info_plus, file_picker, flutter, image_picker, path_provider, permission_handler, plugin_platform_interface

More

Packages that depend on wifi_direct_plugin

Packages that implement wifi_direct_plugin