Flutter连接优化插件opticonnect_sdk的使用

Flutter连接优化插件opticonnect_sdk的使用

OptiConnect SDK 允许与 Opticon 的 BLE 设备(如 OPN-2500 和 OPN-6000 条码扫描器)无缝集成。此 SDK 可以管理蓝牙低功耗(BLE)连接、处理扫描器数据流,并通过命令编程控制扫描器设置。

注意: 此包独立于 OptiConnect 应用程序,后者提供了额外的设备管理功能。SDK 提供了直接与 Opticon 的 BLE 设备交互的底层 BLE 功能。

特性

  • 支持 OPN-2500 和 OPN-6000 BLE 扫描器的蓝牙发现和连接管理。
  • 实时数据流,包括条码数据接收和 BLE 设备状态监控。
  • 编程控制扫描器设置(例如,扫描模式、照明、连接池等)。
  • 独占连接管理:在多设备环境中确保稳定的设备配对,通过分配唯一的连接池 ID,防止已配对的设备劫持活动连接。
  • 命令管理和定制化,用于 BLE 服务和扫描器配置。

开始使用

前提条件

  • Flutter SDK 版本 2.12.0 或以上。
  • Opticon BLE OPN-2500 或 OPN-6000 条码扫描器。

安装

要在项目中安装 SDK,请将以下依赖项添加到 pubspec.yaml 文件中:

dependencies:
   opticonnect_sdk: ^1.0.0

重要事项

此 SDK 使用 flutter_blue_plus 进行蓝牙低功耗(BLE)通信。我们已在本 README 中提供了 Android 和 iOS 必要的权限配置。您可以参考 flutter_blue_plus 文档获取更多 BLE 特定的设置或更高级的使用场景。

Android 设置

为了在 Android 上启用蓝牙发现和连接,请在 android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />

<!-- 新的蓝牙权限(Android 12 或更高版本) -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- 旧版权限(Android 11 或更低版本) -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />

<!-- 旧版权限(Android 9 或更低版本) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />

iOS 设置

为了在 iOS 上启用蓝牙和后台功能,需要修改几个项目文件。

1. 更新 Info.plist

ios/Runner/Info.plist 文件中添加以下键以请求蓝牙和位置权限:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>此应用需要蓝牙来与扫描器通信并检索数据。</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>此应用需要位置访问权限以便在使用过程中扫描 BLE 设备。</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>此应用需要位置访问权限以便即使在后台也能扫描 BLE 设备。</string>

<key>UIBackgroundModes</key>
<array>
   <string>bluetooth-central</string>
</array>

2. 更新 Podfile

确保 Podfile 包含蓝牙和位置访问所需的权限,通过在 ios/Podfile 中添加以下行:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    target.build_configurations.each do |config|
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',

        ## 启用所需权限
        'PERMISSION_LOCATION=1',  # 启用位置权限
        'PERMISSION_BLUETOOTH=1', # 启用蓝牙权限
      ]
    end
  end
end

3. 在 Xcode 中启用后台模式

为了允许应用程序在后台使用蓝牙,请按以下步骤操作:

  1. 在 Xcode 中打开你的 iOS 项目。
  2. 在项目导航器中选择 Runner 目标。
  3. 转到 Signing & Capabilities 标签页。
  4. 点击左上角的 “+” Capability 按钮。
  5. 从列表中选择 Background Modes。
  6. 选中 Uses Bluetooth LE Accessories 选项。

macOS 设置

确保你已经授予了对蓝牙硬件的访问权限:

  1. 在 Xcode 中打开你的 macOS 项目。
  2. 转到 Runners -> Targets -> Runner。
  3. 转到 Signing & Capabilities 标签页。
  4. 在 App Sandbox 下,通过勾选 Hardware 下的 Bluetooth 复选框来启用蓝牙。

你可以参考以下图像进行指导:

示例代码

以下是基本示例代码,展示了如何使用 OptiConnect SDK。

// 基本示例代码
// 更多高级示例,请访问:
// https://github.com/OpticonOSEDevelopment/opticonnect_sdk_flutter/tree/main/advanced_example

import 'package:flutter/material.dart';
import 'package:opticonnect_sdk/entities.dart';
import 'package:opticonnect_sdk/enums.dart';
import 'package:opticonnect_sdk/opticonnect.dart';

void main() {
  runApp(const OptiConnectApp());
}

class OptiConnectApp extends StatelessWidget {
  const OptiConnectApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const OptiConnectExample(),
    );
  }
}

class OptiConnectExample extends StatefulWidget {
  const OptiConnectExample({super.key});

  [@override](/user/override)
  OptiConnectExampleState createState() => OptiConnectExampleState();
}

class OptiConnectExampleState extends State<OptiConnectExample> with WidgetsBindingObserver {
  String _deviceId = '';
  String _connectionStatus = 'Disconnected';
  String _barcodeData = '';
  bool _isConnecting = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _initializeOptiConnectSDK();
  }

  Future<void> _initializeOptiConnectSDK() async {
    try {
      await OptiConnect.initialize();
      await OptiConnect.bluetoothManager.startDiscovery();
      OptiConnect.bluetoothManager.listenToDiscoveredDevices.listen((device) {
        setState(() {
          _deviceId = device.deviceId;
          _connectToDevice(_deviceId);
        });
      });
    } catch (e) {
      debugPrint('Error initializing SDK: $e');
    }
  }

  Future<void> _connectToDevice(String deviceId) async {
    if (_isConnecting) {
      return;
    }
    _isConnecting = true;
    try {
      OptiConnect.bluetoothManager
          .listenToConnectionState(deviceId)
          .listen((state) {
        setState(() {
          if (state == BleDeviceConnectionState.connected) {
            _connectionStatus = 'Connected';
            _listenToBarcodeDataStream(deviceId);
          } else if (state == BleDeviceConnectionState.connecting) {
            _connectionStatus = 'Connecting...';
          } else {
            _connectionStatus = 'Disconnected';
          }
        });
      });
      await OptiConnect.bluetoothManager.connect(deviceId);
      await Future.delayed(const Duration(seconds: 3));
      _isConnecting = false;
    } catch (e) {
      debugPrint('Error connecting to device: $e');
    }
  }

  Future<void> _listenToBarcodeDataStream(String deviceId) async {
    try {
      final barcodeStream = await OptiConnect.bluetoothManager
          .subscribeToBarcodeDataStream(deviceId);
      barcodeStream.listen((BarcodeData barcode) {
        setState(() {
          _barcodeData = barcode.data;
        });
      });
    } catch (e) {
      debugPrint('Error scanning barcode: $e');
    }
  }

  Future<void> _disconnectDevice() async {
    if (_deviceId.isNotEmpty) {
      await OptiConnect.bluetoothManager.disconnect(_deviceId);
      setState(() {
        _connectionStatus = 'Disconnected';
        _barcodeData = '';
      });
    }
  }

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    // 当应用分离时,释放 OptiConnect SDK
    if (state == AppLifecycleState.detached) {
      OptiConnect.dispose();
    }
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('OptiConnect SDK 示例'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text(
              '设备: $_deviceId',
              style: const TextStyle(fontSize: 18),
            ),
            const SizedBox(height: 16),
            Text(
              '连接状态: $_connectionStatus',
              style: TextStyle(
                fontSize: 18,
                color: _connectionStatus == 'Connected'
                    ? Colors.green
                    : (_connectionStatus == 'Connecting...'
                        ? Colors.blue
                        : Colors.red),
              ),
            ),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed:
                  _connectionStatus == 'Connected' ? _disconnectDevice : null,
              child: const Text('断开连接'),
            ),
            const SizedBox(height: 24),
            Text(
              '最新条码数据: $_barcodeData',
              style: const TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter连接优化插件opticonnect_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter连接优化插件opticonnect_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成并使用opticonnect_sdk插件进行连接优化的示例代码。请注意,这只是一个基本示例,具体的实现细节可能会根据你的项目需求有所不同。

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

dependencies:
  flutter:
    sdk: flutter
  opticonnect_sdk: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用opticonnect_sdk

  1. 导入包

在你的Dart文件中(例如main.dart),导入opticonnect_sdk

import 'package:opticonnect_sdk/opticonnect_sdk.dart';
  1. 初始化SDK

在你的应用程序启动时(通常在MainActivity.ktAppDelegate.swift中进行原生配置,并在Flutter端调用初始化方法),你需要初始化opticonnect_sdk。这通常涉及到设置API密钥和其他配置。

由于Flutter插件通常会在其文档中提供详细的初始化步骤,这里假设opticonnect_sdk提供了一个名为initialize的方法,你可以这样调用它:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化OptiConnect SDK
  OptiConnect.initialize(apiKey: "你的API密钥", otherConfigs: {
    "configKey1": "configValue1",
    "configKey2": "configValue2",
    // 添加其他必要的配置
  });

  runApp(MyApp());
}

注意:这里的OptiConnect.initialize方法及其参数是假设的,实际使用时请参考opticonnect_sdk的官方文档。

  1. 使用SDK功能

一旦SDK初始化完成,你就可以使用它提供的功能了。例如,假设opticonnect_sdk提供了一个名为checkConnectionQuality的方法来检查连接质量,你可以这样使用:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('OptiConnect SDK Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Checking connection quality...'),
              ElevatedButton(
                onPressed: () async {
                  try {
                    // 检查连接质量
                    ConnectionQualityResult result = await OptiConnect.checkConnectionQuality();
                    // 显示结果
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text('Connection Quality: ${result.qualityDescription}'),
                      ),
                    );
                  } catch (e) {
                    // 处理错误
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text('Error: ${e.message}'),
                        backgroundColor: Colors.red,
                      ),
                    );
                  }
                },
                child: Text('Check Connection Quality'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,当用户点击按钮时,应用程序会调用OptiConnect.checkConnectionQuality()方法来检查连接质量,并在SnackBar中显示结果。

请注意,上述代码中的ConnectionQualityResultqualityDescription是假设的,实际使用时请参考opticonnect_sdk的官方文档来了解具体的返回类型和属性。

此外,由于opticonnect_sdk是一个第三方插件,具体的API和使用方法可能会有所不同,因此强烈建议查阅其官方文档和示例代码来获取最准确的信息。

回到顶部