Funpack2-6 基于nRF7002 实现模拟NFC 手机刷后自动跳转bilibili
Funpack2-6 基于nRF7002 实现模拟NFC 手机自动跳转指定app bilibili
标签
嵌入式系统
Funpack活动
nRF7002
NFC
安先生
更新2023-10-13
404

开发板介绍

nRF7002 DK是用于nRF7002 Wi-Fi 6 协同IC的开发套件,在单一电路板上包含了启动开发工作所需要的一切。这款DK带有一个nRF5340 多协议系统级芯片(SoC),用作nRF7002的主处理器。

该DK支持低功耗Wi-Fi 应用的开发,并实现多项Wi-Fi 6功能,如OFDMA、波束成形和目标唤醒时间(TWT)。

nRF7002是可以配合Nordic现有产品一起使用的协同IC,提供无缝连接和基于Wi-Fi的定位(本地Wi-Fi集线器的SSID嗅探)。nRF7002可配合nRF52®和nRF53®系列蓝牙系统级芯片(SoC),以及nRF91®系列蜂窝物联网系统级封装(SiP)产品。nRF7002也可以与非Nordic的主机设备结合使用。

它可以通过SPI或QSPI与主机通信,并带有额外的共存功能,可与其他协议如蓝牙、Thread或Zigbee无缝共存。Nordic的nRF Connect SDK集成并支持nRF7002。
 
FpNIyJ3SUwZyUUlwiZxMyrxq54wP
 

环境配置

安装 nRF Connect for VS Code 插件
Nordic Semiconductor 的 nRF Connect for VS Code 扩展包将 VS Code 转变为完整的 IDE,用于开发与 nRF Connect SDK 兼容的应用程序。  
它包括编译器和链接器的接口、RTOS 感知调试器、nRF Connect SDK 的无缝接口以及串行终端。
按照如下顺序,依次安装:

安装 nRF 命令行工具

按照手动安装步骤安装 nRF Connect SDK

安装 VS 代码

安装 nRF Connect 扩展包

 

如何从 Marketplace 和 VS Code 安装 

要手动安装 nRF Connect for VS Code 扩展包,请使用以下选项之一:

  • 访问 Visual Studio 代码市场。
  • 直接在 VS Code 中打开扩展侧边栏并搜索扩展包。搜索关键词 nRF Connect for VS Code 

如何打开扩展

安装将 nRF Connect 图标添加到 Visual Studio Code 的活动栏中。

单击该图标可打开扩展程序。

FoN6sHJjuxFXdIaokuRdiGOdumU3

点击nRF connect后 可以创建空工程或者示例工程
如下图
FtDy2r3QQJB9jVmOJYnnszJqxlX3

这将打开“添加构建配置”页面。

Fji5zZ59a2JS4pxKtRqz2kMaZSFF

  1. 在应用程序视图中,单击包含要编辑的文件的构建文件夹。
  2. 单击右侧的菜单图标,或右键单击构建文件夹。
  3. 单击编辑构建配置。
  4. 编辑配置后,单击“构建配置”保存更改并使用新配置重建应用程序。

最终效果如下:

Fi7o4nrBljKgooj9lD00-iqYVquW

任务描述

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

模拟NFC写入bilibili的app信息,并用LED显示状态

任务分析

综合任务的需求,分析如下:
1. 模拟NFC  初始化信息 
2. 写入NFC信息  bilibili的apk信息   tv.danmaku.bili
3. 交互时状态指示 LED灯显示,离开时关闭LED灯
 

FoEjBi1tQNfySS9zmVMsiNXcCJR1

NFC关键技术

NFC是一种基于RFID(射频识别)的短距离无线通信技术,可以实现电子设备之间的非接触式点对点数据传输 

•  NFC工作在13.56 MHz的频率,属于全球免许可的ISM波段

•  NFC设备可以产生射频场,也可以利用外部射频场进行感应电源

•  NFC有三种工作模式:主动模式、被动模式和双向模式

1.主动模式下,NFC设备可以作为读卡器,发出射频场去识别和读写其他NFC设备或标签;

2. 被动模式下,NFC设备被模拟成一张卡,只在其他设备发出的射频场中被动响应,被读写信息;

3. 双向模式下,NFC设备双方都主动发出射频场来建立点对点的通信 

NFC兼容ISO/IEC 14443、ISO/IEC 15693、ISO/IEC 18092等国际标准,以及索尼的FeliCaTM标准 

NFC论坛定义了五种类型的NFC标签,分别为Type 1、Type 2、Type 3、Type 4和Type 5

不同类型的标签有不同的内存大小、数据速率、防冲突机制等特性 

NFC的应用场景包括移动支付、身份认证、文件传输、卡模拟、嵌入式体验等

NFC可以提供便捷、安全、创新的用户体验,连接物理世界和数字世界 

设计思路:

NFC功能通过板卡的主处理器nRF5340配合一片柔性NFC天线实现,实现模拟一个NFC标签,实现跳转到BILIBILI APP的功能。

核心功能包括两个部分

1. NFC模拟配置,写入app的包信息,配置好中断响应。

2. 响应指示,正常响应时,LED给出指示,代表NFC正常工作。熄灭时,NFC非工作状态。

流程图:

Fn8uqL6jKMIUmeUoiEwcj2PqRCNb

 

查找bilibili 的包名

1. 数据线连接手机,注意是调试模式哈,不然电脑无权访问手机

2. 电脑端Crtl+R  输入cmd 回车

输入 adb devices  检验是否成功连接手机

输入 adb shell  进入手机的shell

输入 pm list packages  显示所有应用包名

可以看到bilibili的包名 tv.danmaku.bili

对应定义 如下图

static const uint8_t android_pkg_name[] = {
	 't', 'v', '.', 'd', 'a', 'n', 'm', 'a', 'k', 'u', '.', 'b', 'i', 'l', 'i'
    };

核心代码与解释

  • 模拟NFC
	/* Configure LED-pins as outputs */
	err = dk_leds_init();
	if (err) {
		printk("Cannot init LEDs!\n");
		goto fail;
	}

	/* Set up NFC */
	err = nfc_t2t_setup(nfc_callback, NULL);
	if (err) {
		printk("Cannot setup NFC T2T library!\n");
		goto fail;
	}

代码解释如下:实现一个 NFC 启动应用程序的示例, 

•  调用 dk_leds_init 函数,初始化 LED 引脚为输出模式,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。

•  判断 err 变量是否为 0,如果不为 0,表示初始化 LED 失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。

•  调用 nfc_t2t_setup 函数,设置 NFC 类型 2 标签(T2T)库的回调函数和上下文参数,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。

• 判断 err 变量是否为 0,如果不为 0,表示设置 NFC T2T 库失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。

  • NFC信息写入
/* Encode launch app data  */
	err = nfc_launchapp_msg_encode(android_pkg_name,
				       sizeof(android_pkg_name),
				       universal_link,
				       sizeof(universal_link),
				       ndef_msg_buf,
				       &len);
	if (err) {
		printk("Cannot encode message!\n");
		goto fail;
	}

	/* Set created message as the NFC payload */
	err = nfc_t2t_payload_set(ndef_msg_buf, len);
	if (err) {
		printk("Cannot set payload!\n");
		goto fail;
	}

	/* Start sensing NFC field */
	err = nfc_t2t_emulation_start();
	if (err) {
		printk("Cannot start emulation!\n");
		goto fail;
	}

代码解释如下:编码启动应用程序的数据,并将其设置为 NFC 负载,然后开始模拟 NFC 标签的感应场和数据交换过程

•  调用 nfc_launchapp_msg_encode 函数,根据 Android 应用程序包名和通用链接生成一个 NDEF 消息,并存储在 ndef_msg_buf 数组中,同时更新 len 变量为消息的实际长度,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。

•  判断 err 变量是否为 0,如果不为 0,表示编码消息失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。

•  调用 nfc_t2t_payload_set 函数,将创建的 NDEF 消息设置为 NFC T2T 库的负载数据,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。

•  判断 err 变量是否为 0,如果不为 0,表示设置负载失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。

•  调用 nfc_t2t_emulation_start 函数,开始模拟 NFC T2T 标签的感应场和数据交换过程,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。

•  判断 err 变量是否为 0,如果不为 0,表示启动模拟失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。

  • 状态显示
static void nfc_callback(void *context,
			 nfc_t2t_event_t event,
			 const uint8_t *data,
			 size_t data_length)
{
	ARG_UNUSED(context);
	ARG_UNUSED(data);
	ARG_UNUSED(data_length);

	switch (event) {
	case NFC_T2T_EVENT_FIELD_ON:
		dk_set_led_on(NFC_FIELD_LED);
		break;
	case NFC_T2T_EVENT_FIELD_OFF:
		dk_set_led_off(NFC_FIELD_LED);
		break;
	default:
		break;
	}
}
代码解释如下:定义一个 NFC 回调函数,用于处理 NFC T2T 库的事件通知,具体解释如下:声明一个静态函数 nfc_callback,接受四个参数:

context 是一个指针,用于传递用户定义的上下文数据;

event 是一个枚举类型,表示 NFC T2T 库的事件类型;

data 是一个指针,指向事件相关的数据;

data_length 是一个整数,表示数据的长度。

使用 ARG_UNUSED 宏标记 context、data 和 data_length 这三个参数在函数中未使用,以避免编译器产生警告。

使用 switch 语句根据 event 参数的值执行不同的操作:

如果 event 为 NFC_T2T_EVENT_FIELD_ON,表示 NFC 感应场已开启,调用 dk_set_led_on 函数将 NFC_FIELD_LED 灯打开;

如果 event 为 NFC_T2T_EVENT_FIELD_OFF,表示 NFC 感应场已关闭,调用 dk_set_led_off 函数将 NFC_FIELD_LED 灯关闭;

如果 event 为其他值,不执行任何操作。

 

功能展示

手机靠近NFC天线时  LED会亮起来,离开时LED会熄灭。

FvmSiUxnzJClmNjh67fx0bcKL336

 

心得体会

非常感谢本次活动 。
nordicsemi 是无线传输领域的知名公司,nrf系列的芯片 一直都是很好的芯片。
这次的7002dk系列 更是其中的强者。
可以充分利用开发板的强大功能,学习wifi ble等领域的知识
希望下次活动能更丰富,接触更多的不同的领域的不同知识。
 
附件下载
record_launch_app.zip
团队介绍
安迪,热爱嵌入式的工程师
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号