Flutter Toit API集成插件toit_api的使用
Flutter Toit API 集成插件 toit_api 的使用
本包提供了通过其 API 访问 Toit 服务器的 gRPC 函数。
示例
以下是一个完整的示例代码,展示了如何使用 toit_api
插件进行登录、设备操作及 PubSub 操作。
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:grpc/grpc.dart';
import 'package:toit_api/toit/api/auth.pbgrpc.dart' show AuthClient, LoginRequest;
import 'package:toit_api/toit/api/pubsub/publish.pbgrpc.dart' show PublishClient, PublishRequest;
import 'package:toit_api/toit/api/pubsub/subscribe.pbgrpc.dart';
import 'package:toit_api/toit/api/device.pbgrpc.dart';
// 将 UUID 转换为字符串格式。
String uuid2String(List<int> bytes) {
var hex = bytes.map((b) => b.toRadixString(16).padLeft(2, "0")).join();
return "${hex.substring(0, 8)}-"
"${hex.substring(8, 12)}-"
"${hex.substring(12, 16)}-"
"${hex.substring(16, 20)}-"
"${hex.substring(20)}";
}
/**
* 这个应用程序演示了一些更常见的 API 操作。
*/
Future<void> main(List<String> args) async {
if (args.length != 2) {
print("用法: main.dart <用户名> <密码>");
exit(1);
}
var username = args[0];
var password = args[1];
var channel = ClientChannel('api.toit.io');
try {
print("正在登录...");
var authClient = AuthClient(channel);
var resp = await authClient
.login(LoginRequest(username: username, password: password));
var tokenBytes = resp.accessToken;
var token = utf8.decode(tokenBytes);
print("");
var options = CallOptions(metadata: {'Authorization': 'Bearer $token'});
print("请求设备列表...");
var deviceStub = DeviceServiceClient(channel, options: options);
var deviceList =
(await deviceStub.listDevices(ListDevicesRequest())).devices;
for (var device in deviceList) {
print(" ${device.config.name}");
}
if (deviceList.isEmpty) return;
print("");
var name = deviceList.first.config.name;
print("按名称查找设备($name)...");
var lookupResponse =
await deviceStub.lookupDevices(LookupDevicesRequest(deviceName: name));
var deviceIds = lookupResponse.deviceIds;
print("");
// 应该至少有一个匹配项,但可能有多于一个。
print("找到 ${deviceIds.length} 个匹配项:");
deviceIds.forEach((deviceId) {
print(" ${uuid2String(deviceId)}");
});
print("");
var deviceId = deviceIds.first;
var deviceIdString = uuid2String(deviceId);
print("检查具有设备 ID $deviceIdString 的设备...");
var device =
(await deviceStub.getDevice(GetDeviceRequest(deviceId: deviceId)))
.device;
var config = device.config;
print(" 名称: ${config.name}");
var maxOfflineString = config.connection.maxOffline.toString().trim();
print(" 连接间隔: $maxOfflineString");
var status = device.status;
print(" 当前是否连接: ${status.connected}");
var health = status.health;
var lastSeen = DateTime.fromMillisecondsSinceEpoch(
health.connectivity.lastSeen.seconds.toInt() * 1000);
print(" 最后一次看到时间: $lastSeen");
print(" 上次检查是否有遗漏: "
"${health.connectivity.checkins.last.hasMissed()}");
print("");
print("PubSub...");
print("列出现有订阅...");
var subscribeStub = SubscribeClient(channel, options: options);
var existingSubscriptions =
(await subscribeStub.listSubscriptions(ListSubscriptionsRequest()))
.subscriptions;
existingSubscriptions.forEach((sub) {
print(" ${sub.name}: ${sub.topic}");
});
print("");
var topic = "cloud:toit-api/demo";
if (existingSubscriptions.any((sub) => sub.name == topic)) {
return;
}
print("创建新订阅并发送数据...");
var subscription =
Subscription(name: "toit-api-demo 订阅", topic: topic);
await subscribeStub.createSubscription(
CreateSubscriptionRequest(subscription: subscription));
// 只获取当前可用的订阅。
// 使用 `stream` 函数将不断接收新消息。
var fetchFuture =
subscribeStub.fetch(FetchRequest(subscription: subscription));
var publishStub = PublishClient(channel, options: options);
await publishStub.publish(PublishRequest(
topic: topic,
publisherName: "dart toit-api demo",
data: [utf8.encode("demo")]));
print("等待发布的值到达订阅...");
var fetch = await fetchFuture;
print(fetch);
print("确认...");
await subscribeStub.acknowledge(AcknowledgeRequest(
subscription: subscription, envelopeIds: [fetch.messages.first.id]));
print("删除订阅...");
await subscribeStub.deleteSubscription(
DeleteSubscriptionRequest(subscription: subscription));
} finally {
channel.shutdown();
}
}
更多关于Flutter Toit API集成插件toit_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter Toit API集成插件toit_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中集成并使用toit_api
插件的示例代码。请注意,这只是一个基本的示例,实际项目中可能需要更多的错误处理和逻辑实现。
首先,确保你已经在Flutter项目中添加了toit_api
依赖。打开你的pubspec.yaml
文件,并添加以下依赖:
dependencies:
flutter:
sdk: flutter
toit_api: ^latest_version_here # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,我们需要在Flutter应用中初始化并使用toit_api
。以下是一个简单的示例,展示了如何初始化API客户端并执行一个基本的请求(例如,获取Toit设备信息,具体API端点取决于Toit API的实际文档)。
import 'package:flutter/material.dart';
import 'package:toit_api/toit_api.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String resultText = '';
@override
void initState() {
super.initState();
_initializeToitApi();
}
Future<void> _initializeToitApi() async {
// 替换为你的Toit API密钥和所需的其他配置
final apiKey = 'your_toit_api_key_here';
final client = ToitApiClient(apiKey: apiKey);
try {
// 示例请求:获取设备信息(具体端点和参数请参考Toit API文档)
// 假设我们有一个设备ID 'device_id_here'
final deviceId = 'device_id_here';
final response = await client.getDevice(deviceId);
// 更新UI以显示结果
setState(() {
resultText = 'Device Info: ${response.toJson()}';
});
} catch (e) {
// 处理错误
setState(() {
resultText = 'Error: ${e.message}';
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Toit API Integration'),
),
body: Center(
child: Text(resultText),
),
),
);
}
}
// 假设ToitApiClient是一个伪代码类,实际使用中你需要根据toit_api插件提供的API来实现
class ToitApiClient {
final String apiKey;
ToitApiClient({required this.apiKey});
Future<DeviceInfo> getDevice(String deviceId) async {
// 这里是伪代码,你需要根据实际的Toit API端点和认证机制来实现请求
// 例如,使用http或dio包来发送HTTP请求
// var response = await http.get('https://api.toit.io/v1/devices/$deviceId', headers: {'Authorization': 'Bearer $apiKey'});
// 如果响应成功,解析JSON并返回DeviceInfo对象
// 如果失败,抛出异常
throw UnimplementedError('This is a placeholder method. Implement the actual API call.');
}
}
// 假设DeviceInfo是一个伪代码类,用于存储设备信息
class DeviceInfo {
// 根据Toit API返回的实际数据结构来定义字段
String? id;
String? name;
// ... 其他字段
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
// ... 其他字段转为JSON
};
}
}
注意:
- 上面的
ToitApiClient
和DeviceInfo
类是基于假设的,你需要根据toit_api
插件的实际API和实现来替换它们。 - 确保你遵循Toit API的认证和请求规范。
- 在生产环境中,不要硬编码API密钥,而是考虑使用更安全的方式来管理密钥,如环境变量或密钥管理服务。
- 根据Toit API的文档,你可能需要处理分页、错误码和其他API特有的行为。
希望这个示例能帮你开始集成toit_api
插件到你的Flutter应用中。如果你有更具体的需求或遇到问题,请查阅Toit API的官方文档或提出更详细的问题。