flutter_p2p는 플랫폼의 네이티브 WiFi P2P API를 사용하여 안드로이드 기기에서 WiFi Direct 연결을 가능하게 하는 플러터 플러그인입니다. 중앙 액세스 포인트 없이 근처 장치를 직접 탐지하고 연결할 수 있게 해줍니다. 이는 피어 투 피어 파일 공유, 실시간 통신 또는 로컬 장치 협업에 이상적입니다. 이 플러그인은 연결 관리, 피어 스캔 및 데이터 전송을 위한 간단한 인터페이스를 제공합니다. Android 전용이며 iOS나 기타 플랫폼은 지원하지 않습니다.
사용 사례
디바이스 간 직접 파일 전송
로컬 멀티플레이어 게임
오프라인 데이터 동기화
사물인터넷 장치 쌍화
실시간 센서 데이터 공유
주요 기능
네이티브 안드로이드 와이파이 P2P 통합
장치 탐지 및 연결 관리
안전한 피어 투 피어 통신
간단한 Dart API
플랫폼별 구현
적합한 대상
Android 전용 애플리케이션
로컬 네트워크 통신
저지연 장치 상호작용
직접 장치 링크가 필요한 앱
중앙 집중형 인프라를 피하는 프로젝트
고려 사항
Android에서만 작동합니다
WiFi P2P 권한 필요
로컬 네트워크 범위로 제한됨
iOS 지원 없음
기기 하드웨어 호환성에 따라 다릅니다
원본 README
연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
flutter_p2p
A Wi-Fi Direct Plugin for Flutter.
This plugin is in alpha and only supports android at the moment.
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_MyAppStateextendsState<MyApp> withWidgetsBindingObserver{
@overridevoidinitState() {
super.initState();
_register();
WidgetsBinding.instance.addObserver(this);
}
@overridevoiddispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@overridevoiddidChangeAppLifecycleState(AppLifecycleState state) {
// Stop handling events when the app doesn't run to prevent battery drainingif (state == AppLifecycleState.resumed) {
_register();
} elseif (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 subscriptionsFlutterP2p.unregister(); // Unregister from native events
}
}
Discover devices
After you subscribed to the events you only need to call the FlutterP2p.discoverDevices() method.
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 socketP2pSocket _socket;
void_openPortAndAccept(int port) async {
var socket = awaitFlutterP2p.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")` methodprint("_openPort done");
// accept a connection on the created socketawaitFlutterP2p.acceptPort(port);
print("_accept done");
}
On the client:
// Connect to the port and create a socketP2pSocket _socket;
_connectToPort(int port) async {
var socket = awaitFlutterP2p.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")` methodprint("_connectToPort done");
}