Flutter链接管理插件ailink的使用

Flutter链接管理插件ailink的使用

必要条件

  1. 获取AILink蓝牙通信协议
  2. 拥有支持AILink蓝牙模块的智能设备
  3. 具备Flutter开发和调试知识

Android

  1. android/build.gradle文件中添加以下代码:

    allprojects {
        repositories {
            google()
            mavenCentral()
            // 添加
            maven { url 'https://jitpack.io' }
        }
    }
    
  2. 修改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
    }
    
  3. 使用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

  1. 当使用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[扫描] --&gt;|通过Guid F0A0和FFE0过滤| B(扫描结果)
  B --&gt; C{处理扫描结果}
  C --&gt;|广播设备| D[解析广播数据]
  C --&gt;|连接设备| E[开始连接]
  E --&gt; |连接成功|F[发现BluetoothService]
  E --&gt; |连接失败|G[重连] --&gt; E
  F --&gt; H[获取BluetoothCharacteristic]
  H --&gt; I[设置通知]
  I --&gt; J[通过Guid FFE3写入指令并同时开始握手处理]
  J --&gt; K[处理接收到的指令并同时进行双向握手处理]

插件初始化

  1. 导入AiLink插件:

    import 'package:ailink/ailink.dart';
    
  2. 初始化插件:

    final _ailinkPlugin = Ailink();
    

广播数据解密与体脂数据检索

  1. 解密数据:

    _ailinkPlugin.decryptBroadcast(Uint8List);
    
  2. 获取体脂数据:

    _ailinkPlugin.getBodyFatData(ParamBodyFatData().toJson())
    
  3. 获取标准体重、体重控制、脂肪质量、瘦体重、肌肉质量、蛋白质质量和肥胖等级:

    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);
    

蓝牙握手命令加密与解密

  1. 连接设备后,需要执行两次握手。
  2. 首先调用 final firstHandShakeData = _ailinkPlugin.initHandShake() 来获取握手指令,并通过 characteristic.write(firstHandShakeData.toList(), withoutResponse: true) 发送给设备。
  3. 写入后,接收设备返回的握手指令 setHandShakeData
  4. 第二次调用 final secondHandShakeData = _ailinkPlugin.getHandShakeEncryptData(Uint8List.fromList(setHandShakeData)),并通过 characteristic.write(secondHandShakeData.toList(), withoutResponse: true) 发送给设备。
  5. 完成握手。
_ailinkPlugin.initHandShake();
_ailinkPlugin.getHandShakeEncryptData(Uint8List.fromList(data));

广播数据解析:ElinkBleData(cid, vid, pid, mac)

  1. 根据从广播数据中获得的UUID确定设备是否为广播设备或连接设备:

    final isBroadcastDevice = ElinkBleCommonUtils.isBroadcastDevice(uuids);
    
  2. 使用 getElinkBleData() 方法通过传递广播数据来获取 ElinkBleData。由于广播设备和连接设备的广播数据不同,需要传递 isBroadcastDevice 标志:

    final isBroadcastDevice = ElinkBleCommonUtils.isBroadcastDevice(uuids);
    final elinkBleData = ElinkBroadcastDataUtils.getElinkBleData(manufacturerData, isBroadcastDevice: isBroadcastDevice);
    

Elink A7 数据加密与解密

  1. 加密时,传入 elinkBleData.macArr, cidArr 和需要解密的负载数据:

    final _alink = Ailink();
    final encrypted = await _alink.mcuEncrypt(Uint8List.fromList(elinkbleData.cidArr), Uint8List.fromList(elinkBleData.macArr), Uint8List.fromList(payload));
    
  2. 解密时,传入 elinkBleData.macArr 和需要加密的数据:

    final _alink = Ailink();
    final decrypted = await _alink.mcuDecrypt(Uint8List.fromList(elinkBleData.macArr), Uint8List.fromList());
    

连接设备协议命令处理

  1. 使用 getElinkA6DatagetElinkA7Data 方法在 ElinkCmdUtils 中获取A6和A7协议命令:

    import 'package:ailink/utils/elink_cmd_utils.dart';
    final a6Data = ElinkCmdUtils.getElinkA6Data(payload);
    final a7Data = ElinkCmdUtils.getElinkA7Data(cid, _mac, payload);
    
  2. 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

1 回复

更多关于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类型。请根据你的实际需求调整代码。

回到顶部