sendMeasure static method

Future<ScpStatusMeasure> sendMeasure(
  1. ScpDevice device,
  2. String action
)

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;
}