Files
ignis_app/lib/features/provisioning/services/wiz_smart_pairing_service.dart
2026-05-16 17:24:28 +07:00

94 lines
2.3 KiB
Dart

import 'dart:async';
import 'package:esp_smartconfig/esp_smartconfig.dart';
import '../models/wiz_provisioning_device.dart';
abstract class WizSmartPairingService {
Stream<WizProvisioningDevice> startProvisioning({
required String ssid,
required String password,
String? bssid,
});
Future<void> stopProvisioning();
}
class EspTouchWizSmartPairingService implements WizSmartPairingService {
Provisioner? _provisioner;
StreamSubscription<ProvisioningResponse>? _subscription;
StreamController<WizProvisioningDevice>? _controller;
@override
Stream<WizProvisioningDevice> startProvisioning({
required String ssid,
required String password,
String? bssid,
}) {
if (_provisioner != null || _controller != null) {
throw StateError('Provisioning is already running');
}
final provisioner = Provisioner.espTouch();
final controller = StreamController<WizProvisioningDevice>.broadcast();
_provisioner = provisioner;
_controller = controller;
_subscription = provisioner.listen(
(response) {
controller.add(
WizProvisioningDevice(
bssid: response.bssidText,
ipAddress: response.ipAddressText,
),
);
},
onError: controller.addError,
onDone: () async {
if (!controller.isClosed) {
await controller.close();
}
},
);
final request = ProvisioningRequest.fromStrings(
ssid: ssid,
bssid: (bssid == null || bssid.trim().isEmpty)
? '00:00:00:00:00:00'
: bssid.trim(),
password: password.isEmpty ? null : password,
);
unawaited(
provisioner.start(request).catchError((
Object error,
StackTrace stack,
) async {
if (!controller.isClosed) {
controller.addError(error, stack);
await controller.close();
}
}),
);
return controller.stream;
}
@override
Future<void> stopProvisioning() async {
final provisioner = _provisioner;
_provisioner = null;
try {
provisioner?.stop();
} finally {
await _subscription?.cancel();
_subscription = null;
if (_controller != null && !_controller!.isClosed) {
await _controller!.close();
}
_controller = null;
}
}
}