一,问题

最新,项目对Flutter 读取公交卡内容进行了调查,在pub上看到nfc_manager 反馈还不错,就下了代码使用。因为是对日项目,所以主要是针对日系的Felica的读取,用了一个下午的时间,调查了一下,基本目的可以达到。在此,总结一下几个关键点,希望可以帮助到更多的小伙伴。

二,正文

nfc_manager 提供了一个非常不错的例子,利用他,我们可以实现nfc卡的基本信息读取。通过读取我们可以获得nfc卡的基本信息。然后我根据tag类型,对felica的信息进行了读取。这里还特意去sony官网查看了相关的卡片文档资料。如果你是一个日系开发者,想看相关的文档,可以参看一下网站,收益匪浅。

ソニー株式会社 | FeliCa | 法人のお客様 | 技術情報

suica - FeliCa Library Wiki - FeliCa Library - OSDN

[PASMO] FeliCa から情報を吸い出してみる - FeliCaの仕様編 [Android][Kotlin] - Qiita

https://www.kenichi-odo.com/articles/2020_10_08_read-suica-by-android

基于上面的文章,我得到了一下两个重要的结论:

  • felica 中存储的信息最多是20条记录,者20条记录需要通过指令读取,而且一次最多只能读取15条,如果想读取20条信息的话,你就要读两次。
  • 两条命令之间需要有一定的时间间隔 >=501um 。这个需要注意,否则会出问题。

下面就是我写的一个建单例子。大家关注_tagRead和_getReadHistoryCommandBytes就好。

import 'dart:typed_data';
import 'package:nfc_manager/platform_tags.dart';
import 'package:flutter/material.dart';
import 'package:nfc_manager/nfc_manager.dart';void main() {WidgetsFlutterBinding.ensureInitialized();runApp(MyApp());
}class MyApp extends StatefulWidget {@overrideState<StatefulWidget> createState() => MyAppState();
}class MyAppState extends State<MyApp> {ValueNotifier<dynamic> result = ValueNotifier(null);@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('NfcManager Plugin Example')),body: SafeArea(child: FutureBuilder<bool>(future: NfcManager.instance.isAvailable(),builder: (context, ss) => ss.data != true? Center(child: Text('NfcManager.isAvailable(): ${ss.data}')): Flex(mainAxisAlignment: MainAxisAlignment.spaceBetween,direction: Axis.vertical,children: [Flexible(flex: 2,child: Container(margin: EdgeInsets.all(4),constraints: BoxConstraints.expand(),decoration: BoxDecoration(border: Border.all()),child: SingleChildScrollView(child: ValueListenableBuilder<dynamic>(valueListenable: result,builder: (context, value, _) =>Text('${value ?? ''}'),),),),),Flexible(flex: 3,child: GridView.count(padding: EdgeInsets.all(4),crossAxisCount: 2,childAspectRatio: 4,crossAxisSpacing: 4,mainAxisSpacing: 4,children: [ElevatedButton(child: Text('Tag Read'), onPressed: _tagRead),ElevatedButton(child: Text('Ndef Write'),onPressed: _ndefWrite),ElevatedButton(child: Text('Ndef Write Lock'),onPressed: _ndefWriteLock),],),),],),),),),);}void _tagRead() {NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async {result.value = tag.data;Uint8List commoddata1= _getReadHistoryCommandBytes(NfcF.from(tag)!.identifier,10,0);Uint8List commoddata2= _getReadHistoryCommandBytes(NfcF.from(tag)!.identifier,10,10);print( NfcF.from(tag)?.identifier.length);print( NfcF.from(tag));List<int> command=[];command.addAll(commoddata1);// command.addAll(commoddata);Uint8List.fromList(command);await NfcF.from(tag)?.transceive(data: commoddata1).then((value) {print((value.length - 1) / 15);print(value);});await Future.delayed(const Duration(seconds: 1));await NfcF.from(tag)?.transceive(data: commoddata2).then((value) {print((value.length - 1) / 15);print(value);});NfcManager.instance.stopSession();});}void _ndefWrite() {NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async {var ndef = Ndef.from(tag);if (ndef == null || !ndef.isWritable) {result.value = 'Tag is not ndef writable';NfcManager.instance.stopSession(errorMessage: result.value);return;}NdefMessage message = NdefMessage([NdefRecord.createText('Hello World!'),NdefRecord.createUri(Uri.parse('https://flutter.cn')),NdefRecord.createMime('text/plain', Uint8List.fromList('Hello'.codeUnits)),NdefRecord.createExternal('com.example', 'mytype', Uint8List.fromList('mydata'.codeUnits)),]);try {await ndef.write(message);result.value = 'Success to "Ndef Write"';NfcManager.instance.stopSession();} catch (e) {result.value = e;NfcManager.instance.stopSession(errorMessage: result.value.toString());return;}});}void _ndefWriteLock() {NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async {var ndef = Ndef.from(tag);if (ndef == null) {result.value = 'Tag is not ndef';NfcManager.instance.stopSession(errorMessage: result.value.toString());return;}try {await ndef.writeLock();result.value = 'Success to "Ndef Write Lock"';NfcManager.instance.stopSession();} catch (e) {result.value = e;NfcManager.instance.stopSession(errorMessage: result.value.toString());return;}});}
}Uint8List _getReadHistoryCommandBytes(Uint8List identifier,int size,int offset) {List<int> command=[];command.add(0); // data length. change after all byte set.command.add(0x06);        // Felica command, Read Without Encryptioncommand.addAll(identifier);       // NFC ID (8byte)command.add(1);           // service code length (2byte)command.add(0x0f);        // low byte of service code for pasmo history (little endian)command.add(0x09);        // high byte of service code for pasmo history (little endian)command.add(size);        // number of block. (=< 15)for (int i = offset; i < offset+size; i++) {command.add(0x80);    // ブロックエレメント上位バイト 「Felicaユーザマニュアル抜粋」の4.3項参照command.add(i);       // ブロック番号}int length=command.length;command.replaceRange(0, 1, [length]);print(command);return Uint8List.fromList(command);
}

【Flutter】利用nfc_manager 读取NFC交通卡信息相关推荐

  1. NFC交通卡移动支付产业链

    移动支付是指用户通过移动终端等设备进行支付的一种方式,实现用户随时随地进行商务活动,是移动电子商务优势得以体现的重要基础.其中NFC(Near Field Communication)是一种短距离的高 ...

  2. 华为近场通讯nfc在哪里打开_华为手机怎么使用NFC功能?华为手机使用NFC交通卡功能教程...

    NFC(Near Field Communication)即近距离无线通讯技术(近场通信),是一种非接触式识别和互联技术,可以在移动设备.消费类电子产品等设备间进行近距离无线通信.通过 NFC 可实现 ...

  3. Windows mobile 下读取手机SIM卡信息

    最近在忙一个移动警务的项目,需要获取SIM卡的信息,来做身份的验证.考虑到获取:国际移动设备识别码(IMEI:International Mobile Equipment Identification ...

  4. iqn怎么查 linux_如何利用procfs读取iSCSI Initiator IQN信息

    在基于iSCSI构建的IP SAN系统中,为了便于targetd端对initiator进行访问权限管理和存储资源分配,有的客户通常需要尽可能早地得到initiator的IQN名称乃至其IP信息.常用的 ...

  5. 小米6能读取卡信息无服务器,MIUI官方回应:米6公交开卡系服务升级、NFC功能可正常使用...

    原标题:MIUI官方回应:米6公交开卡系服务升级.NFC功能可正常使用 近日,有消息称小米6因为系统升级暂时关闭了NFC公交开卡服务,或涉及虚假宣传.对此,小米官方也给予了回应,以下为小米MIUI官方 ...

  6. android nfc读取公交卡信息_手机NFC可以复制小区用的门禁卡吗?

    很多带有NFC功能的手机和手环,可以用来代替小区门禁卡.公司门禁,以及各类一卡通.(NFC是一种非接触式通讯技术,工作的理论距离是0~10cm)以前出门必备手机.钱包.钥匙三件套,自移动支付出现.使用 ...

  7. Android NFC的初次使用——公交卡信息读取

    通过NFC的读模式,读取公交卡的余额和交易记录.这是一个开源的工程,可以读取深圳通.羊城通.北京卡.八达通.武汉通等等. 1.首先要在AndroidManifest.xml中声明如下配置信息: 使用& ...

  8. Android NFC源码读取公交卡信息余额和交易记录

    通过NFC的读模式,读取公交卡的余额和交易记录.可以读取深圳通.羊城通.北京卡.八达通.武汉通等. 源码亲测可用放心下载. 源码下载Eclipse版本:Android NFC源码读取公交卡信息余额和交 ...

  9. Android Studio NFC读取CPU卡信息

    今天接到一个NFC读CPU卡的需求,做个总结. 总结之前,吐槽一下,一定要查一下测试机支不支持NFC功能,我拿乐视S3开发了一上午,以为哪里出了BUG或者权限没加,查了无数资料,下了十几个demo,死 ...

最新文章

  1. c语言是函数式原型的编程,编程范式|程序世界里的编程范式,探索编程本质
  2. 网络布线,多图、有细节,【炮哥】讲诉,值得无经验午饭手抄
  3. 前端进阶-Event
  4. 【图像分类】 标签噪声对分类性能会有什么样的影响?
  5. [Asp.Net+C#]Datagrid使用技巧一(怎样灵活控制表头)
  6. NOT运算符与运算符
  7. ssl1614-医院设置【图论,最短路】
  8. c++ 模拟拖动_2020电工(中级)模拟考试题及电工(中级)模拟考试题库
  9. 【最详细】数据结构(C语言版 第2版)课后习题答案全集 严蔚敏 等 编著
  10. 网易云邮箱验证码注册及修改密码
  11. MATLAB 绘制对数图操作陷阱 hold on的位置
  12. 计算机手机共享上网,电脑建WIFI热点 手机共享上网教程
  13. 谈谈你对Spring 的理解
  14. 编辑视频贴纸软件_12款自媒体视频剪辑制作软件,爆款内容必备神器!
  15. 小米打印机显示服务器出错,更换小米路由器后打印机无法工作解决办法
  16. vue项目中常用的优秀插件库
  17. stata学习笔记|异方差问题
  18. 2-3 Coursera吴恩达《改善深度神经网络》第三周课程笔记-超参数调试、Batch正则化和编程框架
  19. 高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了
  20. shell编程-运算符-环境变量-变量类型声明

热门文章

  1. Android USB系统(一)
  2. 【SQLYOG】SSH ERROR:UNABLE TO OPEN CONNECTION:GETHOSTBYNAME:UNKNOWN ERROR牵引出来的一系列问题...
  3. 【看表情包学Linux】进程阻塞 | 轮询检测 | 基于非阻塞等待的轮询方案 | 进程程序替换 | exec 函数簇
  4. 阿里云服务器云数据库免费体验(Java Web详细实例)
  5. Android 通知屏幕亮起
  6. TITAN RTX 与 RTX 3090 参数的对比,探计单双精度的问题
  7. 如何实现自有App上的小程序第三方微信授权登陆?
  8. 华为p40pro,小米10pro,适合自己的才是最好的
  9. 网格背景教师公开课教学课件PPT模板
  10. 为什么C++被公认为是最难的语言?