项目总结报告
项目描述
本项目基于nRF7002开发板,旨在展示NFC(Near Field Communication)技术的应用。NFC是一种短距离通信技术,通常用于数据传输、身份验证、支付和智能设备交互。通过两个不同的代码示例,我们实现了两个不同的NFC应用:
1. NFC传递文本消息应用:这个应用允许我们模拟NFC标签,当读写器靠近时,它会传递包含多语言文本消息的NFC NDEF消息。这里演示通过NFC传递中文文本信息。
2. NFC打开相应手机应用应用:这个应用演示了如何创建一个NFC标签,当读取器扫描该标签时,它会尝试打开与包名称关联的手机应用程序。这里演示打开哔哩哔哩手机app。
要实现NFC(Near Field Communication)功能,需要考虑以下关键方面:
-
NFC硬件:
- NFC芯片:这是实现NFC通信的核心组件,通常嵌入在智能手机、标签、卡片等设备中。
- NFC天线:用于发送和接收NFC信号的天线,通常与NFC芯片集成在一起。
-
NFC标准和协议:
- NFC工作在13.56 MHz频率下,支持ISO/IEC 14443和ISO/IEC 18092等标准。
- NFC通信通常涵盖了三种主要模式:读卡器/写卡器模式、卡模式和点对点模式。
-
NFC软件:
- NFC驱动程序:用于与NFC硬件通信的低层驱动程序。
- NFC协议栈:包括NFC数据交换格式(NDEF)解析器、NFC初始化和关闭流程等。
- 应用程序接口:用于实现NFC功能的应用程序接口,使开发者可以访问NFC硬件。
-
安全性:
- NFC通信通常需要考虑安全性,以防止未经授权的访问或数据泄露。这可以通过加密、认证和其他安全措施来实现。
-
应用领域:
- NFC可以用于多种应用,包括移动支付、门禁控制、公共交通票务、智能标签和物联网设备之间的通信等。
NFC的一些关键技术原理:
-
无线通信:NFC使用无线电频率(13.56 MHz)进行短距离通信,通常距离不超过10厘米。NFC设备之间通过近场感应进行通信,而无需物理接触。
-
NDEF格式:NFC数据交换格式(NDEF)是一种标准数据格式,用于在NFC设备之间传输信息。NDEF格式支持文本、URL、业务卡片、电话号码等多种数据类型。
-
载波识别和初始化:NFC设备在通信开始时会发送载波,以便其他设备识别并响应。这一初始化过程涉及设备的激活和通信通道的建立。
-
安全性:NFC通信可以使用加密和认证来确保通信的安全性。这可以包括使用加密算法来保护传输的数据以及通过认证确保通信双方的合法性。
-
模式切换:NFC设备可以在不同的模式之间切换,包括读卡器/写卡器模式、卡模式和点对点模式,以适应不同的应用需求。
要实现NFC功能,需要合适的硬件、协议栈、软件接口以及应用程序开发知识。此外,安全性也是非常重要的考虑因素,特别是在涉及支付等敏感数据的应用中。
设计思路
在这个项目中,我们首先了解了nRF7002开发板的硬件特性,其中包括NFC芯片、MCU、GPIO引脚等。然后,我们使用Zephyr RTOS框架和NFC库来开发应用程序。设计思路如下:
- 初始化NFC模块:首先,我们初始化NFC模块以准备进行NFC通信。
- 配置LED引脚:我们配置LED引脚,以在NFC场上状态变化时进行可视化反馈。
- 创建NFC消息:对于第一个应用程序,我们创建了一个包含多语言文本消息的NFC NDEF消息。对于第二个应用程序,我们创建了一个包含Android应用包名称和URI的NFC Launch App消息。
- 将消息设置为NFC负载:我们将创建的消息设置为NFC负载,以便读取器可以读取或执行相应操作。
- 开始检测NFC场:最后,我们启动NFC场的检测,以等待读取器的操作。
硬件介绍
nRF7002-DK:
nRF7002-DK——用于nRF7002 Wi-Fi 6双频辅助IC的开发套件。
nRF7002 DK是nRF7002 Wi-Fi 6协同IC的开发评估板,它包含了在单板上开发所需要的所有元器件。开发板采用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专有协议。
软件流程图及代码片段说明
NFC传递文本消息应用
软件流程图
以下是NFC传递文本消息应用的软件流程图:
代码片段及说明
以下是主要代码片段及其说明:
/* 中文文本消息及其语言代码 */
static const uint8_t zh_payload[] = {
0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, 0xE6, 0xB6, 0x89, 0xE8, 0xAF, 0xAD // 这里是 "你好世界" 的UTF-8编码
};
static const uint8_t zh_code[] = {'z', 'h'};
int main(void)
{
uint32_t len = sizeof(ndef_msg_buf);
printk("启动NFC文本记录示例\n");
/* 配置LED引脚为输出 */
if (dk_leds_init() < 0) {
printk("无法初始化LED!\n");
goto fail;
}
/* 设置NFC */
if (nfc_t2t_setup(nfc_callback, NULL) < 0) {
printk("无法设置NFC T2T库!\n");
goto fail;
}
/* 编码欢迎消息 */
if (welcome_msg_encode(ndef_msg_buf, &len) < 0) {
printk("无法编码消息!\n");
goto fail;
}
/* 将创建的消息设置为NFC负载 */
if (nfc_t2t_payload_set(ndef_msg_buf, len) < 0) {
printk("无法设置负载!\n");
goto fail;
}
/* 开始检测NFC场 */
if (nfc_t2t_emulation_start() < 0) {
printk("无法开始模拟!\n");
goto fail;
}
printk("NFC配置完成\n");
return 0;
下面是关于这段代码的详细解释,包括数据传递、文本设置以及程序的执行流程:
1. 包含头文件
代码开始时,包含了一系列头文件,这些头文件包含了所需的库和函数声明。这些头文件提供了与Zephyr RTOS、NFC、LED控制等相关的功能。
2. 定义语言文本和语言代码
接下来,代码定义了四种不同语言的文本消息和相应的语言代码。这些文本消息以UTF-8编码存储在字节数组中,用于后续创建NFC文本记录。其中中文文本“0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87, 0xE6, 0xB6, 0x89, 0xE8, 0xAF, 0xAD”解码后内容为“你好世界”
3. 定义NFC消息缓冲区
代码创建了一个名为 `ndef_msg_buf` 的字节数组,用于存储NFC NDEF消息。这个缓冲区将在后面的步骤中用来编码和设置NFC负载。
4. 处理NFC事件的回调函数
`nfc_callback` 函数是一个回调函数,用于处理NFC事件。当检测到NFC场(`NFC_T2T_EVENT_FIELD_ON`)时,它点亮了一个LED,而当NFC场消失时(`NFC_T2T_EVENT_FIELD_OFF`),则关闭LED。这个函数允许在NFC通信时采取相应的操作。
5. 编码NDEF文本消息
`welcome_msg_encode` 函数负责创建和编码NFC NDEF文本消息。它使用先前定义的文本消息和语言代码来创建NFC文本记录,并将它们添加到NDEF消息中。最后,它将整个NDEF消息编码到 `ndef_msg_buf` 缓冲区中。
6. 主函数
在 `main` 函数中,代码执行以下步骤:
- 初始化LED:首先,它初始化LED以准备后续使用。
- 设置NFC T2T:通过调用 `nfc_t2t_setup` 函数,设置NFC T2T库,为NFC通信做好准备。
- 编码欢迎消息:调用 `welcome_msg_encode` 函数来创建并编码NFC NDEF消息,并将其存储在 `ndef_msg_buf` 缓冲区中。
- 设置NFC负载:使用 `nfc_t2t_payload_set` 函数,将创建的NFC NDEF消息设置为NFC负载。
- 启动NFC模拟:通过调用 `nfc_t2t_emulation_start` 函数,启动NFC模拟,使设备能够模拟NFC标签。
7. 完成或失败处理
如果所有步骤都成功执行,程序将打印 "NFC配置完成" 并返回0表示成功。如果任何步骤出现错误,程序将进行错误处理。例如,它可以尝试重新启动设备(`sys_reboot(SYS_REBOOT_COLD)`)以进行冷启动。
总之,这段代码用于配置并启动一个具有多种语言选项的NFC标签模拟器。它创建了一个包含不同语言的文本记录的NFC消息,并在检测到NFC场时将其设置为NFC负载。这使得设备能够模拟一个NFC标签,当与NFC读写器进行通信时,读取这些不同语言的文本记录。
NFC打开相应手机应用应用
软件流程图
以下是NFC打开相应手机应用应用的软件流程图:
代码片段及说明
以下是主要代码片段及其说明:
/保存包名称,这里是哔哩哔哩app的安卓包名/
static const uint8_t android_pkg_name[] = {
't', 'v', '.', 'd', 'a', 'n', 'm', 'a', 'k', 'u', '.', 'b', 'i', 'l', 'i'
};
/保存URI,这里设置的为哔哩哔哩app的主页/
static const uint8_t universal_link[] = {
'h', 't', 't', 'p', 's', ':', '/', '/', 'w', 'w', 'w', '.', 'b', 'i', 'l', 'i', 'b', 'i', 'l', 'i', '.', 'c', 'o', 'm', '/'
};
int main(void)
{
int err;
size_t len = sizeof(ndef_msg_buf);
printk("启动 NFC 启动应用程序示例\n");
/* 配置 LED 引脚为输出 */
err = dk_leds_init();
if (err) {
printk("无法初始化 LED!\n");
goto fail;
}
/* 设置 NFC */
err = nfc_t2t_setup(nfc_callback, NULL);
if (err) {
printk("无法设置 NFC T2T 库!\n");
goto fail;
}
/* 编码启动应用程序数据 */
err = nfc_launchapp_msg_encode(android_pkg_name,
sizeof(android_pkg_name),
universal_link,
sizeof(universal_link),
ndef_msg_buf,
&len);
if (err) {
printk("无法编码消息!\n");
goto fail;
}
/* 将创建的消息设置为 NFC 负载 */
err = nfc_t2t_payload_set(ndef_msg_buf, len);
if (err) {
printk("无法设置负载!\n");
goto fail;
}
/* 开始感应 NFC 场 */
err = nfc_t2t_emulation_start();
if (err) {
printk("无法启动模拟!\n");
goto fail;
}
printk("NFC 配置完成\n");
return 0;
下面是关于这段代码的详细解释,包括如何打开应用程序、如何查找包名称以及程序的执行流程:
打开应用程序
这段代码的主要目标是模拟一个NFC标签,使其与支持Universal Link的设备进行通信时能够启动指定的Android应用程序。在Android中,Universal Link是一种链接,它可以直接启动应用程序,而不需要经过浏览器。当用户的设备靠近模拟的NFC标签时,设备将读取NFC标签上的信息,包括包名称和Universal Link,然后启动相应的Android应用程序。
查找包名称
要启动指定的Android应用程序,首先需要知道该应用程序的包名称。在代码中,包名称存储在 `android_pkg_name` 数组中,以字节序列的形式表示。这个包名称是目标应用程序的唯一标识符,Android系统使用它来定位并启动应用程序,项目中打开的是‘哔哩哔哩’这个应用,其包名为:’tv.danmaku.bili’,其次可以设置对应的URL,即应用程序中对应的界面,这里设置的是哔哩哔哩app的主页面,也就是说可用通过包名称和URL可以打开指定的app和app内指定界面。
程序的执行流程
以下是程序的执行流程:
1. 包含头文件:代码开始时,包含了所需的头文件,这些头文件提供了与Zephyr RTOS、NFC、LED控制等相关的功能。
2. 定义包名称和Universal Link:代码定义了一个Android应用程序的包名称 `android_pkg_name` 和一个Universal Link `universal_link`。这些数据指定了要启动的Android应用程序以及启动应用程序时要使用的链接。
3. 定义NFC消息缓冲区:代码创建了一个名为 `ndef_msg_buf` 的字节数组,用于存储NFC NDEF消息。这个缓冲区将在后续的步骤中用来编码和设置NFC负载。
4. 处理NFC事件的回调函数:`nfc_callback` 函数是一个回调函数,用于处理NFC事件。当检测到NFC场(`NFC_T2T_EVENT_FIELD_ON`)时,它点亮一个LED,而当NFC场消失时(`NFC_T2T_EVENT_FIELD_OFF`),则关闭LED。这个函数允许在NFC通信时采取相应的操作。
5. 初始化LED和设置NFC:在 `main` 函数中,代码首先初始化LED以准备后续使用,然后设置NFC T2T库以为NFC通信做好准备。
6. 编码启动应用程序数据:通过调用 `nfc_launchapp_msg_encode` 函数,代码编码了NFC NDEF消息,其中包括要启动的Android应用程序的包名称和Universal Link。
7. 设置NFC负载:使用 `nfc_t2t_payload_set` 函数,代码将创建的NFC NDEF消息设置为NFC负载。这样,当设备模拟NFC标签时,它会广播这个NFC负载,包括包名称和Universal Link。
8. 启动NFC模拟:通过调用 `nfc_t2t_emulation_start` 函数,代码启动NFC模拟,使设备能够模拟NFC标签。此时,设备可以被其他支持Universal Link的设备检测到,并启动指定的Android应用程序。
总之,这段代码通过模拟NFC标签,允许其他设备通过读取NFC标签上的信息来启动指定的Android应用程序。所需的信息包括包名称和Universal Link,它们被编码为NFC负载,并在NFC模拟期间广播给其他设备。这使得通过NFC通信实现了应用程序的启动功能。
功能展示及说明
NFC传递文本消息应用
这个应用允许用户模拟NFC标签,当读写器靠近时,它会传递包含多语言文本消息的NFC NDEF消息。在这个示例中,我们创建了包含中文“你好世界”的文本消息。当读取器扫描这个NFC标签时,可以在其上读取到这些文本消息,实现数据传递和交互。
NFC打开相应手机应用应用
这个应用演示了如何创建一个NFC标签,当读取器扫描该标签时,它会尝试打开与包名称关联的手机应用程序哔哩哔哩。在这个示例中,我们编码了一个Launch App消息,其中包含了Android应用包名称和URI。当读取器扫描该标签时,手机会尝试打开相应的应用程序哔哩哔哩,从而实现了一种便捷的应用启动方式。
对本活动的心得体会
活动参加的过程中也遇到了不少的问题。在Nordic的官网是有比较详细的文档的,但是因为纯英文而且对Nordic的产品也不是很熟悉的缘故,读起来还是有点费劲,还好活动官方有相应的直播,通过这个直播简单了解了nrf7002如何跑起来,这个直播课程做的挺不错的,很多细节都讲了,但是!我在开发nrf7002的第一步还是遇到了问题——安装SDK问题,跟着教程安装SDK总是拉取不全,导致无法使用,打开魔法或关闭魔法都不行,甚至全局魔法都不行.......。后来通过群内大佬的讲解,了解到其利用git拉取SDK的路劲很特殊,一般的魔法根本不能满足(我将近拉了有十余遍都没有成功)。正在一筹莫展之际,通过另一位大佬的文章找到了更有效简单的方法,即利用别人已经下载好且上传了百度云盘的SDK文件替换自己的SDK文件,替换好后需要利用Nordic的桌面应用更新一下自己的SDK,如图
至此问题得以解决,再次感谢万能的网友们!
由于这个问题困扰了我很久,如今通过网友的帮助问题得以解决,因此为了帮助其他有同样问题的网友,我特意做了一个视频,用于解决环境的搭建及SDK的安装:
上述提到的含有SDK的百度云盘链接:
前面提到英文文档我读起来很费劲,后面群内大佬分享了一个国内网友写的帖子,写的很详细,很不错,从零入门详细讲解了环境如何配置,开发工具如何使用,以及建立第一个项目工程,链接:
开发你的第一个nRF Connect SDK(NCS)/Zephyr应用程序
以上是我的一些学习资料和学习的过程,活动内容上我选择了NFC的项目,上述也详细介绍了我的项目内容。
总之通过参与nRF7002开发板试用活动,我获得了许多宝贵的经验和见解。总的来说,这个活动为我提供了宝贵的学习经验,我期待未来继续参与类似的硬件开发活动。感谢提供这个机会,希望未来的活动能够越办越好,越办越多!