Flutter RFID读写插件mfrc522的使用

Flutter RFID读写插件mfrc522的使用

简介

dart_mfrc522 是一个用于在Linux/Raspberry Pi上与MFRC522 RFID读写器进行交互的Dart库。

特性

  • 读取和写入MIFARE Classic标签
  • 简单的高级接口
  • 可配置的身份验证
  • 支持多个扇区
  • 使用硬件SPI通信

开始使用

以下是一个简单的示例代码,展示了如何使用 dart_mfrc522 插件来读取RFID卡的数据。

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

import 'package:mfrc522/mfrc522.dart';
import 'package:mfrc522/simple_mfrc522.dart';

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final rfid = SimpleMfrc522(); // 初始化RFID对象
  String cardId = 'No card detected'; // 初始状态为未检测到卡片

  @override
  void initState() {
    super.initState();
  }

  Future<String> read() async { // 定义读取方法
    try {
      var result = await rfid.read(); // 执行读取操作
      if (result['id'] != null) {
        setState(() { // 更新UI
          cardId = 'Card ID: ${result['id']}';
        });
        return 'Card ID: ${result['id']}';
      }
    } finally {
      rfid.mfrc522.dispose(); // 清理资源
    }
    return 'No card detected';
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('RFID Reader'), // 设置应用标题
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              read(); // 触发读取操作
            },
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text('点击读取卡片'), // 提示用户点击按钮读取卡片
                Text("检测到的卡片: $cardId"), // 显示检测到的卡片ID
              ],
            ),
          ),
        ),
      ),
    );
  }
}

要求

  • 操作系统: Linux/Raspberry Pi
  • 需要启用SPI
  • 需要对SPI和GPIO访问的权限

安装

pubspec.yaml 文件中添加依赖项:

dependencies:
  mfrc522: ^1.0.0

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

1 回复

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


在Flutter中使用MFRC522 RFID读写模块,通常需要通过原生代码(如Android的Java/Kotlin或iOS的Objective-C/Swift)与硬件进行交互,然后通过Flutter插件将这些功能暴露给Dart层。目前,Flutter社区可能没有现成的MFRC522插件,但你可以通过以下步骤自己实现一个。

1. 创建Flutter插件

首先,创建一个Flutter插件项目:

flutter create --template=plugin mfrc522_flutter

这将生成一个Flutter插件项目,包含Android和iOS的模板代码。

2. Android端实现

2.1 添加依赖

android/build.gradle 文件中,添加MFRC522库的依赖。你可以使用现有的Java库,或者自己实现与MFRC522的通信。

dependencies {
    implementation 'com.github.cotechde:hwsecurity:0.9.9' // 示例库,你需要找到合适的MFRC522库
}

2.2 实现原生代码

android/src/main/java/com/example/mfrc522_flutter/Mfrc522FlutterPlugin.java 中,实现与MFRC522的通信逻辑。

package com.example.mfrc522_flutter;

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

public class Mfrc522FlutterPlugin implements FlutterPlugin, MethodCallHandler {
    private MethodChannel channel;

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
        channel = new MethodChannel(binding.getBinaryMessenger(), "mfrc522_flutter");
        channel.setMethodCallHandler(this);
    }

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        if (call.method.equals("readRFID")) {
            // 调用MFRC522库读取RFID标签
            String tagId = readTag();
            result.success(tagId);
        } else {
            result.notImplemented();
        }
    }

    private String readTag() {
        // 实现读取RFID标签的逻辑
        return "123456789"; // 示例返回值
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        channel.setMethodCallHandler(null);
    }
}

2.3 注册插件

android/src/main/java/com/example/mfrc522_flutter/Mfrc522FlutterPlugin.java 中,确保插件已经注册。

import io.flutter.plugin.common.PluginRegistry.Registrar;

public class Mfrc522FlutterPlugin implements MethodCallHandler {
    public static void registerWith(Registrar registrar) {
        final MethodChannel channel = new MethodChannel(registrar.messenger(), "mfrc522_flutter");
        channel.setMethodCallHandler(new Mfrc522FlutterPlugin());
    }
}

3. iOS端实现

3.1 添加依赖

ios/mfrc522_flutter.podspec 文件中,添加MFRC522库的依赖。

Pod::Spec.new do |spec|
  spec.name             = 'mfrc522_flutter'
  spec.version          = '0.0.1'
  spec.summary          = 'A Flutter plugin for MFRC522 RFID module.'
  spec.description      = <<-DESC
  A Flutter plugin for MFRC522 RFID module.
                       DESC
  spec.homepage         = 'http://example.com'
  spec.license          = { :file => '../LICENSE' }
  spec.author           = { 'Your Company' => 'email@example.com' }
  spec.source           = { :path => '.' }
  spec.source_files = 'Classes/**/*'
  spec.dependency 'Flutter'
  spec.platform = :ios, '8.0'

  # 添加MFRC522库的依赖
  spec.dependency 'MFRC522', '~> 1.0.0' # 示例库,你需要找到合适的MFRC522库
end

3.2 实现原生代码

ios/Classes/Mfrc522FlutterPlugin.m 中,实现与MFRC522的通信逻辑。

#import "Mfrc522FlutterPlugin.h"
#import <MFRC522/MFRC522.h> // 导入MFRC522库

@implementation Mfrc522FlutterPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    FlutterMethodChannel* channel = [FlutterMethodChannel
        methodChannelWithName:@"mfrc522_flutter"
              binaryMessenger:[registrar messenger]];
    Mfrc522FlutterPlugin* instance = [[Mfrc522FlutterPlugin alloc] init];
    [registrar addMethodCallDelegate:instance channel:channel];
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
    if ([call.method isEqualToString:@"readRFID"]) {
        // 调用MFRC522库读取RFID标签
        NSString* tagId = [self readTag];
        result(tagId);
    } else {
        result(FlutterMethodNotImplemented);
    }
}

- (NSString*)readTag {
    // 实现读取RFID标签的逻辑
    return @"123456789"; // 示例返回值
}
@end

4. 在Flutter中使用插件

在Flutter项目中,你可以通过以下方式使用该插件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MFRC522 Flutter Plugin'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              String tagId = await Mfrc522Flutter.readRFID();
              print('RFID Tag: $tagId');
            },
            child: Text('Read RFID'),
          ),
        ),
      ),
    );
  }
}
回到顶部