Обнаружение UDP-устройств не работает в Windows с FlutterAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Обнаружение UDP-устройств не работает в Windows с Flutter

Сообщение Anonymous »

Я работаю над приложением Flutter, целью которого является предоставление устройствам возможности обнаруживать друг друга путем непрерывной отправки и получения UDP-пакетов. Конкретные функции следующие:
На устройствах Android можно обнаружить другие устройства Android.
На устройствах Windows я не могу обнаружить другие устройства, но могу обнаружить Windows. устройства с устройств Android.
Я пробовал следующие решения:
Брандмауэр Windows отключен и установлены исключения брандмауэра.
Отключил стороннее антивирусное ПО.
Несмотря на несмотря на вышеизложенное, проблема сохраняется.
Я ожидаю, что устройства Windows и Android смогут обеспечить взаимное обнаружение устройств через UDP.
Вот моя реализация кода:

Код: Выделить всё

import 'dart:async';
import 'dart:convert';
import 'dart:io'; // Only for non-Web platforms
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'file_select_page.dart'; // Ensure to import file_select_page

class TransferPage extends StatefulWidget {
const TransferPage({Key? key}) : super(key: key);

@override
_TransferPageState createState() => _TransferPageState();
}

class _TransferPageState extends State {
List devices = [];
bool isScanning = false;
late RawDatagramSocket receiver;
Timer? scanTimer;

@override
void initState() {
super.initState();
startListening();
scanNetwork(); // Start scanning on initialization
}

Future startListening() async {
receiver = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 22473);
receiver.listen((RawSocketEvent event) async {
if (event == RawSocketEvent.read) {
Datagram? datagram = receiver.receive();
if (datagram != null) {
_handleReceivedData(datagram);
}
}
});
}

void _handleReceivedData(Datagram datagram) async {
try {
final message = utf8.decode(datagram.data, allowMalformed: true);
final ip = datagram.address.address;

if (ip != await _getCurrentIP()) {
final parts = message.split(';');
String deviceBrand = parts.length > 1 ? parts[1].replaceFirst('Brand:', '') : 'Unknown Brand';
String deviceModel = parts.length > 2 ? parts[2].replaceFirst('Model:', '') : 'Unknown Model';

// Deduplication check
if (!devices.any((device) => device['ip'] == ip)) {
setState(() {
devices.add({
'ip': ip,
'port': '22473',
'status': 'Responded',
'brand': deviceBrand,
'model': deviceModel
});
});
}
}
} catch (e) {
print('Failed to decode data: $e'); // Handle decode failure
}
}

Future scanNetwork() async {
setState(() {
isScanning = true;
devices.clear(); // Clear device list for new scan
});

if (kIsWeb) {
// Logic for Web platform
return; // Broadcasting not supported on Windows for now
} else {
// Get current IP on non-Web platforms (like Windows)
String? wifiIP = await _getCurrentIP();
if (wifiIP == null) {
setState(() {
isScanning = false;
});
return;
}

String broadcastAddress = await getBroadcastAddress(wifiIP);

// Start periodic broadcasting
Timer.periodic(Duration(seconds: 1), (timer) async {
await sendBroadcast(broadcastAddress); // Use dynamically calculated broadcast address
});

// Set scan timeout
scanTimer = Timer(Duration(seconds: 5), stopScanning);
}
}

Future sendBroadcast(String address) async {
String message;

// Use Platform property only on non-Web platforms
if (Platform.isWindows) {
message = 'Hello from Windows;Brand:Windows;Model:PC';
} else {
String deviceBrand = await _getDeviceBrand();
String deviceModel = await _getDeviceModel();
message = 'Hello from Flutter;Brand:$deviceBrand;Model:$deviceModel';
}

RawDatagramSocket sender = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0);
sender.send(utf8.encode(message), InternetAddress(address), 22473); // Send to specified address
sender.close();
}

Future _getCurrentIP() async {
final info = NetworkInfo();
return await info.getWifiIP();
}

Future  _getDeviceBrand() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
String brand = "Unknown Brand";

if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
brand = androidInfo.brand!;
} else if (Platform.isIOS) {
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
brand = iosInfo.utsname.machine!;
}

return brand;
}

Future _getDeviceModel() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
String model = "Unknown Model";

if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
model = androidInfo.model!;
} else if (Platform.isIOS) {
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
model = iosInfo.utsname.machine!;
}

return model;
}

Future getBroadcastAddress(String ip) async {
List parts = ip.split('.');
return '${parts[0]}.${parts[1]}.${parts[2]}.255'; // Assuming subnet mask is 255.255.255.0
}

void stopScanning() {
setState(() {
isScanning = false;
});
scanTimer?.cancel();
}

@override
void dispose() {
receiver.close();
scanTimer?.cancel();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('File Transfer'),
actions: [
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
scanNetwork();
},
),
],
),
body: isScanning
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: devices.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
// Navigate to file_select_page on tapping device
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TransferFilesPage(
deviceName: devices[index]['brand'] ?? 'Unknown Brand',
deviceIp: devices[index]['ip'] ?? 'Unknown IP',
),
),
);
},
child: Card(
margin: const EdgeInsets.all(10.0),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(devices[index]['ip'] ?? 'Unknown IP'),
Text('Port: 22473'),
Text('Status: ${devices[index]['status'] ?? 'Unknown'}'),
Text('Brand: ${devices[index]['brand'] ?? 'Unknown Brand'}'),
Text('Model: ${devices[index]['model'] ?? 'Unknown Model'}'),
],
),
],
),
),
),
);
},
),
);
}
}
Желаемое решение:
Как мне успешно обнаружить другие устройства на стороне Windows? Как мне отладить и исправить это? Спасибо вам огромное!


Подробнее здесь: https://stackoverflow.com/questions/792 ... th-flutter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»