Qt 详解QtNFC 读写模式

文章目录

  • [Qt NFC 读写模式详解](#Qt NFC 读写模式详解)
    • [1. NFC 读写模式简介](#1. NFC 读写模式简介)
      • [1.1 什么是 NFC 读写模式?](#1.1 什么是 NFC 读写模式?)
      • [1.2 常见应用场景](#1.2 常见应用场景)
    • [2. Qt NFC 读写模式原理](#2. Qt NFC 读写模式原理)
    • [3. 配置 QtNFC 模块](#3. 配置 QtNFC 模块)
    • [4. NFC 读写操作实现](#4. NFC 读写操作实现)
    • [5. 使用注意事项](#5. 使用注意事项)
    • [6. 总结](#6. 总结)

Qt NFC 读写模式详解

NFC(近场通信)是一种短距离无线通信技术,支持设备间在近距离内(10 厘米以内)交换信息。Qt 提供了强大的 QtNFC 模块,允许开发者轻松实现 NFC 的功能。在本文中,我们将聚焦于 NFC 的读写模式,详细介绍其工作原理以及如何在 Qt 中实现读写操作。


1. NFC 读写模式简介

1.1 什么是 NFC 读写模式?

NFC 读写模式是 NFC 三种工作模式之一。在这种模式下,主动设备(例如智能手机或 NFC 读卡器)可以读取被动设备(如 NFC 标签)上的数据,或者向其写入数据。

主要功能:
  • 读取数据:主动设备扫描并读取 NFC 标签中的数据(如文本、URL 等)。
  • 写入数据:主动设备向 NFC 标签写入数据,实现动态数据交互。

1.2 常见应用场景

  • 扫描商品上的 NFC 标签以获取产品信息。
  • 写入名片信息到 NFC 标签,实现快速分享。
  • 更新 NFC 标签内容用于动态广告牌。
  • 读取门禁卡或车票上的信息。

2. Qt NFC 读写模式原理

在 Qt 中,NFC 读写操作由 QNearFieldManager 和 QNearFieldTarget 类实现:

  1. QNearFieldManager

    管理 NFC 硬件设备的状态,负责扫描附近的 NFC 标签。

  2. QNearFieldTarget

    表示检测到的 NFC 标签,用于读取或写入数据。

  3. NDEF 消息格式

    NFC 数据交换格式(NDEF,NFC Data Exchange Format)是 NFC 标签中存储和交换数据的标准格式。Qt 提供了 QNdefMessage 和 QNdefRecord 类来处理 NDEF 数据。


3. 配置 QtNFC 模块

在使用 QtNFC 模块前,需要在 .pro 文件中添加模块依赖:

pro 复制代码
QT += nfc

在代码中包含头文件:

cpp 复制代码
#include <QNdefMessage>
#include <QNdefRecord>
#include <QNearFieldManager>
#include <QNearFieldTarget>

4. NFC 读写操作实现

4.1 NFC 标签读取

以下是一个简单的 NFC 读取示例代码:

代码示例
cpp 复制代码
#include <QApplication>
#include <QNearFieldManager>
#include <QNearFieldTarget>
#include <QNdefMessage>
#include <QNdefRecord>
#include <QDebug>

class NfcReader : public QObject {
    Q_OBJECT

public:
    NfcReader(QObject *parent = nullptr) {
        manager = new QNearFieldManager(this);

        connect(manager, &QNearFieldManager::targetDetected, this, &NfcReader::onTargetDetected);
        connect(manager, &QNearFieldManager::targetLost, this, &NfcReader::onTargetLost);

        manager->startTargetDetection();
    }

    ~NfcReader() {
        manager->stopTargetDetection();
    }

private slots:
    void onTargetDetected(QNearFieldTarget *target) {
        qDebug() << "NFC 标签已检测到!";

        // 读取 NDEF 消息
        connect(target, &QNearFieldTarget::ndefMessageRead, this, [=](const QNdefMessage &message) {
            for (const QNdefRecord &record : message) {
                qDebug() << "记录类型:" << record.typeNameFormat();
                qDebug() << "记录内容:" << record.payload();
            }
            target->deleteLater();
        });

        target->readNdefMessages();
    }

    void onTargetLost(QNearFieldTarget *target) {
        qDebug() << "NFC 标签已丢失!";
        target->deleteLater();
    }

private:
    QNearFieldManager *manager;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    NfcReader reader;
    return app.exec();
}
功能解析
  1. 使用 QNearFieldManager 开始目标检测。
  2. 当检测到 NFC 标签时,触发 targetDetected 信号。
  3. 使用 readNdefMessages 方法读取标签中的 NDEF 消息。
  4. 通过解析 QNdefMessage 和 QNdefRecord 获取记录内容。

4.2 NFC 标签写入

以下是一个 NFC 写入示例代码:

代码示例
cpp 复制代码
#include <QApplication>
#include <QNearFieldManager>
#include <QNearFieldTarget>
#include <QNdefMessage>
#include <QNdefRecord>
#include <QDebug>

class NfcWriter : public QObject {
    Q_OBJECT

public:
    NfcWriter(QObject *parent = nullptr) {
        manager = new QNearFieldManager(this);

        connect(manager, &QNearFieldManager::targetDetected, this, &NfcWriter::onTargetDetected);

        manager->startTargetDetection();
    }

    ~NfcWriter() {
        manager->stopTargetDetection();
    }

private slots:
    void onTargetDetected(QNearFieldTarget *target) {
        qDebug() << "NFC 标签已检测到,开始写入数据!";

        // 创建 NDEF 消息
        QNdefMessage message;
        QNdefRecord record(QNdefRecord::Mime);
        record.setPayload("Hello, NFC!".toUtf8());
        message.append(record);

        // 写入数据
        connect(target, &QNearFieldTarget::requestCompleted, this, []() {
            qDebug() << "数据写入成功!";
        });

        connect(target, &QNearFieldTarget::error, this, [](QNearFieldTarget::Error error) {
            qDebug() << "写入失败:" << error;
        });

        target->writeNdefMessages(message);
    }

private:
    QNearFieldManager *manager;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    NfcWriter writer;
    return app.exec();
}
功能解析
  1. 使用 QNdefMessage 和 QNdefRecord 创建数据消息。
  2. 调用 writeNdefMessages 方法向 NFC 标签写入数据。
  3. 监听 requestCompleted 和 error 信号,判断写入结果。

5. 使用注意事项

  1. 硬件支持

    NFC 功能依赖设备的硬件支持。在开发前,请确保目标设备具备 NFC 功能。

  2. 权限配置

    在 Android 平台上,需要在 AndroidManifest.xml 文件中添加 NFC 权限:

    xml 复制代码
    <uses-permission android:name="android.permission.NFC" />
  3. NDEF 支持

    并非所有 NFC 标签都支持 NDEF 消息。在操作 NFC 标签时,请确认其支持的协议。

  4. 数据安全

    NFC 通信距离短,但仍需注意数据加密和防止标签克隆。


6. 总结

本文详细介绍了 NFC 的读写模式及其在 Qt 中的实现方法。通过 QtNFC 模块,开发者可以轻松实现 NFC 标签的读取和写入功能。NFC 读写模式在支付、身份验证和物联网设备交互等场景中具有广泛的应用。希望本文的示例代码和注意事项能为您开发 NFC 应用提供帮助!

相关推荐
程序喵大人1 小时前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr
禾小西1 小时前
06丨Redis 数据同步:主从库如何实现数据一致?
数据库·redis·php
weixin199701080161 小时前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
前端 贾公子1 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
薛晓刚1 小时前
PGA 超限的一次应急处置:扩容、清游标、杀会话
数据库
CJi0NG1 小时前
【自用】MySQL-事务
数据库·mysql
汉克老师1 小时前
CSP-S 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-s·小学生·学c++编程
_wyt0012 小时前
洛谷 P10112 [GESP202312 八级] 奖品分配 题解
c++·数学·gesp·八级
xuxigifxfh2 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
我不会插花弄玉2 小时前
4.string类型【由浅入深-redis】
数据库·redis·缓存