Flutter食品探测插件ailink_food_probe的功能使用

Flutter食品探测插件ailink_food_probe的功能使用

必要条件

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

UUID描述

  1. FFE1: 写入A7数据。
  2. FFE2: 监控A7数据变化。
  3. FFE3: 写入A6数据并监控A6数据变化。

Android

  1. android/build.gradle文件中添加以下内容:
allprojects {
    repositories {
        google()
        mavenCentral()
        // 添加
        maven { url 'https://jitpack.io' }
    }
}
  1. android/app/build.gradle文件中修改minSdkVersion为21:
defaultConfig {
    applicationId "com.elinkthings.ailink_food_probe_example"
    minSdkVersion 21 // flutter.minSdkVersion
    targetSdkVersion flutter.targetSdkVersion
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}
  1. 使用flutter_blue_plus库时,需要在android/app/src/main/AndroidManifest.xml文件中添加所需的权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 告诉Google Play Store你的应用使用蓝牙LE
         如果蓝牙是必需的,则设置android:required="true" -->
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />

    <!-- Android 12的新蓝牙权限
    https://developer.android.com/about/versions/12/features/bluetooth-permissions -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <!-- 对于Android 11或更低版本的遗留权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"/>

    <!-- 对于Android 9或更低版本的遗留权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />
</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>此应用始终需要蓝牙才能运行</string>
        <key>NSBluetoothPeripheralUsageDescription</key>
        <string>此应用需要蓝牙外围设备才能运行</string>
        <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
        <string>此应用始终需要位置信息才能运行</string>
        <key>NSLocationAlwaysUsageDescription</key>
        <string>此应用始终需要位置信息才能运行</string>
        <key>NSLocationWhenInUseUsageDescription</key>
        <string>此应用在使用时需要位置信息才能运行</string>
    </dict>
</plist>

Flutter

探针命令相关

ElinkProbeCmdUtils
import 'package:ailink_food_probe/utils/elink_probe_cmd_utils.dart';

List<int> probeMac;
final elinkProbeCmdUtils = ElinkProbeCmdUtils(probeMac);
  1. 获取版本信息:
final cmd = elinkProbeCmdUtils.getVersion();
  1. 获取电池电量:
final cmd = elinkProbeCmdUtils.getBattery();
  1. 切换单位:
final cmd = elinkProbeCmdUtils.switchUnit(unit); // 0: ℃, 1: ℉
  1. 设置探针数据:
import 'package:ailink_food_probe/model/elink_probe_info.dart';

ElinkProbeInfo probeInfo;
final cmd = elinkProbeCmdUtils.setProbeInfo(probeInfo);
  1. 获取探针数据:
final cmd = elinkProbeCmdUtils.getProbeInfo();
  1. 清除探针数据:
final cmd = elinkProbeCmdUtils.clearProbeInfo();

探针命令回调

ElinkProbeParseCallback
import 'package:ailink_food_probe/utils/elink_probe_data_parse_utils.dart';
import 'package:ailink_food_probe/utils/elink_probe_parse_callback.dart';

List<int> probeMac;
final elinkProbeDataParseUtils = ElinkProbeDataParseUtils(probeMac);
final probeCallback = ElinkProbeParseCallback(
    onGetVersion: (version) {}, 
    onGetBattery: (state, battery) {}, 
    onSetResult: (setResult) {}, 
    onSwitchUnit: (setResult) {}, 
    onGetRealTimeData: (realTimeModel) {}, 
    onGetProbeInfo: (probeInfo) {}, 
    onGetProbeInfoFailure: (mac) {}
);
elinkProbeDataParseUtils.setProbeCallback(probeCallback);

/// 发现服务后确定特征值UUID为ElinkBleCommonUtils.elinkWriteAndNotifyUuid 或 ElinkBleCommonUtils.elinkNotifyUuid
characteristic.onValueReceived.listen((data) {
  elinkProbeDataParseUtils.parseElinkData(data);
}

探针盒命令相关

ElinkProbeBoxCmdUtils
import 'package:ailink_food_probe/utils/elink_probe_box_cmd_utils.dart';
List<int> probeBoxMac;
final elinkProbeBoxCmdUtils = ElinkProbeBoxCmdUtils(probeBoxMac);
  1. 获取版本信息:
final cmd = elinkProbeBoxCmdUtils.getVersion();
  1. 同步时间:
final cmd = elinkProbeBoxCmdUtils.syncTime(dateTime);
  1. 切换单位:
final cmd = elinkProbeBoxCmdUtils.switchUnit(unit); // 0: ℃, 1: ℉
  1. 获取探针盒中的探针数据(基于探针的MAC地址):
List<int> probeMac;
final cmd = elinkProbeBoxCmdUtils.getBoxProbeInfo(probeMac);
  1. 设置探针盒中的探针数据(只有探针数据中的报警温度由设备处理,其他数据不处理):
import 'package:ailink_food_probe/model/elink_probe_info.dart';

ElinkProbeInfo probeInfo;
final cmd = elinkProbeBoxCmdUtils.setBoxProbeInfo(probeInfo);
  1. 清除探针盒中的探针数据(基于探针的MAC地址):
List<int> probeMac;
final cmd = elinkProbeBoxCmdUtils.clearBoxProbeInfo(probeMac);

探针盒命令回调

ElinkProbeBoxParseCallback
import 'package:ailink_food_probe/utils/elink_probe_data_parse_utils.dart';
import 'package:ailink_food_probe/utils/elink_probe_box_parse_callback.dart';

List<int> probeBoxMac;
final elinkProbeDataParseUtils = ElinkProbeDataParseUtils(probeBoxMac);
    
final boxCallback = ElinkProbeBoxParseCallback(
    onGetVersion: (version) {},
    onRequestSyncTime: () {},
    onSetResult: (setResult) {},
    onSyncTimeResult: (syncResult) {},
    onSwitchUnit: (setResult) {},
    onGetProbeChargingBoxInfo: (supportNum, currentNum, boxChargingState, boxBattery, boxUnit, probeList) {},
    onGetProbeInfo: (probeInfo) {}
);
elinkProbeDataParseUtils.setProbeBoxCallback(boxCallback);

/// 发现服务后判断特征值UUID为ElinkBleCommonUtils.elinkWriteAndNotifyUuid或ElinkBleCommonUtils.elinkNotifyUuid
characteristic.onValueReceived.listen((data) {
  elinkProbeDataParseUtils.parseElinkData(data);
}

带屏探针盒命令相关

ElinkProbeBoxWithScreenCmdUtils
import 'package:ailink_food_probe/utils/elink_probe_box_with_screen_cmd_utils.dart';
List<int> probeBoxMac;
final elinkProbeBoxWithScreenCmdUtils = ElinkProbeBoxWithScreenCmdUtils(probeBoxMac);
  1. 获取版本信息:
final cmd = elinkProbeBoxWithScreenCmdUtils.getVersion();
  1. 同步时间:
final cmd = elinkProbeBoxWithScreenCmdUtils.syncTime(dateTime);
  1. 切换单位:
final cmd = elinkProbeBoxWithScreenCmdUtils.switchUnit(unit); // 0: ℃, 1: ℉
  1. 获取探针数据:
List<int> probeMac;
final cmd = elinkProbeBoxWithScreenCmdUtils.getProbeInfo();
  1. 设置探针数据(只有探针数据中的报警温度由设备处理,其他数据不处理):
import 'package:ailink_food_probe/model/elink_probe_info.dart';

ElinkProbeInfo probeInfo;
final cmd = elinkProbeBoxWithScreenCmdUtils.setBoxProbeInfo(probeInfo);
  1. 清除探针数据(基于探针的MAC地址):
List<int> probeMac;
final cmd = elinkProbeBoxWithScreenCmdUtils.clearBoxProbeInfo(probeMac);

带屏探针盒命令回调

ElinkProbeBoxWithScreenParseCallback
import 'package:ailink_food_probe/utils/elink_probe_data_parse_utils.dart';
import 'package:ailink_food_probe/utils/elink_probe_box_with_screen_parse_callback.dart';

List<int> probeBoxMac;
final elinkProbeDataParseUtils = ElinkProbeDataParseUtils(probeBoxMac);
    
final boxCallback = ElinkProbeBoxWithScreenParseCallback(
    onGetVersion: (version) {}, 
    onRequestSyncTime: () {}, 
    onSetResult: (setResult) {}, 
    onSyncTimeResult: (syncResult) {}, 
    onSwitchUnit: (setResult) {}, 
    onGetProbeChargingBoxInfo: (supportNum, connectNum, boxChargingState, boxBattery, boxUnit, probeList) {}, 
    onGetProbeInfo: (probeInfo) {}, 
    onGetProbeInfoFailure: (mac) {}, 
    onCancelAmbientAlarm: (mac, cancel) {}, 
    onEndWorkByBox: (mac) {},
);
elinkProbeDataParseUtils.setProbeBoxCallback(boxCallback);

/// 发现服务后判断特征值UUID为ElinkBleCommonUtils.elinkWriteAndNotifyUuid或ElinkBleCommonUtils.elinkNotifyUuid
characteristic.onValueReceived.listen((data) {
  elinkProbeDataParseUtils.parseElinkData(data);
}

更多关于Flutter食品探测插件ailink_food_probe的功能使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter食品探测插件ailink_food_probe的功能使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ailink_food_probe 是一个用于食品探测的 Flutter 插件,通常与硬件设备(如食品温度计或探测器)配合使用。该插件可以帮助开发者通过 Flutter 应用程序与硬件设备进行通信,获取食品的温度或其他相关数据。以下是该插件的基本功能和使用方法。

1. 安装插件

首先,你需要在 pubspec.yaml 文件中添加 ailink_food_probe 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ailink_food_probe: ^版本号

然后运行 flutter pub get 来安装插件。

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:ailink_food_probe/ailink_food_probe.dart';

3. 初始化插件

在使用插件之前,通常需要先初始化它:

AilinkFoodProbe.initialize();

4. 扫描并连接设备

你可以使用插件提供的功能来扫描附近的食品探测设备并连接到它们:

AilinkFoodProbe.startScan();

AilinkFoodProbe.onDeviceFound.listen((device) {
  print('Found device: ${device.name}');
  // 你可以在这里选择连接到设备
  AilinkFoodProbe.connect(device);
});

5. 获取食品数据

连接成功后,你可以开始获取食品的温度或其他数据:

AilinkFoodProbe.onDataReceived.listen((data) {
  print('Received data: $data');
  // 处理接收到的数据,例如更新UI
});

6. 断开连接

当你不再需要与设备通信时,可以断开连接:

AilinkFoodProbe.disconnect();

7. 处理错误

你可以监听错误事件来处理可能出现的连接或通信问题:

AilinkFoodProbe.onError.listen((error) {
  print('Error: $error');
  // 处理错误,例如显示错误提示
});

8. 停止扫描

如果你不再需要扫描设备,可以停止扫描以节省资源:

AilinkFoodProbe.stopScan();

9. 释放资源

在应用程序退出或不再使用插件时,释放相关资源:

AilinkFoodProbe.dispose();

示例代码

以下是一个简单的示例代码,展示了如何使用 ailink_food_probe 插件:

import 'package:flutter/material.dart';
import 'package:ailink_food_probe/ailink_food_probe.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _temperature = 'N/A';

  [@override](/user/override)
  void initState() {
    super.initState();
    AilinkFoodProbe.initialize();
    AilinkFoodProbe.startScan();

    AilinkFoodProbe.onDeviceFound.listen((device) {
      print('Found device: ${device.name}');
      AilinkFoodProbe.connect(device);
    });

    AilinkFoodProbe.onDataReceived.listen((data) {
      setState(() {
        _temperature = data.temperature.toString();
      });
    });

    AilinkFoodProbe.onError.listen((error) {
      print('Error: $error');
    });
  }

  [@override](/user/override)
  void dispose() {
    AilinkFoodProbe.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Food Probe Example'),
        ),
        body: Center(
          child: Text('Temperature: $_temperature'),
        ),
      ),
    );
  }
}
回到顶部