Flutter数据监控与分析插件influxdb_client的使用
Flutter数据监控与分析插件influxdb_client的使用
概述
influxdb_client
是一个用于与 InfluxDB 2.x 交互的 Dart 客户端库。它支持在 Web、服务器和 Flutter 应用程序中使用。本文将详细介绍如何安装和使用 influxdb_client
插件,包括创建客户端、写入数据、查询数据、删除数据以及管理 API 的使用。
安装
在 pubspec.yaml
文件中添加 influxdb_client
依赖:
dependencies:
influxdb_client: ^2.2.0
然后在 Dart 文件中导入库:
import 'package:influxdb_client/api.dart';
使用
创建客户端
创建 InfluxDBClient
实例时,需要指定 InfluxDB 的 URL 和 Token。还可以设置默认的组织(org)和存储桶(bucket),以及其他选项如调试模式等。
var client = InfluxDBClient(
url: 'http://localhost:8086',
token: 'my-token',
org: 'my-org',
bucket: 'my-bucket',
debug: true);
写入数据
WriteApi
支持异步写入数据到 InfluxDB 2.x。数据可以是字符串形式的 Line Protocol,也可以是 Point
结构体,或者两者的数组。
示例代码
import 'dart:async';
import 'dart:math';
import 'package:influxdb_client/api.dart';
void main() async {
// 创建 InfluxDBClient
var client = InfluxDBClient(
url: 'http://localhost:8086',
token: 'my-token',
org: 'my-org',
bucket: 'my-bucket',
debug: true);
// 创建写服务
var writeApi = client.getWriteService(WriteOptions().merge(
precision: WritePrecision.s,
batchSize: 100,
flushInterval: 5000,
gzip: true));
// 创建数据点列表
var data = List<Point>.empty(growable: true);
var random = Random();
for (var i = 0; i < 10; i++) {
var temperature = random.nextInt(30);
data.add(Point('weather')
.addTag('location', 'Prague')
.addField('temperature', temperature)
.time(DateTime.now().subtract(Duration(days: i)).toUtc()));
}
// 写入数据到 InfluxDB
print(
'\n\n-------------------------------- Write data -------------------------------\n');
await writeApi.write(data).then((value) {
print('Write completed 1');
}).catchError((exception) {
print('Handle write error here!');
print(exception);
});
}
查询数据
QueryService
可以用于从 InfluxDB 查询数据。查询结果可以格式化为 FluxRecord
或者原始字符串。
示例代码
// 创建查询服务并执行查询
var queryService = client.getQueryService();
var fluxQuery = '''
from(bucket: "my-bucket")
|> range(start: -20d)
|> filter(fn: (r) => r["_measurement"] == "weather"
and r["location"] == "Prague")''';
// 查询并迭代所有记录
print(
'\n\n---------------------------------- Query ---------------------------------\n');
var recordStream = await queryService.query(fluxQuery);
print(
'\n\n------------------------------ Query result ------------------------------\n');
await recordStream.forEach((record) {
print(
'Temperature in ${record['location']} at ${record['_time']} is ${record['_value']} °C');
});
删除数据
DeleteService
可以用于从 InfluxDB 删除数据。删除操作需要指定条件、开始时间、结束时间、存储桶和组织。
示例代码
// 删除数据
print(
'\n\n------------------------------- Delete data -------------------------------\n');
await client
.getDeleteService()
.delete(
predicate: '_measurement="weather"',
start: DateTime.parse('1970-01-01T00:00:00Z'),
stop: DateTime.now().toUtc(),
bucket: 'my-bucket',
org: 'my-org')
.catchError((e) => print(e));
管理 API
influxdb_client
还提供了管理 API,可以用于创建、删除存储桶、授权等操作。
示例代码
import 'package:influxdb_client/api.dart';
void main() async {
// 初始化客户端和 API
var client = InfluxDBClient(
url: 'http://localhost:8086', token: 'my-token', org: 'my-org');
// 检查服务器可用性
await client.getPingApi().getPing();
var orgs = await client.getOrganizationsApi().getOrgs();
var myOrgId = orgs.orgs.first.id;
var bucketsApi = client.getBucketsApi();
var bucketName = 'bucket-my-org';
// 查找并删除名为 'bucket-my-org' 的存储桶
var buckets = await bucketsApi.getBuckets(name: bucketName);
if (buckets.buckets.isNotEmpty) {
var bucketID = buckets.buckets.first.id;
await bucketsApi.deleteBucketsID(bucketID);
print('Bucket $bucketID was deleted.');
}
// 存储桶配置
var request = PostBucketRequest(
orgID: myOrgId,
name: bucketName,
retentionRules: [
RetentionRule(type: RetentionRuleTypeEnum.expire, everySeconds: 3600)
]);
var bucket = await bucketsApi.postBuckets(request);
// 创建授权,允许读写新创建的存储桶
var bucketResource =
Resource(type: ResourceTypeEnum.buckets, id: bucket.id, orgID: myOrgId);
// 授权配置
var auth = AuthorizationPostRequest(
description: 'Authorization to read/write bucket:${bucket.name}',
orgID: myOrgId,
permissions: [
Permission(action: PermissionActionEnum.read, resource: bucketResource),
Permission(action: PermissionActionEnum.write, resource: bucketResource)
]);
// 创建授权
var authorizationsApi = client.getAuthorizationsApi();
var authorization = await authorizationsApi.postAuthorizations(auth);
// 打印 Token
var token = authorization.token;
print('The bucket: \'${bucket.name}\' is successfully created.');
print('The following token can be used to read/write: ${token}');
client.close();
}
总结
influxdb_client
是一个功能强大的 Dart 客户端库,适用于与 InfluxDB 2.x 进行数据交互。通过本文的介绍,您应该能够轻松地在 Flutter 应用程序中集成 influxdb_client
,实现数据的写入、查询和删除等操作。希望这些示例代码对您有所帮助!
更多关于Flutter数据监控与分析插件influxdb_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据监控与分析插件influxdb_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中集成并使用influxdb_client
插件进行数据监控与分析,可以通过以下步骤实现。这里将展示如何配置插件、写入数据到InfluxDB以及查询数据的基本代码示例。
1. 添加依赖
首先,在pubspec.yaml
文件中添加influxdb_client
依赖:
dependencies:
flutter:
sdk: flutter
influxdb_client: ^x.y.z # 替换为最新版本号
然后运行flutter pub get
来获取依赖。
2. 配置InfluxDB客户端
在Flutter应用中配置InfluxDB客户端,包括设置连接参数和认证信息。
import 'package:influxdb_client/api.dart';
void configureInfluxDBClient() {
// 替换为你的InfluxDB URL、token和org
final String influxDBUrl = 'http://localhost:8086'; // 或者你的InfluxDB云服务URL
final String token = 'your-influxdb-token';
final String org = 'your-org';
// 创建InfluxDB客户端
final InfluxDBClient client = InfluxDBClient(url: influxDBUrl, token: token, org: org);
// 可以在这里保存client实例以便后续使用
// 例如,可以将其存储在全局变量或依赖注入容器中
}
3. 写入数据到InfluxDB
使用WriteApi
将数据点写入InfluxDB。
import 'package:influxdb_client/api.dart';
import 'dart:convert';
void writeDataToInfluxDB(InfluxDBClient client) async {
// 创建WriteApi实例
final WriteApi writeApi = client.getWriteApi();
// 准备数据点
final Point point = Point('measurement_name')
..addField('field_key', 'field_value')
..addTag('tag_key', 'tag_value')
..time(DateTime.now().toMillis(), WritePrecision.NS);
// 写入数据点
await writeApi.writePoint(bucket: 'your-bucket', record: point);
// 关闭客户端连接
await client.close();
}
4. 查询数据从InfluxDB
使用QueryApi
从InfluxDB查询数据。
import 'package:influxdb_client/api.dart';
void queryDataFromInfluxDB(InfluxDBClient client) async {
// 创建QueryApi实例
final QueryApi queryApi = client.getQueryApi();
// 准备Flux查询语句
final String fluxQuery = 'from(bucket: "your-bucket") |> range(start: -1h)';
// 执行查询
final FluxTableResult result = await queryApi.query(query: fluxQuery, org: 'your-org');
// 处理查询结果
result.tables.forEach((table) {
print('Table: ${table.label}');
table.records.forEach((record) {
print('Record: ${jsonEncode(record.values)}');
});
});
// 关闭客户端连接
await client.close();
}
5. 整合到Flutter应用中
将上述功能整合到你的Flutter应用中,可以在初始化阶段配置InfluxDB客户端,并在需要的时候调用写入和查询功能。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 配置InfluxDB客户端
final InfluxDBClient client = configureInfluxDBClient();
// 写入数据
await writeDataToInfluxDB(client);
// 查询数据
await queryDataFromInfluxDB(client);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('InfluxDB Client Demo'),
),
body: Center(
child: Text('Check console for InfluxDB interactions.'),
),
),
);
}
}
注意:上述代码示例为了简洁,将所有操作放在了main
函数中。在实际应用中,你可能需要根据业务需求将这些操作分散到不同的组件或服务中,并处理异步操作和错误情况。
此外,确保你的InfluxDB服务正在运行,并且URL、token、org和bucket等参数配置正确。