Skip to content

Commit

Permalink
💾 Feat: Now you can manually stop devices service and restart it.
Browse files Browse the repository at this point in the history
  • Loading branch information
Dynesshely committed Mar 23, 2023
1 parent 91f4f1f commit 0bba68f
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 9 deletions.
7 changes: 2 additions & 5 deletions kitx_mobile/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,8 @@ Future<void> main() async {
await Config.loadAsync();

// 初始化 WebService
var webService = WebService()
..udpPortSend = Config.WebService_UdpPortSend
..udpPortReceive = Config.WebService_UdpPortReceive
..udpBroadcastAddress = Config.WebService_UdpBroadcastAddress;
webService.initService();

Global.webService.initService();

// 初始化 log
initLogger();
Expand Down
5 changes: 5 additions & 0 deletions kitx_mobile/lib/services/device_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ class DeviceService {
}
}

/// 停止服务
Future<void> stopService() async {
deviceInfoList.clear();
}

/// Remove a device by [DeviceInfoStruct]
Future<void> initService() async {
Timer.periodic(Duration(seconds: Config.WebService_DeviceInfoCheckTTLSeconds), (_) {
Expand Down
29 changes: 27 additions & 2 deletions kitx_mobile/lib/services/web_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,24 @@ class WebService {
return [_ipv4, _ipv6, _mac];
}

/// 停止服务
Future<void> stopService() async {
sendTimer?.cancel();
sendTimer = null;

receiveSocket?.close();
sendSocket?.close();

receiveSocket = null;
sendSocket = null;
}

/// 发送及接收定时器的指针
late Timer? sendTimer;

/// 发送及接收套接字的指针
late RawDatagramSocket? sendSocket, receiveSocket;

/// 初始化服务
Future<void> initService() async {
try {
Expand Down Expand Up @@ -165,18 +183,22 @@ class WebService {
// UDP 发送
await RawDatagramSocket.bind(InternetAddress.anyIPv4, _udpPortSend).then(
(socket) {
sendSocket = socket;

socket.broadcastEnabled = true;
socket.joinMulticast(InternetAddress(_udpBroadcastAddress));

Timer.periodic(Duration(seconds: Config.WebService_UdpSendFrequency), (timer) {
sendTimer = timer;

try {
deviceInfo = deviceInfo.rebuild((b) => b..sendTime = DateTime.now().toUtc());
var _data = deviceInfo.toString();
// Log.info('UDP send: $_data');
socket.send(utf8.encode(_data), InternetAddress(_udpBroadcastAddress), _udpPortReceive);
} catch (e, stack) {
socket.close();
timer.cancel();
socket.close();
Log.info('UDP send error: $e $stack. Try to restart the service in 5 seconds.');
Future.delayed(const Duration(seconds: 5), () => initService());
}
Expand All @@ -192,8 +214,11 @@ class WebService {
// UDP 接收
await RawDatagramSocket.bind(InternetAddress.anyIPv4, _udpPortReceive, ttl: 1).then(
(socket) {
receiveSocket = socket;

// socket.broadcastEnabled = true;
socket.joinMulticast(InternetAddress(_udpBroadcastAddress));

socket.listen(
(event) {
var d = socket.receive();
Expand All @@ -204,7 +229,7 @@ class WebService {

try {
var _deviceInfo = DeviceInfoStruct.fromString(_data);
if (_deviceInfo != null) Global.device.addDevice(_deviceInfo);
if (_deviceInfo != null) Global.deviceService.addDevice(_deviceInfo);
} catch (e, stack) {
Log.error('Can not deserialize device info pack: `$_data`. Error: $e $stack');
}
Expand Down
20 changes: 18 additions & 2 deletions kitx_mobile/lib/utils/global.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'package:kitx_mobile/services/device_service.dart';
import 'package:kitx_mobile/services/web_service.dart';
import 'package:kitx_mobile/themes/dark_theme.dart';
import 'package:kitx_mobile/themes/light_theme.dart';
import 'package:kitx_mobile/utils/config.dart';

import 'package:package_info_plus/package_info_plus.dart';
import 'package:url_launcher/url_launcher_string.dart';
Expand All @@ -15,6 +17,11 @@ class _Global {

bool get isDebug => !isRelease;

var webService = WebService()
..udpPortSend = Config.WebService_UdpPortSend
..udpPortReceive = Config.WebService_UdpPortReceive
..udpBroadcastAddress = Config.WebService_UdpBroadcastAddress;

var deviceName = '';
var device = DeviceService();
var deviceError = false;
Expand Down Expand Up @@ -68,9 +75,18 @@ class _Global {
);
}

void restartDevicesServer() {}
void restartDevicesServer() {
webService.stopService();
deviceService.stopService();

webService.initService();
}

void shutdownDevicesServer() {}
void shutdownDevicesServer() {
webService.stopService();

deviceService.stopService();
}

factory _Global() {
return _singleton;
Expand Down

0 comments on commit 0bba68f

Please sign in to comment.