app-starlock/lib/talk/udp/udp_manage.dart

120 lines
3.2 KiB
Dart
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'dart:io';
import 'package:star_lock/talk/udp/udp_reciverData.dart';
import '../../app_settings/app_settings.dart';
import '../../blue/io_tool/io_model.dart';
import '../../blue/io_tool/manager_event_bus.dart';
class UDPManage {
static UDPManage? _manager;
UDPManage._init() {
initUdp();
_streamSubscription = EventBusManager()
.eventBus!
.on<EventSendModel>()
.listen((EventSendModel sendModel) {
// AppLog.log("sendModel.sendChannel:${sendModel.sendChannel}");
if (sendModel.sendChannel == DataChannel.udp) {
List<int> data = sendModel.data;
sendData(data);
}
});
}
static UDPManage _share() {
_manager ??= UDPManage._init();
return _manager!;
}
factory UDPManage() => _share();
UDPManage get manager => _share();
StreamSubscription<EventSendModel>? _streamSubscription;
RawDatagramSocket? _udpSocket;
String host = '';
int port = 0;
String lockId = ''; // 锁id 通过锁id来判断是哪把锁发对讲过来
int remoteUnlock = 0; // 是否远程开锁 1开启 0关闭
void initUdp() async {
var listAddress = InternetAddress.lookup(host);
listAddress.then((list) {
list.forEach((element) {
AppLog.log('Udp ----> element.address:${element.address} element.host:${element.host}');
host = element.address;
});
});
await _initUdp();
}
Future<void> _initUdp() async {
if (port == 0) {
// AppLog.log('❌ Udp ----> _port == 0');
return;
}
AppLog.log('Udp ----> host:$host port:$port');
var addressIListenFrom = InternetAddress.anyIPv4;
int portIListenOn = 62288;
// if(addressIListenFrom.address != '0.0.0.0'){
RawDatagramSocket.bind(addressIListenFrom, portIListenOn)
.then((RawDatagramSocket socket) {
_udpSocket = socket;
///广播功能
_udpSocket!.broadcastEnabled = true;
_onReceiveData(socket);
});
// }
}
void _onReceiveData(RawDatagramSocket socket) {
socket.listen((RawSocketEvent event) {
if (event == RawSocketEvent.read) {
Datagram? dg = socket.receive();
try {
// AppLog.log(
// 'Did received data on the stream (length --> ${dg!.data.length}) dg!.data:${dg!.data}');
// EventBusManager().eventBusFir(EventReceiveModel(data: dg?.data,sendChannel: DataChannel.udp));
CommandUDPReciverManager.appDataReceive(dg!.data);
} catch (e) {
AppLog.log('❌ Udp ----> $e');
}
}
});
}
void sendData(List<int> data) {
if (null == _udpSocket || null == data || data.isEmpty || host == '') {
if (null == _udpSocket) {
// AppLog.log('❌ Udp ----> null == _udpSocket');
initUdp();
}
return;
}
try {
// AppLog.log("sendData:$data");
var result = _udpSocket?.send(data, InternetAddress(host), port);
if (result != data.length) {
AppLog.log('❌Udp ----> send data $result ${data.length}');
_udpSocket = null;
}
} catch (e) {}
}
bool exitUdpSocket() {
if (null != _udpSocket) {
AppLog.log('❌ Udp ----> close');
_udpSocket?.close();
}
return true;
}
void disposed() {
_streamSubscription?.cancel();
}
}