一、项目描述
(1)板卡介绍
本项目使用的开发板为NORDIC公司的nRF7002-DK,如下图所示。
nRF7002-DK是用于nRF7002 Wi-Fi 6协同IC的开发套件,该开发套件采用nRF5340多协议片上系统 (SoC) 作为nRF7002的主处理器,在单一的电路板上包含了开发工作所需的一切,可让开发人员轻松开启基于nRF7002 的物联网项目。该 DK 包括 Arduino 连接器、两个可编程按钮、一个 Wi-Fi 双频段天线和一个低功耗蓝牙天线,以及电流测量引脚。
这款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中提供集成和支持。
(2)开发环境
图1.nRF Connect For Desktop
图2.nRF Connect for VS Code
(3)项目功能
本次项目实现的功能为活动指定完成的任务三:使用板卡的NFC功能,模拟出一个自定义功能的卡片,使用手机靠近并能读取卡片信息。
近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备(例如移动电话)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。
近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备(例如移动电话)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。
近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备(例如移动电话)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。
NFC功能通过板卡的主处理器nRF5340配合一片柔性NFC天线实现。通过板载的按钮,我们可以在板卡开机时切换功能。板卡可以实现模拟一个NFC标签,实现发送文本或是跳转到程序指定的APP的功能。
二、软件流程
软件流程如下图所示:
图3.软件流程
主要代码片段及说明:
int main(void)
{
int err;
int val = 0;
size_t len = sizeof(ndef_msg_buf);
/* Configure LED-pins as outputs */
button_gpio_init();
val = gpio_pin_get_dt(&button);
err = dk_leds_init();
/* Set up NFC */
err = nfc_t2t_setup(nfc_callback, NULL);
/* Encode launch app data */
if(val == 0)
{
err = nfc_launchapp_msg_encode(android_pkg_name,
sizeof(android_pkg_name),
universal_link,
sizeof(universal_link),
ndef_msg_buf,
&len);
/* Set created message as the NFC payload */
err = nfc_t2t_payload_set(ndef_msg_buf, len);
}
else if(val == 1)
{
/* Set created message as the NFC payload */
nfc_t2t_payload_set(en_payload, 21);
}
/* Start sensing NFC field */
err = nfc_t2t_emulation_start();
}
button_gpio_init():按键gpio初始化
gpio_pin_get_dt():读取按键数据,当按键弹起时,对应launch_app功能,当按键按下时,对应nfc文本标签功能
nfc_t2t_setup(nfc_callback, NULL):注册nfc中断服务,当后续检测到nfc设备靠近时,将触发中断并跳转至中断服务函数,将已编码的nfc数据包传输给接收端,NULL表示回调执行时使用的内存区域指针无(NULL)
nfc中断回调函数如下,当检测到NFC设备靠近时,LED1亮起,NFC设备移开后LED1熄灭
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_launchapp_msg_encode():将字符串android_pkg_name即安卓软件对应的pkg信息编码成可用于访问app的数据包
/** .. include_startingpoint_pkg_def_launchapp_rst */
/* Package: org.ppsspp.ppsspp */
static const uint8_t android_pkg_name[] = {
'o', 'r', 'g', '.', 'p', 'p', 's', 's', 'p', 'p', '.', 'p', 'p', 's', 's', 'p', 'p' };
对应手机中的APP为PPSSPP(PSP模拟器)
APP的pkg可使用adb工具进行查询
使用命令台工具,跳转到adb工具的根目录下
将已经开启开发者模式并打开调试功能的安卓设备连接电脑
输入adb devices指令查看已连接设备
输入adb shell pm list packages即可显示手机中所有APP的pkg信息,找到对应app的pkg即可
图4.使用adb获取pkg信息
nfc_t2t_payload_set():该函数用于注册接收到 READ 请求时要发送的有效载荷
注:nfc_t2t_payload_set(en_payload, 21)
此处en_payload对应NFC标签发送文本的数据包
(由于移植record_text例程时总是因未知原因报错,故直接在record_text例程中使用debug调出已经encode的数据包并预先导入)
打开record_text例程,在en_payload中写入目标字符串(如下图“Alex_Zhuang”)
将开发板连接至计算机,运行修改过的例程,并在主程序中welcome_msg_encode处打上断点
运行至断点处可检测到变量len的值与ndef_msg_buff的内容,即为目标发送文本编码后的长度与对应内容,复制即可
图5.在record_text例程中写入目标文本
(注:数据包的len必须匹配,否则无法正确识别为文本标签)
/* Text message in English with its language code. */
static const uint8_t en_payload[NDEF_MSG_BUF_SIZE] = {
'\301','\001','\000','\000','\000','\016','T','\002','e','n','A', 'l', 'e', 'x', '_', 'Z', 'h', 'u', 'a', 'n', 'g'
};
static const uint8_t en_code[] = {'e', 'n'};
图6.debug抓取已经编码的数据包
nfc_t2t_emulation_start():激活NFC前端
三、功能展示
(APP跳转功能放在视频中展示,此处仅展示文本标签功能)
图7.NFC文本标签
四、心得体会
总之本次项目总体难度不大以至于最大的难点其实是开发环境的配置。SDK三番五次安装失败,尝试各种方法无果最后使用大佬打包好的包非常轻松地解决了问题。所以总之遇到问题就要多和hxd们交流。同时也要感谢前人和大佬们的热心援助。
同时这块nRF7002-DK还有很多很强大的功能,也值得活动结束之后再好好琢磨琢磨。