使用 InfluxDB Cloud 构建实时 Android 应用:数据记录、查询和可视化

导航到

随着超过 80 亿部智能手机在使用,主要是运行 Android 系统,您如何高效地管理和分析由应用、游戏和其他服务产生的实时数据洪流?无论是跟踪用户交互、监控健康指标还是管理物联网设备,处理这些数据可能令人不知所措。现在有了 InfluxDB Cloud Serverless——一个强大且免费的服务,让开发者无需信用卡即可开始存储、查询和可视化实时数据,轻松获得宝贵见解。

在本篇文章中,我们将探讨如何通过“传感器记录”用例将 Android(Java)与 InfluxDB 集成。我们将构建一个 Android Java 应用,捕获运动数据,特别是来自智能手机 x、y 和 z 轴的加速度计和陀螺仪数据,并将其存储在 InfluxDB Cloud 中。这些数据将以亚秒级速度摄取,然后在应用中进行查询,以使用第三方图表库显示折线图。

Building-Real-Time-Android-Apps

先决条件

  1. 请确保您已安装最新版本的 Android Studio

  2. 账户信息:您需要访问一个 InfluxDB 实例(本地或基于云)以获取您的 URL、API 令牌、组织名称和桶名称。

  3. Gradle 依赖项:您的项目必须包括用于数据可视化的 InfluxDB Java 客户端库MPAndroidChart 库

在您的模块的 build.gradle 文件中,添加以下依赖项以下载和使用 InfluxDB 客户端库。

dependencies {
    implementation 'com.influxdb:influxdb-client-java:6.10.0'
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
  }

初始化 InfluxDB 客户端

首先在您的 Android 应用中初始化 InfluxDB 客户端。InfluxDBManager 类管理连接并处理数据写入和查询。

private void initializeClient() {
  String url = sharedPreferences.getString("INFLUX\_URL", "");
  String apiToken = sharedPreferences.getString("INFLUX\_API\_TOKEN", "");
  String org = sharedPreferences.getString("INFLUX\_ORG", "");
  String bucket = sharedPreferences.getString("INFLUX\_BUCKET", "");

  this.influxDBClient = InfluxDBClientFactory.create(url, apiToken.toCharArray(), org, bucket);
  this.writeApi = influxDBClient.makeWriteApi();
  this.executorService = Executors.newSingleThreadExecutor();
  this.isOpen = true;
}

使用点对象将传感器数据写入 InfluxDB 桶

当应用捕获传感器数据时,它会使用 writeSensorData() 方法将其写入 InfluxDB。数据包括每个轴上的加速度计和陀螺仪读数。

public void writeSensorData(String measurement, float accelX, float accelY, float accelZ, float gyroX, float gyroY, float gyroZ) {
  if (!isOpen) {
    Log.e("InfluxDBManager", "InfluxDB client is not initialized. Please set credentials first.");
    return;
  }

 Log.d("InfluxDBManager", "Writing data: AccelX=" + accelX + ", AccelY=" + accelY + ", AccelZ=" + accelZ + ", GyroX=" + gyroX + ", GyroY=" + gyroY + ", GyroZ=" + gyroZ);

 Point point = Point.measurement(measurement)
    .addTag("device", android.os.Build.MODEL)
    .addField("accel\_x", accelX)
    .addField("accel\_y", accelY)
    .addField("accel\_z", accelZ)
    .addField("gyro\_x", gyroX)
    .addField("gyro\_y", gyroY)
    .addField("gyro\_z", gyroZ)
    .time(Instant.now(), WritePrecision.MS);

executorService.execute(() -> {
    try {
      writeApi.writePoint(point);
    } 
    catch (Exception e) {
      Log.e("InfluxDBManager", "Error writing to InfluxDB", e);
    }
  });
}

从 InfluxDB 查询数据

为了可视化捕获的数据,应用程序使用Flux(目前Flux支持仅限于云无服务器)从InfluxDB查询它。以下方法检索过去10分钟内的数据,并将其分组到5秒间隔。

public void querySensorData(String query, QueryCallback callback) {
  executorService.execute(() -> {
    try {
      QueryApi queryApi = influxDBClient.getQueryApi();
      List<FluxTable> tables = queryApi.query(query);
      callback.onSuccess(tables);
    } 
    catch (Exception e) {
      Log.e("InfluxDBManager", "Error querying InfluxDB", e);
      callback.onError(e);
    }
  });
}

使用GraphActivity显示传感器数据

GraphActivity中,使用MPAndroidChart库创建的折线图显示查询的传感器数据。《refreshData()`方法使用InfluxDB无服务器云存储桶的最新数据更新图表,该存储桶刚刚存储了相同的数据。

private void refreshData() {
  String bucket = influxDBManager.getBucket();
  String flux = "from(bucket:\"" + bucket + "\") " +
    "|> range(start: -10m) " +
    "|> filter(fn:(r) => r.\_measurement == \"sensor\_data\") " +
    "|> filter(fn:(r) => r.\_field == \"accel\_x\" or r.\_field == \"gyro\_x\") " +
    "|> aggregateWindow(every: 1s, fn: mean, createEmpty: false) " +
    "|> yield(name: \"mean\")";

influxDBManager.querySensorData(flux, new InfluxDBManager.QueryCallback() {
    @Override
    public void onSuccess(List<FluxTable> tables) {
      List<Entry> accelEntries = new ArrayList<>();
      List<Entry> gyroEntries = new ArrayList<>();

      for (FluxTable table : tables) {
        for (FluxRecord record : table.getRecords()) {
          long time = record.getTime().toEpochMilli();
          double value = (double) record.getValue();
          String field = record.getField();

          if ("accel\_x".equals(field)) {
            accelEntries.add(new Entry(time, (float) value));
          } 
          else if ("gyro\_x".equals(field)) {
            gyroEntries.add(new Entry(time, (float) value));
          }
        }
      }
      runOnUiThread(() -> updateChart(accelEntries, gyroEntries));
    }
    @Override
    public void onError(Exception e) {
      Log.e("GraphActivity", "Error fetching data from InfluxDB", e);
      runOnUiThread(() -> Toast.makeText(GraphActivity.this, "Error fetching data: " + e.getMessage(), Toast.LENGTH\_LONG).show());
    }
  });
}

结论

通过将InfluxDB与Android集成,开发人员可以有效地管理和可视化智能手机传感器的实时数据。无论是健康跟踪、可穿戴应用还是游戏,此设置都允许在应用程序内无缝地进行数据记录、查询和可视化。请随意在GitHub上探索示例应用程序,并记住您可以使用InfluxDB Cloud免费。如果您有任何问题或反馈,请随时通过我们的社区Slack社区论坛与我们联系。