Flutter智能卡读写插件dart_pcsc的使用

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

Flutter智能卡读写插件dart_pcsc的使用

特性

  • 可以发送/接收APDU到智能卡
  • 等待卡片与读取器
  • 支持Linux和Windows
  • 可以在纯Dart环境中以及Flutter中使用

开始使用

在Linux上,安装pcsc-lite。 在Windows上,无需额外设置。

使用方法

请参阅示例代码

其他信息

目前,并非所有由C API提供的函数都已覆盖。欢迎提交拉取请求。


示例代码

import 'dart:typed_data';

import 'package:dart_pcsc/dart_pcsc.dart';

void main() async {
  // 创建一个Context对象,作用域为用户
  final context = Context(Scope.user);

  try {
    // 建立连接
    await context.establish();

    // 获取读取器列表
    List<String> readers = await context.listReaders();

    // 如果没有读取器,则输出提示并退出
    if (readers.isEmpty) {
      print('没有读取器');
      return;
    }
    print('读取器: $readers');

    // 等待卡片插入
    print('等待卡片插入');
    List<String> withCard = await context.waitForCard(readers).value;

    // 连接到卡片
    print('连接到卡片: ${withCard.first}');
    Card card = await context.connect(
      withCard.first,
      ShareMode.shared,
      Protocol.any,
    );

    // 发送APDU命令
    print('传输数据');
    Uint8List resp = await card.transmit(
      Uint8List.fromList([0x00, 0xA4, 0x04, 0x00, 1, 2, 3]), // SELECT DF_TELECOM command
    );

    // 解析响应状态
    int status = (resp[0] << 8) + resp[1];
    print('状态: 0x${status.toRadixString(16)}');

    // 断开卡片连接
    await card.disconnect(Disposition.resetCard);
  } finally {
    // 释放资源
    await context.release();
  }
}

更多关于Flutter智能卡读写插件dart_pcsc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter智能卡读写插件dart_pcsc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用dart_pcsc插件进行智能卡读写的示例代码。dart_pcsc是一个Flutter插件,允许你通过PC/SC(Personal Computer/Smart Card)接口与智能卡进行交互。

前提条件

  1. 确保你的开发环境已经安装并配置好了Flutter。
  2. 确保你的计算机上安装了PC/SC驱动程序,并连接了智能卡读卡器。

步骤

  1. 添加依赖

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

    dependencies:
      flutter:
        sdk: flutter
      dart_pcsc: ^最新版本号
    

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

  2. 权限设置

    确保你的Android和iOS项目已经配置了必要的权限。对于Android,你可能需要在AndroidManifest.xml中添加一些权限(例如,对于智能卡访问,通常需要BLUETOOTHBLUETOOTH_ADMIN等权限,但具体权限可能因智能卡类型而异)。对于iOS,通常不需要特别的权限配置,但请确保你的项目配置正确。

  3. 编写代码

    下面是一个简单的Flutter应用示例,展示了如何使用dart_pcsc插件进行智能卡的基本读写操作:

    import 'package:flutter/material.dart';
    import 'package:dart_pcsc/dart_pcsc.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Smart Card Example',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: SmartCardScreen(),
        );
      }
    }
    
    class SmartCardScreen extends StatefulWidget {
      @override
      _SmartCardScreenState createState() => _SmartCardScreenState();
    }
    
    class _SmartCardScreenState extends State<SmartCardScreen> {
      List<PCSCReader> readers = [];
      List<APDUCommand> commands = [];
      List<Uint8List> responses = [];
    
      @override
      void initState() {
        super.initState();
        _initReaders();
      }
    
      Future<void> _initReaders() async {
        try {
          readers = await PCSC.listReaders();
          setState(() {});
        } catch (e) {
          print("Error listing readers: $e");
        }
      }
    
      Future<void> _connectAndTransmit() async {
        if (readers.isEmpty) {
          print("No readers available");
          return;
        }
    
        try {
          var reader = readers.first;
          var card = await reader.connectAndWaitForCard();
          var atr = await card.getATR();
          print("ATR: ${atr.map(e => e.toRadixString(16).padStart(2, '0')).join('')}");
    
          // Example APDU command: SELECT MF (Master File) on a standard ISO/IEC 14443 Type A card
          var command = APDUCommand(
            cla: 0x00,
            ins: 0xA4,
            p1: 0x04,
            p2: 0x00,
            lc: 2,
            data: Uint8List.fromList([0x3F, 0x00]),
            le: 256,
          );
    
          commands.add(command);
          var response = await card.transmit(command);
          responses.add(response);
    
          print("Response: ${response.map(e => e.toRadixString(16).padStart(2, '0')).join('')}");
    
          await card.disconnect(true);
        } catch (e) {
          print("Error connecting to card: $e");
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Smart Card Example'),
          ),
          body: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              children: [
                Text('Available Readers:'),
                ...readers.map((reader) => Text(reader.name)),
                ElevatedButton(
                  onPressed: _connectAndTransmit,
                  child: Text('Connect and Transmit'),
                ),
                Text('Commands Sent:'),
                ...commands.map((command) => Text('CLA: ${command.cla.toRadixString(16).padStart(2, '0')} INS: ${command.ins.toRadixString(16).padStart(2, '0')} P1: ${command.p1.toRadixString(16).padStart(2, '0')} P2: ${command.p2.toRadixString(16).padStart(2, '0')} LC: ${command.lc} Data: ${command.data.map(e => e.toRadixString(16).padStart(2, '0')).join('')} LE: ${command.le}')),
                Text('Responses Received:'),
                ...responses.map((response) => Text(response.map(e => e.toRadixString(16).padStart(2, '0')).join(''))),
              ],
            ),
          ),
        );
      }
    }
    

解释

  1. 依赖导入:导入dart_pcsc包和其他必要的Flutter包。
  2. UI构建:使用Flutter的Material组件构建UI,包括显示可用读卡器、发送命令按钮以及显示发送的命令和接收的响应。
  3. 读卡器初始化:在initState方法中调用PCSC.listReaders()获取当前连接的读卡器列表。
  4. 连接和传输:在_connectAndTransmit方法中,连接到第一个可用的读卡器,等待卡片插入,发送APDU命令并接收响应。

注意

  • dart_pcsc插件依赖于PC/SC库,因此你需要确保你的操作系统已经安装了PC/SC兼容的读卡器驱动程序。
  • APDU命令的具体内容(如CLA、INS、P1、P2、数据字段和LE字段)取决于你要与哪种智能卡进行交互,因此你可能需要查阅特定智能卡的命令集文档。
  • 本示例中的APDU命令仅用于演示目的,实际应用中需要根据具体需求进行调整。

希望这个示例能帮助你在Flutter项目中成功使用dart_pcsc插件进行智能卡读写操作!

回到顶部