Flutter北欧ID设备交互插件nordic_id的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter北欧ID设备交互插件nordic_id的使用

nordic_id

一个用于读取RFID/UHF标签的Flutter插件。

项目设置

添加到Android项目

在Manifest部分添加

  1. <manifest>标签内添加:

    xmlns:tools="http://schemas.android.com/tools"
    
  2. <manifest>标签内,在<application>标签之前添加权限:

    <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.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="29" />
    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="29" />
    <uses-permission
        android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />
    
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.NFC" />
    
    <uses-feature
        android:name="android.hardware.nfc"
        android:required="false" />
    
  3. <application>标签内添加:

    tools:replace="android:label"
    
  4. <application>标签内添加以下内容:

    <activity
        android:name="com.nordicid.nurapi.NurDeviceListActivity"
        android:exported="true"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Dialog" />
    
    <service
        android:name="com.nordicid.nurapi.UartService"
        android:enabled="true"
        android:exported="true" />
    

在build.gradle部分添加

defaultConfig部分添加:

minSdkVersion 21

在strings.xml部分添加

android/app/src/main/res/values/strings.xml文件中添加以下标签(但替换为你的应用名称):

<string name="app_name">YourAppName</string>

添加库到你的应用

从我的GitHub库复制libs文件夹:

https://github.com/amorenew/nordic_id/tree/main/example/android/app/libs

并将该文件夹放到你的项目中的android/app/目录下。

然后在android/app/build.gradle文件的dependencies部分添加以下库:

implementation files('libs/NurApiAndroid/NurApiAndroid.aar')
implementation files('libs/NurDeviceUpdate/NurDeviceUpdate.aar')
implementation files('libs/NurSmartPair/NurSmartPair.aar')

使用

库的Pub链接

https://pub.dev/packages/nordic_id

导入库

import 'package:nordic_id/nordic_id.dart';
import 'package:nordic_id/tag_epc.dart';

初始化Nordic ID读取器

await NordicId.initialize;

打开连接到Nordic ID读取器

await NordicId.connect;

刷新并开始跟踪/读取ID/卡片

await NordicId.refreshTracing;

停止跟踪/读取ID/卡片

await NordicId.stopTrace;

检查是否已连接并可以开始跟踪/读取ID/卡片

bool? isConnected = await NordicId.isConnected;

监听连接状态

NordicId.connectionStatusStream
    .receiveBroadcastStream()
    .listen(updateConnection);

bool isConnectedStatus = false;

void updateConnection(dynamic result) {
  setState(() {
    isConnectedStatus = result;
  });
}

监听标签状态

NordicId.tagsStatusStream
    .receiveBroadcastStream()
    .listen(updateTags);

List<TagEpc> _data = [];

void updateTags(dynamic result) {
  setState(() {
    _data = TagEpc.parseTags(result);
  });
}

示例代码

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

import 'package:flutter/services.dart';
import 'package:nordic_id/nordic_id.dart';
import 'package:nordic_id/tag_epc.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 异步初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await NordicId.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    NordicId.connectionStatusStream
        .receiveBroadcastStream()
        .listen(updateConnection);
    NordicId.tagsStatusStream.receiveBroadcastStream().listen(updateTags);

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  List<TagEpc> _data = [];
  void updateTags(dynamic result) {
    setState(() {
      _data = TagEpc.parseTags(result);
    });
  }

  bool isConnectedStatus = false;

  void updateConnection(dynamic result) {
    setState(() {
      isConnectedStatus = result;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Nordic ID Plugin example'),
        ),
        body: Center(
          child: Column(
            children: [
              Text('Running on: $_platformVersion\n'),
              MaterialButton(
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(18.0),
                ),
                color: Colors.blueAccent,
                child: const Text(
                  'Initialize',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () async {
                  await NordicId.initialize;
                },
              ),
              MaterialButton(
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(18.0),
                ),
                color: Colors.blueAccent,
                child: const Text(
                  'Connect',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () async {
                  await NordicId.connect;
                },
              ),
              MaterialButton(
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(18.0),
                ),
                color: Colors.blueAccent,
                child: const Text(
                  'Refresh Trace',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () async {
                  await NordicId.refreshTracing;
                },
              ),
              MaterialButton(
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(18.0),
                ),
                color: Colors.blueAccent,
                child: const Text(
                  'Stop Trace',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () async {
                  await NordicId.stopTrace;
                },
              ),
              MaterialButton(
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(18.0),
                ),
                color: Colors.blueAccent,
                child: const Text(
                  'Is Connected',
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: () async {
                  bool? isConnected = await NordicId.isConnected;
                  setState(() {
                    isConnectedStatus = isConnected ?? false;
                  });
                },
              ),
              Text(
                'Nordic Reader isConnected:$isConnectedStatus',
                style: TextStyle(color: Colors.blue.shade800, fontSize: 18),
              ),
              ..._data.map(
                (TagEpc tag) => Card(
                  color: Colors.blue.shade50,
                  child: Container(
                    width: 330,
                    alignment: Alignment.center,
                    padding: const EdgeInsets.all(8.0),
                    child: Text(
                      'Tag EPC:${tag.epc} RSSI:${tag.rssi}',
                      style: TextStyle(color: Colors.blue.shade800),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter北欧ID设备交互插件nordic_id的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter北欧ID设备交互插件nordic_id的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,与Nordic ID设备进行交互可以使用nordic_id插件。这个插件通常提供了一系列的方法和类来简化与Nordic ID条码扫描器等设备的通信。以下是一个简单的代码示例,展示了如何在Flutter项目中集成并使用nordic_id插件。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  nordic_id: ^latest_version  # 替换为最新的版本号

2. 导入插件

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

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

3. 初始化插件

通常,插件的初始化会在应用的某个生命周期方法中进行,例如在MainActivity.kt(对于Android)或AppDelegate.swift(对于iOS)中进行额外的配置,但这里我们主要关注Dart代码部分。插件的具体初始化步骤可能会根据插件的文档有所不同,但一般情况下,只需要在需要使用时进行实例化即可。

4. 使用插件

以下是一个简单的示例,展示了如何连接到Nordic ID设备并读取条码数据:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Nordic ID Flutter Plugin Example'),
        ),
        body: Center(
          child: NordicIDScannerExample(),
        ),
      ),
    );
  }
}

class NordicIDScannerExample extends StatefulWidget {
  @override
  _NordicIDScannerExampleState createState() => _NordicIDScannerExampleState();
}

class _NordicIDScannerExampleState extends State<NordicIDScannerExample> {
  String scanResult = "";

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text("Scan Result: $scanResult"),
        ElevatedButton(
          onPressed: startScanning,
          child: Text("Start Scanning"),
        ),
      ],
    );
  }

  void startScanning() async {
    // 假设NordicID有一个startScanning方法,这只是一个示例
    // 实际方法名称和参数可能会根据插件的API有所不同
    try {
      NordicIDPlugin nordicID = NordicIDPlugin();
      nordicID.addListener((String result) {
        // 当扫描到条码时,更新UI
        setState(() {
          scanResult = result;
        });
      });

      // 开始扫描
      await nordicID.startScanning();
    } catch (e) {
      print("Error starting scan: $e");
    }
  }
}

// 这是一个假设的NordicIDPlugin类,实际使用时需要根据插件提供的API进行调整
class NordicIDPlugin {
  Function(String) listener;

  void addListener(Function(String) listenerFunction) {
    this.listener = listenerFunction;
  }

  Future<void> startScanning() async {
    // 模拟扫描过程,实际使用时需要与Nordic ID设备进行通信
    // 这里使用Dart的定时器来模拟异步操作
    Future.delayed(Duration(seconds: 2), () {
      if (listener != null) {
        listener("1234567890123"); // 模拟扫描到的条码数据
      }
    });
  }
}

注意:上述代码中的NordicIDPlugin类是一个假设的实现,用于说明如何设置监听器和启动扫描。在实际使用中,你需要根据nordic_id插件的API文档来正确实现这些功能。

由于nordic_id插件的具体API和实现细节可能会随着版本更新而变化,因此强烈建议查阅最新的插件文档和示例代码来获取准确的信息。

回到顶部