Funpack第二季第六期任务三基于nRF7002-DK的NFC和串口启动手机上不同的APP
本项目使用nRF7002-DK的NFC功能,当手机靠近天线时,手机上会识别到NFC标签的消息,通过这个消息可以打开手机的网易云音乐播放音乐
标签
嵌入式系统
Funpack活动
开发板
NFC
wjhgbpqm
更新2023-10-12
杭州电子科技大学
823

Funpack第二季第六期任务三基于nRF7002-DK的NFC和串口启动手机上不同的APP

一 、nRF7002-DK硬件介绍

      nRF7002-DK——用于nRF7002 Wi-Fi 6双频辅助IC的开发套件。nRF7002 DK是nRF7002 Wi-Fi 6协同IC的开发评估板如图1所示,它包含了在单板上开发所需要的所有元器件。开发板采用nRF5340多协议SoC作为主处理器,配合nRF7002 Wi-Fi协同芯片。可以同时支持低功耗蓝牙和Wi-Fi 应用的开发,并实现如 OFDMA、波束成形和目标唤醒时间等多项 Wi-Fi 6 功能。nRF7002是Nordic的Wi-Fi产品系列中的首款器件,符合802.11ax标准,可提供双频段(2.4和5GHz)连接,支持Matter中使用的全部无线协议,可以为产品中添加最新的Wi-Fi 6技术,该芯片还具有帮助保护用户数据的先进安全功能。并与Nordic现有的超低功率技术无缝结合,可延长电池使用寿命。它提供快速、可靠的连接,具有先进的安全功能,并且方便集成到各个应用当中。板上的nRF5340是支持低功耗蓝牙、蓝Mesh、NFC、Thread和Zigbee的双核蓝牙5.3 SoC,并且蓝牙测向可实现所有到达角(AoA)和出发角(AoD)的测量功能。此外,它支持低功耗蓝牙音频,2 Mbps高吞吐量、广播扩展和长距离。像蓝牙Mesh、Thread和Zigbee这样的Mesh协议可以与低功耗蓝牙同时运行,从而使智能手机能够配网、入网、配置和控制Mesh节点。还支持NFC、ANT、802.15.4和2.4 GHz专有协议。

主要特性有

特性:

• Arduino连接器

• 两个可编程的按钮

• 搭载nRF7002 Wi-Fi协同IC

• 作为主处理器的nRF5340 SoC

• 电流测量引脚

• 2.4GHz、2.4/5 GHz和NFC天线

• 高性能的128MHz Arm Cortex-M33应用内核

• 超低功率的64MHz Arm Cortex-M33网络核心

 

 

Fku0QPbWbEpC04lsrivyrVNtR_De

图1.nRF7002-DK开发板

二、开发环境搭建

这里使用的开发环境是nRF Connect SDK2.4.1的开发环境,环境的搭建参考了官方教程,教程链接为https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/installation.html,使用VScode和nRF Connect的插件进行开发,上手和开发指南参考了funpack活动主页提供的教程,开发环境如图2.所示。

FmFId62MxL38q2B0LF0FKEY9Qgav

图2.开发环境

三、任务说明

这里主要有4个任务如下

任务一:

  • 使用板卡的蓝牙连接,设计一个蓝牙鼠标+键盘复合设备,按键1作为鼠标点击,按键2作为键盘输入按下时输入“eetree”字符,电脑开启大写锁定时,板卡的LED亮起

任务二:

  • 使用WiFi连接功能,连接网络,并实现远程控制板卡LED和读取按键信息

任务三:

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

任务四:

  • 若您针对这个板卡有更好的创意,可自命题完成(难度不能低于以上任务)
这里完成的主要是任务三,项目框图如图3所示。硬件部分使用了nRF7002-DK的NFC模块;软件部分通过nRF Connect SDK的开发框架编辑器使用VSCODE和NRF的插件进行开发,程序的主要流程是模拟NFC卡片向手机发送URL消息(IOS系统只需要发送URL消息,安卓系统需要发送要打开的app的包名和URL消息),可以通过串口助手向开发板发送要打开的app名称,开发板根据app名称(默认是打开网易云)使用NFC模块向手机发送URL消息。
项目框图如图3所示。
FqiiyJTdEXCsXnkGZWPrcCsv7h41
 
 
 
图3.项目框图

四、软件编写

4.1NFC以及URL打开app的原理

NFC(Near Field Communication)是一种短距离、高频率(13.56 MHz)的无线通信技术,用于在设备之间进行近距离数据交换。它基于高频无线电波传输数据,并支持双向通信。

NFC 基于 RFID(Radio Frequency Identification)技术,并结合了智能卡技术。它通过在设备之间建立电磁场来传输数据,通常工作距离在几厘米内。

NFC 主要有三种工作模式:

  1. 读写器/写入器模式(Reader/Writer Mode):设备(如智能手机)作为读写器或写入器,可以与被动标签(如 NFC 标签或智能卡)进行通信,读取或写入数据。

  2. 卡模拟模式(Card Emulation Mode):设备可以模拟一张智能卡,使其能够与读写器进行通信。这种模式常用于移动支付或门禁卡等应用。

  3. 点对点模式(Peer-to-Peer Mode):两个 NFC 设备可以直接进行通信,实现数据交换。这种模式常用于文件传输、无线支付等应用。

NFC 使用可感测的距离非常近,这有助于确保通信安全性。它可以支持多种标准数据格式,如 NDEF(NFC Data Exchange Format),这使得 NFC 设备可以与各种标签、卡和其他 NFC 设备进行兼容交互。

NFC 在很多应用领域都有广泛的应用,如移动支付、门禁系统、电子票务、智能标签等。由于其易用性、便利性和安全性,NFC 技术正在成为越来越普遍和受欢迎的无线通信技术。

本项目主要使用的NFC的卡模拟功能,开发板通过卡模拟功能向手机的NFC模块发送URL消息。

URL Scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。

URL Scheme应用场景:
客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:

1.服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
2.H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
3.APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
4.APP根据URL跳转到另外一个APP指定页面

这本项目使用的发现和分享 Siri 捷径、快捷指令 | 捷径社区 (sharecuts.cn)提供的一些URL如图4所示。本项目网易云使用的URL是orpheus://song/SONG_ID,这里的SONG_ID可以通过手机分享歌曲的链接中获取到,

本项目只添加了3个app的URL链接(网易云音乐,抖音,B站),后期可以根据需求进行添加。

Fh7ftLlZO1w_w75IriqhLNsWMVIi   

图4.打开网易云音乐的URL

 

4.2程序部分

      程序部分使用了nRF7002-DK的NFC模块,和LED模块,串口模块程序流程图如图5所示。主程序首先进行LED,NFC模块,串口模块初始化,通过串口循环读取用户要打开的app名称,之后对URL消息进行编码,加载到NFC模块,之后启动NFC卡模拟程序循环发送URL信息与,最后通过回调函数nfc_callback()对通信的成功或失败进行处理,每一段代码所实现的功能在注释中有详细说明。

 

 

 

FnVMZ8wqyScexOQSacAPCVZbq1eM

 

图5.程序流程图

LED,串口,NFC模块初始化程序下所示

///UART模块
/* change this to any other UART peripheral if desired */
#define UART_DEVICE_NODE DT_CHOSEN(zephyr_shell_uart)

#define MSG_SIZE 32

/* queue to store up to 10 messages (aligned to 4-byte boundary) */
K_MSGQ_DEFINE(uart_msgq, MSG_SIZE, 10, 4);

static const struct device *const uart_dev = DEVICE_DT_GET(UART_DEVICE_NODE);

/* receive buffer used in UART ISR callback */
static char rx_buf[MSG_SIZE];
static int rx_buf_pos;
/*
 * Read characters from UART until line end is detected. Afterwards push the
 * data to the message queue.
 */
void serial_cb(const struct device *dev, void *user_data)
{
	uint8_t c;

	if (!uart_irq_update(uart_dev)) {
		return;
	}

	if (!uart_irq_rx_ready(uart_dev)) {
		return;
	}

	/* read until FIFO empty */
	while (uart_fifo_read(uart_dev, &c, 1) == 1) {
		if ((c == '\n' || c == '\r') && rx_buf_pos > 0) {
			/* terminate string */
			rx_buf[rx_buf_pos] = '\0';

			/* if queue is full, message is silently dropped */
			k_msgq_put(&uart_msgq, &rx_buf, K_NO_WAIT);

			/* reset the buffer (it was copied to the msgq) */
			rx_buf_pos = 0;
		} else if (rx_buf_pos < (sizeof(rx_buf) - 1)) {
			rx_buf[rx_buf_pos++] = c;
		}
		/* else: characters beyond buffer size are dropped */
	}
}

/*
 * Print a null-terminated string character by character to the UART interface
 */
void print_uart(char *buf)
{
	int msg_len = strlen(buf);

	for (int i = 0; i < msg_len; i++) {
		uart_poll_out(uart_dev, buf[i]);
	}
}

///NFC模块
#define NDEF_MSG_BUF_SIZE	256//最大消息长度
#define NFC_FIELD_LED		DK_LED1//LED模块的引脚
//打开安卓app用到的app包名
static const uint8_t android_pkg_name[] = {
	't', 'v', '.', 'd', 'a', 'n', 'm', 'a','k','u','b','i','l','i'};
//tv.danmaku.bili

//打开苹果手机app用到的URL这里是网易云音乐app的URL 191171是歌曲的id
static const uint8_t universal_link[] = {
	'o','r','p','h','e','u','s',':','/','/','s','o','n','g','/','1','9','1','1','7','1'
	};
static const uint8_t universal_link_1[] = {
	'w','e','i','x','i','n',':','/','/'
	//weixin://
	//bilibili://
	};
static const uint8_t universal_link_2[] = {
	'b','i','l','i','b','i','l','i',':','/','/'
	//weixin://
	//bilibili://
	};
/** .. include_endpoint_pkg_def_launchapp_rst */

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

//nfc的回调函数,成功发送消息到手机后会执行,led闪烁
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;
	}
}

串口循环读取用户输入的app名称以及NFC发送相应的URL信息下如下

/* 循环读取用户输入的打开app的信息,NFC模块循环发送相应URL消息*/
	print_uart("Please enter the app you want to open\r\n");
	while(1)
	{	
		
		if(k_msgq_get(&uart_msgq, &tx_buf, K_NO_WAIT) == 0)
		{
				print_uart("Echo: ");
				print_uart("\r\n");
			if((strcmp(tx_buf,"\nweixin")==0)||(strcmp(tx_buf,"weixin")==0))
			{
				//while(1)
				 print_uart(tx_buf);
				 nfc_launchapp_msg_encode(android_pkg_name,
				       sizeof(android_pkg_name),
				       universal_link_1,
				       sizeof(universal_link_1),
				       ndef_msg_buf,
				       &len);
			}
			else if((strcmp(tx_buf,"\nwangyiyun")==0)||(strcmp(tx_buf,"wangyiyun")==0))
			{
					print_uart(tx_buf);
				     nfc_launchapp_msg_encode(android_pkg_name,
				       sizeof(android_pkg_name),
				       universal_link,
				       sizeof(universal_link),
				       ndef_msg_buf,
				       &len);

			}
			else if((strcmp(tx_buf,"\nbilibili")==0)||(strcmp(tx_buf,"bilibili")==0))
			{
					print_uart(tx_buf);
				     nfc_launchapp_msg_encode(android_pkg_name,
				       sizeof(android_pkg_name),
				       universal_link_2,
				       sizeof(universal_link_2),
				       ndef_msg_buf,
				       &len);

			}
			print_uart("\r\n");
		}
		else
		{
// NFC发送URL消息
			nfc_t2t_emulation_start();

		}


	}

五.结果与总结

5.1结果

板子连接上电脑后,打开vscode软件,把程序下载到nRF7002-DK中,把手机靠近开发板天线手机会收到消息,收到的信息如图6所示,打开通知,会跳到网易云音乐播放指定的歌曲,这里播放的是无赖如图7所示,通过串口助手输入bilibiliNFC会发送打开b站的URL,输入douyin会NFC会发送打开抖音的URL,串口输入如图8,详细演示在视频里。

 

 

 

FuYv9Wv41VcyVGZA0DWl0pLyEeNO

图6.收到的NFC通知

FgO5Ti-Wipn0HluiJYsNwx_XPYHQ

图7.网易云播放指定歌曲

Fkiad0saBJbZJZYrZwhGAqL6THN_

图8.串口切换发送的URL

 

 

 

 

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