Add WiZ provisioning wizard
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user