Flutter链接管理插件ailink的使用
Flutter链接管理插件ailink的使用
必要条件
- 获取AILink蓝牙通信协议
- 拥有支持AILink蓝牙模块的智能设备
- 具备Flutter开发和调试知识
Android
-
在
android/build.gradle
文件中添加以下代码:allprojects { repositories { google() mavenCentral() // 添加 maven { url 'https://jitpack.io' } } }
-
修改
android/app/build.gradle
文件中的minSdkVersion
为21:defaultConfig { // TODO: 指定唯一的应用ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.ailink_example" // 可以根据需要更新以下值。更多详情见: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 // flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName }
-
使用
flutter_blue_plus
库时,需要在android/app/src/main/AndroidManifest.xml
文件中添加所需的权限:<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> </manifest>
iOS
- 当使用
flutter_blue_plus
库时,需要在ios/Runner/Info.plist
文件中添加所需的权限:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSBluetoothAlwaysUsageDescription</key> <string>需要BLE权限</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>需要BLE权限</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>需要位置权限</string> <key>NSLocationAlwaysUsageDescription</key> <string>需要位置权限</string> <key>NSLocationWhenInUseUsageDescription</key> <string>需要位置权限</string> </dict> </plist>
Flutter
graph TD
A[扫描] -->|通过Guid F0A0和FFE0过滤| B(扫描结果)
B --> C{处理扫描结果}
C -->|广播设备| D[解析广播数据]
C -->|连接设备| E[开始连接]
E --> |连接成功|F[发现BluetoothService]
E --> |连接失败|G[重连] --> E
F --> H[获取BluetoothCharacteristic]
H --> I[设置通知]
I --> J[通过Guid FFE3写入指令并同时开始握手处理]
J --> K[处理接收到的指令并同时进行双向握手处理]
插件初始化
-
导入AiLink插件:
import 'package:ailink/ailink.dart';
-
初始化插件:
final _ailinkPlugin = Ailink();
广播数据解密与体脂数据检索
-
解密数据:
_ailinkPlugin.decryptBroadcast(Uint8List);
-
获取体脂数据:
_ailinkPlugin.getBodyFatData(ParamBodyFatData().toJson())
-
获取标准体重、体重控制、脂肪质量、瘦体重、肌肉质量、蛋白质质量和肥胖等级:
import 'package:ailink/utils/body_data_utils.dart'; const sex = 1; ///1: 男性;其他: 女性 const height = 170.0; ///cm const weight = 69.20; ///kg const bfr = 19.5; ///体脂率 const rom = 50.4; ///肌肉率 const pp = 17.2; ///蛋白质率 final standardWeight = BodyDataUtils.getStandardWeight(sex, height); final weightControl = BodyDataUtils.getWeightControl(weight, sex, height); final fatMass = BodyDataUtils.getFatMass(weight, bfr); final leanBodyMass = BodyDataUtils.getLeanBodyMass(weight, bfr); final muscleMass = BodyDataUtils.getMuscleMass(weight, rom); final proteinMass = BodyDataUtils.getProteinMass(weight, pp); final level = BodyDataUtils.getObesityLevel(weight, sex, height);
蓝牙握手命令加密与解密
- 连接设备后,需要执行两次握手。
- 首先调用
final firstHandShakeData = _ailinkPlugin.initHandShake()
来获取握手指令,并通过characteristic.write(firstHandShakeData.toList(), withoutResponse: true)
发送给设备。 - 写入后,接收设备返回的握手指令
setHandShakeData
。 - 第二次调用
final secondHandShakeData = _ailinkPlugin.getHandShakeEncryptData(Uint8List.fromList(setHandShakeData))
,并通过characteristic.write(secondHandShakeData.toList(), withoutResponse: true)
发送给设备。 - 完成握手。
_ailinkPlugin.initHandShake();
_ailinkPlugin.getHandShakeEncryptData(Uint8List.fromList(data));
广播数据解析:ElinkBleData(cid, vid, pid, mac)
-
根据从广播数据中获得的UUID确定设备是否为广播设备或连接设备:
final isBroadcastDevice = ElinkBleCommonUtils.isBroadcastDevice(uuids);
-
使用
getElinkBleData()
方法通过传递广播数据来获取ElinkBleData
。由于广播设备和连接设备的广播数据不同,需要传递isBroadcastDevice
标志:final isBroadcastDevice = ElinkBleCommonUtils.isBroadcastDevice(uuids); final elinkBleData = ElinkBroadcastDataUtils.getElinkBleData(manufacturerData, isBroadcastDevice: isBroadcastDevice);
Elink A7 数据加密与解密
-
加密时,传入
elinkBleData.macArr
,cidArr
和需要解密的负载数据:final _alink = Ailink(); final encrypted = await _alink.mcuEncrypt(Uint8List.fromList(elinkbleData.cidArr), Uint8List.fromList(elinkBleData.macArr), Uint8List.fromList(payload));
-
解密时,传入
elinkBleData.macArr
和需要加密的数据:final _alink = Ailink(); final decrypted = await _alink.mcuDecrypt(Uint8List.fromList(elinkBleData.macArr), Uint8List.fromList());
连接设备协议命令处理
-
使用
getElinkA6Data
和getElinkA7Data
方法在ElinkCmdUtils
中获取A6和A7协议命令:import 'package:ailink/utils/elink_cmd_utils.dart'; final a6Data = ElinkCmdUtils.getElinkA6Data(payload); final a7Data = ElinkCmdUtils.getElinkA7Data(cid, _mac, payload);
-
ElinkCmdUtils
还提供了一些常用的字节操作方法。
示例代码
import 'package:ailink_example/utils/constants.dart';
import 'package:ailink_example/pages/page_connect_device.dart';
import 'package:ailink_example/pages/page_home.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
void main() {
FlutterBluePlus.setLogLevel(LogLevel.verbose, color: true);
runApp(MaterialApp(
initialRoute: page_home,
routes: {
page_home: (context) => const HomePage(),
page_connect_device: (context) => const ConnectDevicePage(),
},
));
}
更多关于Flutter链接管理插件ailink的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter链接管理插件ailink的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter链接管理插件ailink
的使用,以下是一个简要的代码示例,展示如何集成和使用该插件。请确保你已经按照ailink
插件的官方文档完成了基本的安装和配置步骤。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加ailink
依赖:
dependencies:
flutter:
sdk: flutter
ailink: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
2. 导入插件
在你的Dart文件中导入ailink
插件:
import 'package:ailink/ailink.dart';
3. 初始化插件
在应用启动时初始化ailink
插件。这通常在你的主文件(如main.dart
)中进行:
void main() {
WidgetsFlutterBinding.ensureInitialized();
// 初始化ailink插件
Ailink.instance.init();
runApp(MyApp());
}
4. 使用插件功能
4.1 打开链接
使用ailink
插件打开一个URL链接:
void openUrl() async {
String url = "https://www.example.com";
try {
await Ailink.instance.open(url: url);
} catch (e) {
print("Failed to open URL: $e");
}
}
4.2 检查是否可以处理链接
检查设备是否能处理某个特定类型的链接(例如,是否安装了能够打开该链接的应用):
Future<bool> canOpenUrl(String url) async {
try {
bool result = await Ailink.instance.canOpenUrl(url: url);
return result;
} catch (e) {
print("Failed to check URL: $e");
return false;
}
}
4.3 获取所有支持的链接类型
获取设备支持的所有链接类型(这可能需要一些额外的权限或配置,具体参考插件文档):
Future<List<String>> getSupportedUrlSchemes() async {
try {
List<String> schemes = await Ailink.instance.getSupportedUrlSchemes();
return schemes;
} catch (e) {
print("Failed to get supported URL schemes: $e");
return [];
}
}
5. 完整示例
以下是一个完整的示例,展示如何在Flutter应用中集成并使用ailink
插件:
import 'package:flutter/material.dart';
import 'package:ailink/ailink.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
Ailink.instance.init();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ailink Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Ailink Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () async {
String url = "https://www.example.com";
await openUrl(url);
},
child: Text('Open URL'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
String url = "https://www.example.com";
bool canOpen = await canOpenUrl(url);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Can open URL: $canOpen')),
);
},
child: Text('Check URL'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
List<String> schemes = await getSupportedUrlSchemes();
String schemesStr = schemes.join(', ');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Supported URL schemes: $schemesStr')),
);
},
child: Text('Get Supported URL Schemes'),
),
],
),
),
);
}
Future<void> openUrl(String url) async {
try {
await Ailink.instance.open(url: url);
} catch (e) {
print("Failed to open URL: $e");
}
}
Future<bool> canOpenUrl(String url) async {
try {
bool result = await Ailink.instance.canOpenUrl(url: url);
return result;
} catch (e) {
print("Failed to check URL: $e");
return false;
}
}
Future<List<String>> getSupportedUrlSchemes() async {
try {
List<String> schemes = await Ailink.instance.getSupportedUrlSchemes();
return schemes;
} catch (e) {
print("Failed to get supported URL schemes: $e");
return [];
}
}
}
这个示例展示了如何使用ailink
插件来打开URL、检查设备是否能打开特定URL以及获取设备支持的所有URL类型。请根据你的实际需求调整代码。