Funpack2-6:基于 NRF7002-DK 模拟 NFC 卡片
使用板卡的NFC功能,模拟出一个自定义功能的卡片,使用手机靠近并能读取卡片信息。
标签
嵌入式系统
Funpack活动
rose_man
更新2023-10-13
462

Funpack2-6:基于 NRF7002-DK 模拟 NFC 卡片

模拟 NFC 卡片:使用板卡的NFC功能,模拟出一个自定义功能的卡片,使用手机靠近并能读取卡片信息。

一、设计思路

我们首先来了解一下模拟 NFC 的原理,模拟NFC发送消息的原理涉及到两个关键概念:NFC卡片模拟和NFC数据交换。下面是模拟NFC发送消息的基本原理:

  1. NFC卡片模拟

    NFC卡片模拟是指通过特定的硬件设备或模块模拟一个NFC卡片的行为,使其能够与支持NFC通信的设备(如智能手机)进行互动。这通常需要以下步骤:

    • 硬件设置:您需要一个NFC模块或芯片,它能够模拟NFC卡片的功能。这个模块通常包括一个天线和与控制器相连的电路。在您的硬件中,您需要确保NFC模块与相应的控制器或微控制器连接,并提供所需的电源。

    • 数据存储:您需要在NFC模块中存储要发送的数据。这可以是文本、URL、应用程序标识符或其他自定义数据。这些数据将在模拟卡片时发送给读取器设备(例如智能手机)。

    • 卡片模拟:NFC模块在工作模式下模拟NFC卡片的行为。当另一个设备(如智能手机)接近NFC模块时,它会发送包含模拟卡片数据的信号。

    • NDEF 消息:通常,NFC 标签会包含一个或多个 NDEF(NFC Data Exchange Format)消息。NDEF 是一种标准的数据格式,用于在 NFC 设备之间交换信息。您可以在 NDEF 消息中包含各种信息,例如文本、网址、联系人信息等。

    • NDEF 记录:NDEF 消息由一个或多个 NDEF 记录组成。每个 NDEF 记录包含一种类型的数据(例如文本、URI、MIME 类型等)以及相应的数据。在模拟的标签上,您可以创建和存储这些 NDEF 记录,以便其他设备读取和处理。

    • 事件处理:当另一个 NFC 设备靠近模拟标签时,NFC 标签模拟器会检测到 NFC 字段的存在,并触发相应的事件。您可以编写事件处理代码来响应这些事件,例如在检测到 NFC 字段时执行特定操作,或在读取请求时发送相应的 NDEF 消息。

  2. NFC数据交换

    一旦NFC模块成功模拟了一个NFC卡片,它可以与支持NFC通信的设备进行数据交换。这通常遵循以下过程:

    • 初始化:当智能手机或其他读取器设备靠近NFC模块时,它们会识别到模拟的NFC卡片,并建立通信连接。

    • 数据交换:一旦建立连接,数据可以在设备之间传输。这包括将数据从NFC模块发送到读取器设备,或将数据从读取器设备发送到NFC模块。

    • 数据处理:接收数据的设备可以处理接收到的数据,例如打开URL、执行应用程序或显示文本信息。

    • 断开连接:通信完成后,设备可以关闭NFC连接。

需要注意的是,NFC通信通常是近距离通信,通信双方需要非常接近(通常在几厘米内)。这种近场通信可以确保通信的安全性,因为通信距离非常有限,难以被不必要的观察者截取。总之,模拟NFC发送消息的原理涉及模拟NFC卡片行为并与支持NFC通信的设备进行数据交换。这种技术在各种应用中都有用途,包括移动支付、智能门锁、物联网设备配置等。

二、流程图

FnYl63FuPBac_fMIxkLphEdIJZUF

三、硬件介绍

nRF7002-DK是用于nRF7002 Wi-Fi 6协同IC的开发套件,该开发套件采用nRF5340多协议片上系统 (SoC) 作为nRF7002的主处理器,在单一的电路板上包含了开发工作所需的一切,可让开发人员轻松开启基于nRF7002 的物联网项目。该 DK 包括 Arduino 连接器、两个可编程按钮、一个 Wi-Fi 双频段天线和一个低功耗蓝牙天线,以及电流测量引脚。

FgO2f5FlQn_Q4vnbnlABK9yKj8sA

这款DK支持低功耗 Wi-Fi 应用开发,并实现了多项 Wi-Fi 6 功能,比如 OFDMA、波束成型和 TWT。nRF7002 Wi-Fi 6配套IC为另一个主机添加了低功耗Wi-Fi 6功能,提供无缝连接和基于Wi-Fi的定位(本地Wi-Fi集线器的SSID嗅探)功能。该IC设计用于搭配Nordic现有的nRF52®和nRF53®系列多协议片上系统 (SoC) 和nRF91®系列蜂窝物联网系统级封装 (SiP) 使用。nRF7002 IC 还可与非nordic主机器件搭配使用。通过SPI或QSPI与主机通信,并带有额外的共存功能,可与其他协议如蓝牙、Thread或Zigbee无缝共存。

nRF7002在Nordic的nRF Connect SDK中提供集成和支持。

板卡特性

  • 用于nRF7002双频带Wi-Fi 6配套IC的开发套件

  • nRF5340 SoC主机器件

  • Wi-Fi 6 (IEEE 802.11 a/b/g/n/ac/ax)、蓝牙低功耗 (LE)、蓝牙网状网络、802.15.4、Thread、Zigbee®、ANT、2.4GHz专有和NFC无线协议支持

  • 2.4GHz、5GHz芯片和NFC天线

  • SWF射频连接器

  • SEGGER J-Link板载编程器/调试器

  • 用户可编程LED (2x) 和按钮 (2x)

  • 用于测量功耗的引脚

  • 来自USB、外部或锂聚合物电池的2.9V至5.0V电源

  • Arduino连接器

应用

  • 电池供电Wi-Fi产品

  • 智慧城市和智能农业

  • 智能家居

  • 工业传感器

  • 可穿戴设备和医疗设备

此次项目就是基于Nordic的nRF Connect SDK进行开发,其基于zephyr具备非常完善的支持和丰富的例程,开发者可以极快的上手。

四、实现功能展示

手机端成功检测到 NFC,并正确接收到程序设定消息。

FtTgBPFbRSn9gnJbDT_VBv4r7ZE7

五、代码片段解释

以下这个函数用于编码NDEF文本类型消息,首先,它创建一个 NFC NDEF 文本记录描述 (nfc_en_text_rec),该记录包含英语文本;接着,它创建了一个 NFC NDEF 消息描述 (nfc_text_msg),并将文本记录添加到消息中;最后,它对整个消息进行编码,并将结果存储在指定的缓冲区中。

// 该函数用于编码NDEF文本消息。
// 它创建了一个NFC NDEF文本记录描述,并将文本数据添加到NDEF消息中。
// 然后,它对NDEF消息进行编码,并将结果存储在指定的缓冲区中。
static int text_msg_encode(uint8_t *buffer, uint32_t *len)
{
	int err;

	/* Create NFC NDEF text record description in English */
	NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_en_text_rec,
				      UTF_8,
				      en_code,
				      sizeof(en_code),
				      en_payload,
				      sizeof(en_payload));

	/* Create NFC NDEF message description, capacity - MAX_REC_COUNT
	 * records
	 */
	NFC_NDEF_MSG_DEF(nfc_text_msg, MAX_REC_COUNT);

	/* Add text records to NDEF text message */
	err = nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_text_msg),
				   &NFC_NDEF_TEXT_RECORD_DESC(nfc_en_text_rec));
	if (err < 0) {
		printk("Cannot add first record!\n");
		return err;
	}

	err = nfc_ndef_msg_encode(&NFC_NDEF_MSG(nfc_text_msg),
				      buffer,
				      len);
	if (err < 0) {
		printk("Cannot encode message!\n");
	}

	return err;
}

我们可以如下调用该函数生成对应的NDEF文本型消息后再将其发送

// 定义要发送的消息文本
static const uint8_t en_payload[] = {
	'T', 'E', 'S', 'T', 'i', 'n', 'g', '!'
};
static const uint8_t en_code[] = {'e', 'n'};

/* NDEF_MSG_BUF_SIZE定义了NFC消息缓冲区的大小 */
static uint8_t ndef_msg_buf[NDEF_MSG_BUF_SIZE];

int main(void){
    uint32_t len = sizeof(ndef_msg_buf);
    // 初始化NFC
    nfc_t2t_setup(nfc_callback, NULL) ;
    // 对消息进行编码
    text_msg_encode(ndef_msg_buf, &len);
     // 加载编码好的数据
    nfc_t2t_payload_set(ndef_msg_buf, len);
    // 开启NFC,这个时候NFC标签就能够被其他设备读取到了
    nfc_t2t_emulation_start() ;
}

运行程序,即可用手机识别并显示NFC文本信息;

NFC标签还有很多类型,例如打开一个url链接,或打开一个app,这里我还对打开一个url的NFC标签进行了实现和测试,以下是简单的程序介绍。

首先,我们需要用到NFC的url相关功能,这需要在Kconfig中进行配置使能相关的功能,完成后在config文件中或多出以下内容:

CONFIG_NFC_NDEF_URI_REC=y
CONFIG_NFC_NDEF_URI_MSG=y

这个时候才能使用 nfc/ndef/uri_msg.h 库中的相关 api ,接下来我将展示如何通过手机扫描NFC进入到Github官网:

我们首先通过 nfc_ndef_uri_msg_encode 这个 api 实现一个编码NFC的url类型NDEF的函数:

static int create_uri_ndef_record(uint8_t *buffer, uint32_t *len)
{
    int err;
	/* Encode URI message into buffer. */
	err = nfc_ndef_uri_msg_encode(NFC_URI_HTTPS,
				      url,
				      sizeof(url),
				      buffer,
				      len);
	if (err) 
	{
		printk("Cannot encode message!\n");
		return err;
	}

	return 0;
}

定义一个数值存储Github官网地址,以及一个存储NDEF编码的缓冲区

/* Define the URL whitch want to open */
static const uint8_t url[] = {"www.github.com"};

/* Buffer used to hold an NFC NDEF message. */
static uint8_t ndef_msg_buf[NDEF_MSG_BUF_SIZE];

然后就可以初始化NFC,调用URL NDEF编码函数进行编码后,加载并开启NFC感应了

uint32_t len = sizeof(ndef_msg_buf);
// 初始化NFC
nfc_t2t_setup(nfc_callback, NULL) ;
// 对消息进行编码
create_uri_ndef_record(ndef_msg_buf, &len);
// 加载编码好的数据
nfc_t2t_payload_set(ndef_msg_buf, len);
// 开启NFC,这个时候NFC标签就能够被其他设备读取到了
nfc_t2t_emulation_start() ;

即可通过手机扫描NFC访问Github官网。

六、未来的计划和建议

通过参与这个项目,我学到了很多关于NFC技术和硬件开发的知识。在项目中,我深入了解了nRF7002-DK板卡的功能和配置,以及如何与手机进行NFC通信。这个示例可以作为在嵌入式系统中使用NFC的起点,例如在智能家居、物联网设备或其他NFC应用中。它演示了如何创建NDEF消息并与NFC硬件交互。我建议在未来的活动中提供更多的示范和教程,以帮助参与者更好地理解和应用相关技术。此外,提供更多的硬件资源和支持也将有助于参与者更轻松地完成类似的项目。

总的来说,这个项目为我提供了宝贵的学习经验,并增强了我的硬件和软件开发能力,打开了我学习zephyr和Iot的大门。我期待未来能够参与更多的类似活动,继续拓展我的技术知识和项目经验。

附件下载
nfc.zip
团队介绍
个人
团队成员
褚仕成
在读大四学生
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号