Flutter北欧ID设备交互插件nordic_id的使用
Flutter北欧ID设备交互插件nordic_id的使用
nordic_id
一个用于读取RFID/UHF标签的Flutter插件。
项目设置
添加到Android项目
在Manifest部分添加
-
在
<manifest>
标签内添加:xmlns:tools="http://schemas.android.com/tools"
-
在
<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" />
-
在
<application>
标签内添加:tools:replace="android:label"
-
在
<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
更多关于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和实现细节可能会随着版本更新而变化,因此强烈建议查阅最新的插件文档和示例代码来获取准确的信息。