2023-12-11 13:44:15 +08:00
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
|
|
import 'package:star_lock/talk/udp/udp_reciverData.dart';
|
|
|
|
|
|
|
2024-04-26 15:38:59 +08:00
|
|
|
|
import '../../app_settings/app_settings.dart';
|
2023-12-11 13:44:15 +08:00
|
|
|
|
import '../../blue/io_tool/io_model.dart';
|
|
|
|
|
|
import '../../blue/io_tool/manager_event_bus.dart';
|
|
|
|
|
|
|
2024-04-01 11:04:34 +08:00
|
|
|
|
class UDPManage {
|
2023-12-11 13:44:15 +08:00
|
|
|
|
static UDPManage? _manager;
|
|
|
|
|
|
|
|
|
|
|
|
UDPManage._init() {
|
|
|
|
|
|
initUdp();
|
2024-04-01 11:04:34 +08:00
|
|
|
|
_streamSubscription = EventBusManager()
|
|
|
|
|
|
.eventBus!
|
|
|
|
|
|
.on<EventSendModel>()
|
|
|
|
|
|
.listen((EventSendModel sendModel) {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
// AppLog.log("sendModel.sendChannel:${sendModel.sendChannel}");
|
2024-04-01 11:04:34 +08:00
|
|
|
|
if (sendModel.sendChannel == DataChannel.udp) {
|
2023-12-11 13:44:15 +08:00
|
|
|
|
List<int> data = sendModel.data;
|
|
|
|
|
|
sendData(data);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-01 11:04:34 +08:00
|
|
|
|
static UDPManage _share() {
|
2023-12-11 13:44:15 +08:00
|
|
|
|
_manager ??= UDPManage._init();
|
|
|
|
|
|
return _manager!;
|
|
|
|
|
|
}
|
2024-04-01 11:04:34 +08:00
|
|
|
|
|
2023-12-11 13:44:15 +08:00
|
|
|
|
factory UDPManage() => _share();
|
|
|
|
|
|
UDPManage get manager => _share();
|
|
|
|
|
|
|
|
|
|
|
|
StreamSubscription<EventSendModel>? _streamSubscription;
|
|
|
|
|
|
RawDatagramSocket? _udpSocket;
|
2023-12-21 10:21:25 +08:00
|
|
|
|
String host = '';
|
|
|
|
|
|
int port = 0;
|
2024-04-01 11:04:34 +08:00
|
|
|
|
String lockId = ''; // 锁id 通过锁id来判断是哪把锁发对讲过来
|
2024-04-11 17:47:43 +08:00
|
|
|
|
int remoteUnlock = 0; // 是否远程开锁 1:开启 0:关闭
|
2023-12-11 13:44:15 +08:00
|
|
|
|
|
|
|
|
|
|
void initUdp() async {
|
2024-04-19 18:22:56 +08:00
|
|
|
|
var listAddress = InternetAddress.lookup(host);
|
|
|
|
|
|
listAddress.then((list) {
|
|
|
|
|
|
list.forEach((element) {
|
2024-11-28 14:57:49 +08:00
|
|
|
|
AppLog.log('Udp ----> element.address:${element.address} element.host:${element.host}');
|
2024-04-19 18:22:56 +08:00
|
|
|
|
host = element.address;
|
2023-12-11 13:44:15 +08:00
|
|
|
|
});
|
2024-04-19 18:22:56 +08:00
|
|
|
|
});
|
2024-04-17 09:42:25 +08:00
|
|
|
|
|
2023-12-11 13:44:15 +08:00
|
|
|
|
await _initUdp();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-20 16:58:31 +08:00
|
|
|
|
Future<void> _initUdp() async {
|
2024-04-01 11:04:34 +08:00
|
|
|
|
if (port == 0) {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
// AppLog.log('❌ Udp ----> _port == 0');
|
2023-12-11 13:44:15 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-11-28 14:57:49 +08:00
|
|
|
|
AppLog.log('Udp ----> host:$host port:$port');
|
2023-12-11 13:44:15 +08:00
|
|
|
|
var addressIListenFrom = InternetAddress.anyIPv4;
|
|
|
|
|
|
int portIListenOn = 62288;
|
2024-11-25 11:07:29 +08:00
|
|
|
|
// if(addressIListenFrom.address != '0.0.0.0'){
|
|
|
|
|
|
RawDatagramSocket.bind(addressIListenFrom, portIListenOn)
|
|
|
|
|
|
.then((RawDatagramSocket socket) {
|
|
|
|
|
|
_udpSocket = socket;
|
2024-04-01 11:04:34 +08:00
|
|
|
|
|
2024-11-25 11:07:29 +08:00
|
|
|
|
///广播功能
|
|
|
|
|
|
_udpSocket!.broadcastEnabled = true;
|
|
|
|
|
|
_onReceiveData(socket);
|
|
|
|
|
|
});
|
|
|
|
|
|
// }
|
2023-12-11 13:44:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void _onReceiveData(RawDatagramSocket socket) {
|
|
|
|
|
|
socket.listen((RawSocketEvent event) {
|
2024-04-01 11:04:34 +08:00
|
|
|
|
if (event == RawSocketEvent.read) {
|
2023-12-11 13:44:15 +08:00
|
|
|
|
Datagram? dg = socket.receive();
|
|
|
|
|
|
try {
|
2024-11-25 11:07:29 +08:00
|
|
|
|
// AppLog.log(
|
|
|
|
|
|
// 'Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}');
|
2023-12-11 13:44:15 +08:00
|
|
|
|
// EventBusManager().eventBusFir(EventReceiveModel(data: dg?.data,sendChannel: DataChannel.udp));
|
|
|
|
|
|
CommandUDPReciverManager.appDataReceive(dg!.data);
|
|
|
|
|
|
} catch (e) {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
AppLog.log('❌ Udp ----> $e');
|
2023-12-11 13:44:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void sendData(List<int> data) {
|
2024-04-01 11:04:34 +08:00
|
|
|
|
if (null == _udpSocket || null == data || data.isEmpty || host == '') {
|
|
|
|
|
|
if (null == _udpSocket) {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
// AppLog.log('❌ Udp ----> null == _udpSocket');
|
2023-12-11 13:44:15 +08:00
|
|
|
|
initUdp();
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
// AppLog.log("sendData:$data");
|
2024-04-01 11:04:34 +08:00
|
|
|
|
var result = _udpSocket?.send(data, InternetAddress(host), port);
|
|
|
|
|
|
if (result != data.length) {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
AppLog.log('❌Udp ----> send data $result ${data.length}');
|
2023-12-11 13:44:15 +08:00
|
|
|
|
_udpSocket = null;
|
|
|
|
|
|
}
|
2024-04-01 11:04:34 +08:00
|
|
|
|
} catch (e) {}
|
2023-12-11 13:44:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-16 18:04:17 +08:00
|
|
|
|
bool exitUdpSocket() {
|
2024-04-01 11:04:34 +08:00
|
|
|
|
if (null != _udpSocket) {
|
2024-04-26 15:38:59 +08:00
|
|
|
|
AppLog.log('❌ Udp ----> close');
|
2023-12-11 13:44:15 +08:00
|
|
|
|
_udpSocket?.close();
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void disposed() {
|
|
|
|
|
|
_streamSubscription?.cancel();
|
|
|
|
|
|
}
|
2024-04-01 11:04:34 +08:00
|
|
|
|
}
|