使用 InfluxDB Cloud 构建实时 Android 应用:数据记录、查询和可视化
作者:Suyash Joshi / 开发者
2024 年 9 月 10 日
导航到
随着超过 80 亿部智能手机在使用,主要是运行 Android 系统,您如何高效地管理和分析由应用、游戏和其他服务产生的实时数据洪流?无论是跟踪用户交互、监控健康指标还是管理物联网设备,处理这些数据可能令人不知所措。现在有了 InfluxDB Cloud Serverless——一个强大且免费的服务,让开发者无需信用卡即可开始存储、查询和可视化实时数据,轻松获得宝贵见解。
在本篇文章中,我们将探讨如何通过“传感器记录”用例将 Android(Java)与 InfluxDB 集成。我们将构建一个 Android Java 应用,捕获运动数据,特别是来自智能手机 x、y 和 z 轴的加速度计和陀螺仪数据,并将其存储在 InfluxDB Cloud 中。这些数据将以亚秒级速度摄取,然后在应用中进行查询,以使用第三方图表库显示折线图。
先决条件
-
请确保您已安装最新版本的 Android Studio。
-
账户信息:您需要访问一个 InfluxDB 实例(本地或基于云)以获取您的 URL、API 令牌、组织名称和桶名称。
-
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或社区论坛与我们联系。