使用flutter开发windows桌面软件读取ACR22U设备的nfc卡片id,5分钟搞定demo

最近有个需求,要使用acr122u读卡器插入电脑usb口,然后读取nfc卡片的id,并和用户账号绑定,调研了很多方式,之前使用rust实现过一次,还有go实现过一次,然后使用electron的时候遇到安装pcsc-lite失败的问题,一直不能成功解决,所以就考虑使用flutter试试,结果成功了,哈哈哈,在这里记录一下过程。

安装依赖

我使用的依赖库是:flutter_pcsc | Flutter Package

所以按照官方提示直接添加依赖项到pubspec.yaml中:

flutter_pcsc: ^0.0.4

然后使用 pub get 命令获取安装一下依赖:

写代码读取nfc

直接复制官方的demo案例代码:

import 'package:flutter/material.dart';
import 'dart:async';import 'package:flutter_pcsc/flutter_pcsc.dart';void main() {MyApp? myApp;runZonedGuarded(() async {WidgetsFlutterBinding.ensureInitialized();FlutterError.onError = (FlutterErrorDetails details) {FlutterError.dumpErrorToConsole(details);myApp?.addError(details.toString());};runApp(myApp = MyApp());}, (Object error, StackTrace stack) {myApp?.addError(error.toString());});
}class MyApp extends StatelessWidget {final GlobalKey<_MyAppBodyState> _myAppKey = GlobalKey();MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('Plugin example app'),),body: MyAppBody(key: _myAppKey)),);}void addError(String msg) {_myAppKey.currentState?.messages.add(Message.error(msg));}
}class MyAppBody extends StatefulWidget {const MyAppBody({required Key key}) : super(key: key);@override_MyAppBodyState createState() {return _MyAppBodyState();}
}enum MessageType { info, error }class Message {final String content;final MessageType type;Message(this.type, this.content);static info(String content) {return Message(MessageType.info, content);}static error(String content) {return Message(MessageType.error, content);}
}class _MyAppBodyState extends State<MyAppBody> {static const List<int> getCardSerialNumberCommand = [0xFF,0xCA,0x00,0x00,0x00];final ScrollController _scrollController = ScrollController();final List<Message> messages = [];@overridevoid initState() {super.initState();getCardSerialNumber();}Future<void> getCardSerialNumber() async {int ctx = await Pcsc.establishContext(PcscSCope.user);CardStruct? card;try {List<String> readers = await Pcsc.listReaders(ctx);if (readers.isEmpty) {messages.add(Message.error('Could not detect any reader'));} else {String reader = readers[0];setState(() {messages.add(Message.info('Using reader: $reader'));});card = await Pcsc.cardConnect(ctx, reader, PcscShare.shared, PcscProtocol.any);var response = await Pcsc.transmit(card, getCardSerialNumberCommand);var sw = response.sublist(response.length - 2);var sn = response.sublist(0, response.length - 2);if (sw[0] != 0x90 || sw[1] != 0x00) {setState(() {messages.add(Message.error('Card returned an error: ${hexDump(sw)}'));});} else {setState(() {messages.add(Message.info('Card Serial Number is: ${hexDump(sn)}'));messages.add(Message.info('Done'));});}}} finally {if (card != null) {try {await Pcsc.cardDisconnect(card.hCard, PcscDisposition.resetCard);} on Exception catch (e) {messages.add(Message.error(e.toString()));}}try {await Pcsc.releaseContext(ctx);} on Exception catch (e) {messages.add(Message.error(e.toString()));}}}static String hexDump(List<int> csn) {return csn.map((i) => i.toRadixString(16).padLeft(2, '0').toUpperCase()).join(' ');}_scrollToBottom() {_scrollController.jumpTo(_scrollController.position.maxScrollExtent);}@overrideWidget build(BuildContext context) {TextStyle errorStyle = const TextStyle(color: Colors.red);WidgetsBinding.instance?.addPostFrameCallback((_) => _scrollToBottom());return Row(crossAxisAlignment: CrossAxisAlignment.start, children: [Expanded(child: Column(children: [Expanded(child: ListView(controller: _scrollController,children: messages.map((e) => Text(e.content,style: e.type == MessageType.error ? errorStyle : null)).toList())),Container(margin: const EdgeInsets.all(10),child: ElevatedButton(onPressed: () async {await tryAgain();},child: const Text("Try again")))]))]);}tryAgain() async {messages.clear();await getCardSerialNumber();}
}

运行后应该是啥都没有的空页面,这时候插上acr122u设备,并放上nfc卡片:

然后点击下面的 Try again 按钮:就成功了 

打包测试

打包成msix或者exe程序测试一下,如果你想打包成msix安装包,可以看我的另外一篇文章:https://xiaoshen.blog.csdn.net/article/details/135308360

执行命令打包:

# 打包成exe程序flutter build# 如果你想打包成msix程序,需要安装msix依赖dart run msix:create

 看到成功后就可以了

然后到项目里面这个文件夹下面,找到这个安装包,安装后运行一下试试:完美撒花

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/310438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hexo 部署 Github Pages, Github Actions自动部署

想整个静态的博客部署在github pages 历经两天的折磨终于是摸索成功了&#xff0c;官网的文档太简陋了&#xff0c;很多东西没说清楚。 欢迎大家访问我的博客&#xff01; CanyueThis is Canyues blog.https://mobeicanyue.github.io/ 最终实现的效果&#xff0c;一个项目仓库…

R统计学1 - 基础操作入门问题1-20

R统计学入门基础问题 1. 如何生成100个高斯&#xff08;正态&#xff09;分布随机数 x <- rnorm(100, mean 5, sd 0.1) x # [1] 4.893534 5.046611 5.081097 4.979164 5.181700 5.038192 5.135376 5.173346 4.968877 4.986146 # [11] 4.946258 5.198199 5.055531 4.9430…

Linux 运维工具之1Panel

一、1Panel 简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 特点&#xff1a; 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b;高效管理&#xff1a;通过 Web 端轻松管理 Linux 服务器&#xff0…

【Matlab】ELM极限学习机时序预测算法

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88681649 一&#xff0c;概述 ELM&#xff08;Extreme Learning Machine&#xff09;是一种单层前馈神经网络结构&#xff0c;与传统神经网络不同的是&#xff0c;ELM的隐层神经元权重以及偏置都是随机产生的…

利用网络教育系统构建个性化学习平台

在现代教育中&#xff0c;网络教育系统作为一种创新的学习方式&#xff0c;为学生提供了更加个性化和灵活的学习体验。在本文中&#xff0c;我们将通过简单的技术代码&#xff0c;演示如何构建一个基础的网络教育系统&#xff0c;为学生提供个性化的学习路径和资源。 1. 环境…

迪杰斯特拉(Dijkstra)算法详解

【专栏】数据结构复习之路 这篇文章来自上述专栏中的一篇文章的节选&#xff1a; 【数据结构复习之路】图&#xff08;严蔚敏版&#xff09;两万余字&超详细讲解 想了解更多图论的知识&#xff0c;可以去看看本专栏 Dijkstra 算法讲解&#xff1a; 迪杰斯特拉算法(Di…

数据库开发之子查询案例的详细解析

1.5 案例 基于之前设计的多表案例的表结构&#xff0c;我们来完成今天的多表查询案例需求。 准备环境 将资料中准备好的多表查询的数据准备的SQL脚本导入数据库中。 分类表&#xff1a;category 菜品表&#xff1a;dish 套餐表&#xff1a;setmeal 套餐菜品关系表&#x…

【计算机网络】第五,六章摘要重点

1.运输层协议概述 运输层提供的是进程之间的通信 2. 3.套接字指的是什么 ip地址端口号 4.每一条TCP语句唯一地被通信两端连接的两个端点 5.TCP传输如何实现 以字节为单位的滑动窗口 超时重传 选择确认 6.TCP流量控制和拥塞控制的区别 流量控制&#xff1a;点对点通信…

SpringMVC学习与开发(四)

注&#xff1a;此为笔者学习狂神说SpringMVC的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 11、Ajax初体验 1、伪造Ajax 结果&#xff1a;并未有xhr异步请求 <!DOCTYPE html> &…

vscode: make sure you configure your user.name and user.email in git

一、问题描述 使用VScode编辑代码后&#xff0c;Push到云端报错&#xff1a;Make sure you configure your "user.name" and "user.email" in git 二、解决方案 解决步骤&#xff1a; 1.打开Git Bash&#xff1a; 2.输入命令&#xff1a; git config -…

论文阅读——EfficientViT(cvpr2023)

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 1、 从三个角度探讨如何提高vision transformers的效率&#xff1a;内存访问、计算冗余和参数使用。 2.1. Memory Efficiency 红色字体表示操作所花费的时间主要由内存访问决定&#xff0c;…