sendWifiConfig static method
Implementation
static sendWifiConfig(
ScpDevice device, String ssid, String preSharedKey) async {
// get NVCN
print('Fetching NVCN');
var nvcnResponse = await fetchNVCN(device);
if (nvcnResponse == null) {
return ScpStatus.RESULT_ERROR;
}
if (nvcnResponse.statusCode != 200 || nvcnResponse.bodyBytes == 0) {
return ScpStatus.RESULT_ERROR;
}
ScpResponseFetchNvcn parsedNvcnResponse =
await ScpResponseParser.parseNvcnResponse(nvcnResponse);
String nvcn = parsedNvcnResponse.getNVCN();
//send new wifi credentials
// <salt> + ":" + "security-wifi-config" + ":" + <device ID> + ":" + <NVCN> + ":" + <ssid> + ":" + <pre-shared-key>
String salt = ScpCrypto().generatePassword();
String payload =
"$salt:security-wifi-config:${device.deviceId}:$nvcn:$ssid:$preSharedKey";
print('Sending wifi config: $payload');
ScpJson scpJson =
await ScpCrypto().encryptThenEncode(device.knownPassword, payload);
String query = "nonce=${urlEncode(scpJson.encryptedPayload.base64Nonce)}";
query += "&payload=${urlEncode(scpJson.encryptedPayload.base64Data)}";
query += "&payloadLength=${scpJson.encryptedPayload.dataLength}";
query += "&mac=${urlEncode(scpJson.encryptedPayload.base64Mac)}";
// await response
print('Setting new wifi credentials');
Uri url = Uri.dataFromString(
'http://${device.ipAddress}:$PORT/secure-control?$query');
var setWifiCredentialsResponse = await http
.get(url)
.timeout(const Duration(seconds: SET_WIFI_CREDS_TIMEOUT))
.catchError((e) {
print('$e');
});
if (setWifiCredentialsResponse.bodyBytes != null) {
if (setWifiCredentialsResponse.statusCode == 200) {
ScpResponseSetWifiConfig parsedResponse =
await ScpResponseParser.parseSetWifiConfigResponse(
setWifiCredentialsResponse, device.knownPassword);
if (parsedResponse.isValid()) {
if (parsedResponse.getResult() == ScpStatus.RESULT_SUCCESS) {
print('Successfully set Wifi config, ready for restart.');
return ScpStatus.RESULT_DONE;
} else if (parsedResponse.getResult() == ScpStatus.RESULT_ERROR) {
print('Failed setting Wifi config.');
return ScpStatus.RESULT_ERROR;
}
}
}
}
return ScpStatus.RESULT_ERROR;
}