使用 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 令牌、组织名称和 Bucket 名称。

  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 Bucket

当应用程序捕获传感器数据时,它使用 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 从 InfluxDB 查询数据(flux 支持目前仅限于云端 Serverless)。以下方法检索过去 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 Serverless 云 Bucket 的最新数据更新图表,该 Bucket 刚刚存储了相同的数据。

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社区论坛 与我们联系。