sendMeasure static method
Implementation
static Future<ScpStatusMeasure> sendMeasure(
ScpDevice device, String action) async {
ScpStatusMeasure status = ScpStatusMeasure(ScpStatus.RESULT_ERROR);
// get NVCN
print('Fetching NVCN');
var nvcnResponse = await fetchNVCN(device);
if (nvcnResponse == null) {
status.status = ScpStatus.RESULT_ERROR_FAILED_FETCHING_NVCN;
}
if (nvcnResponse.statusCode != 200 || nvcnResponse.bodyBytes == 0) {
status.status = ScpStatus.RESULT_ERROR;
}
ScpResponseFetchNvcn parsedNvcnResponse =
await ScpResponseParser.parseNvcnResponse(nvcnResponse);
String nvcn = parsedNvcnResponse.getNVCN();
//send control command
// <salt> + ":" + "control" + ":" + <device ID> + ":" + <NVCN> + ":" + action
String salt = ScpCrypto().generatePassword();
String payload = "$salt:measure:${device.deviceId}:$nvcn:$action";
ScpJson scpJson =
await ScpCrypto().encryptThenEncode(device.knownPassword, payload);
// await response
print('Send measure command: $action');
Uri url = Uri.http(
'${device.ipAddress}:$PORT',
'/secure-control',
{
'nonce': '${scpJson.encryptedPayload.base64Nonce}',
'payload': '${scpJson.encryptedPayload.base64Data}',
'payloadLength': '${scpJson.encryptedPayload.dataLength}',
'mac': '${scpJson.encryptedPayload.base64Mac}',
},
);
var measureResponse = await http
.get(url)
.timeout(const Duration(seconds: CONTROL_TIMEOUT))
.catchError((e) {
print(e);
});
if (measureResponse.bodyBytes != null) {
if (measureResponse.statusCode == 200) {
ScpResponseMeasure parsedResponse =
await ScpResponseParser.parseMeasureResponse(
measureResponse, device.knownPassword);
if (parsedResponse.isValid()) {
if (parsedResponse.getResult() == ScpStatus.RESULT_SUCCESS &&
action == parsedResponse.getAction()) {
print(
'Successfully measured $action: ${parsedResponse.getValue()}.');
status.status = ScpStatus.RESULT_SUCCESS;
status.value = parsedResponse.getValue();
} else if (parsedResponse.getResult() == ScpStatus.RESULT_ERROR ||
action != parsedResponse.getAction()) {
print('Failed measuring $action.');
status.status = ScpStatus.RESULT_ERROR;
}
}
} else {
('Status code not 200: ${measureResponse.statusCode}');
status.status = ScpStatus.RESULT_ERROR;
}
}
return status;
}