当前位置: 首页 > news >正文

【物联网无线通信技术】NFC从理论到实践(FM17XX)

NFC,全称是Near Field Communication,即“近场通信”,也叫“近距离无线通信”。NFC诞生于2004年,是基于RFID非接触式射频识别技术演变而来,由当时的龙头企业NXP(原飞利浦半导体)、诺基亚以及索尼联合发起。NFC采用13.56MHz频段,设计运行于20厘米距离之间,传输速度分为13.25KB/s、26.5KB/s、53KB/s三种。

NFC虽然具有只需要靠近就能快速完成配对和传输全过程的优势,但是所谓成也萧何败也萧何,其短距离才能建立连接,以及低带宽的特点在面对手机与其他电子设备无线连接需求时劣势尽显,再加上跟蓝牙相比,其需要单独的天线(蓝牙可以wifi公用),所以其在刚诞生之际鲜有移动设备搭载此项功能,倒是在门禁等安防系统中有所应用。后来随着移动支付的需求增加,NFC功能又迎来了新的机遇。

本篇文章从NFC的技术诞生背景将起,从最常见的应用入手,由上到下讲述了整个NFC技术从理论到实现的过程,NFC读卡器使用的是复旦微电子的FM17XX系列芯片,NFC卡片为M1。

目录

NFC技术概述

防止冲突机制 

卡片认证

实现原理 

嵌入式软件 

卡片触发

INITVAL VALUE

读卡

写卡 


NFC技术概述

在讲NFC之前,先讲讲它的前辈:RFID,其英文全称是radio-frequency identification,即射频识别技术。RFID系统使用标签(Tag)来识别物体。除了标签,RFID系统还有一个双向无线收发机,被称为读写器(Interrogator/Reader),向标签发送信号,并读取标签的反馈。RFID属于自动识别(AIDC:Automatic Identification and Data Capture)技术中的一种。这个识别过程如下:

  1. 首先,跟物品绑定的数据会预先通过读写器存储在RFID标签中。
  2. 当标签进入读写器扫描天线的范围内时,无源RFID标签的天线将接收到的电磁波能量转化成电能,激活RFID标签中的芯片,并将RFID芯片中的数据发送出来。
  3. 无线电波被读写器的天线接收,读写器将这些无线电波解码为数字信息。

NFC作为RFID技术的后辈,在设计之初旨在智能设备的近场双向通信,但是其诞生之后,应用最为广泛还是门禁的功能。

ISO14443协议是Contactless card standards(非接触式IC卡标准)协议,它定义了以下两个主体:

  • PICC:接近式卡 Proximity Card(PICC) (卡片)。
  • PCD : 接近式耦合设备 Proximity coupling device (PCD)(读卡器)

根据信号发送和接收方式的不同,ISO/IEC14443-3定义了TYPEA、TYPEB两种卡型。  以飞利浦,西门子公司为代表的TYPEA。 以摩托罗拉,意法半导体公司为代表的TYPEB。今天我们讲到的为M1卡,指的是菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,属于TYPEA类型。

读卡机我们文章涉及到的FM17XX系列芯片,可分别支持13.56MHz频率下的typeA、 typeB、15693三种非接触通信协议,支持MIFARE和SH标准的加密算法。

标准不仅定义了射频卡和读写器的物理特性,例如频率和天线设计,还描述了射频卡与读写器之间的初始化和防冲突机制以及数据传输协议和指令集。下图是文章涉及的读卡机与卡片的通信流程。


防止冲突机制 

读卡器正常情况下一个时间点只能对磁场中的一张卡进行读或写操作,但是实际应用中经常有当多张卡片同时进入读写器的射频场,读写器怎么处理呢?读写器需要选出特定的一张卡片进行读或写操作,这就是标签防碰撞。常见的防冲突机制主要有以下几种:

  • 面向比特的防冲突机制,ISO14443A(TYPEA)使用这种防冲突机制,其原理是基于卡片有一个全球唯一的序列号。比如Mifare1卡,每张卡片有一个全球唯一的32位二进制序列号。
  • 面向时隙的防冲突机制,ISO14443B(TYPEB)中使用这种防冲突机制。
  • 位和时隙相结合的防冲突机制,ISO15693中使用这种机制。一方面每张卡片有一个7字节的全球唯一序列号,另一方面读写器在防冲突的过程中也使用时隙叫号的方式,不过这里的号不是卡片随机选择的,而是卡片唯一序列号的一部分。

卡片认证

三重加密算法被用于执行标准认证。在密钥缓冲器中必须存储准确的密钥以便能够进行成功的认证操作。

  1. 通过LoadKeyE2或者LoadKey加载密钥到内部密钥缓冲器。
  2. 启动Authent1指令结束之后,检查错误标志来判断执行结果。
  3. 启动Authent2指令,结束之后,检查错误标志以及Crypto1On标志来判断执行结果。

实现原理 

使用任意型号的MCU(一般需要具有低功耗模式)作为微处理器(下图中的uProcessor),MCU与FM17XX系列芯片采用SPI接口进行通信,天线直接连接FM17XX,具体如下图。


嵌入式软件 

嵌入式软件从下到上主要分为以下三层:

  1. 常用/基本函数,包括卡片UID种类判断,FM17XX初始化,命令传输,向EEPROM以及FIFO读写数据等。
  2. FM17XX卡片操作基本函数,包括HALT,LOADKEY,REQUEST,ANTICOLLISION,SELECT,AUTHENTICATION,READ,WRITE,INCREMENT,DECREMENT,RESTORE,TRANSFER。
  3. 应用功能函数。

下面主要将应用功能的部分函数贴上来供各位深入理解读卡器对卡片的操作功能。


卡片触发

/*************************************
/*名称: HL Active
/*功能: 该函数实现高级 MIFARE 卡激活命今
/*输入: Secnr: 扇区号
/*      Block Adr: 块地址
/*输出:操作状态码
/*     读出数据存于 buffer 中
*************************************/
uchar HL_Active(uchar Block_Adr,uchar Mode)
{uchar temp;Secnr = Block_Adr/4;MIF_Halt();                        //Halttemp = Request(RF_CMD_REQUEST+STD);//Requestif(temp != FM1715_OK){return(FM1715_REQERR);}temp = AntiColl();                //AntiColif(temp != FM1715_OK){return(FM1715_ANTICOLLERR);}temp = Select_Card();             ///Selectif(temp != FM1715_OK){return(FM1715_SELERR);}Load_keyE2_CPY((Secnr%16),Wode);//LoadKeytemp = Authentication(UID, Secnr, Mode);//Authenticationif(temp != FM1715_OK){return(FM1715 AUTHERR)}return FM1715_OK;
}

INITVAL VALUE

/**************************************
/*名称:MIF_Initival
/*功能: 该函数实现 MIFARE 卡初始化值操作
/*输入: buff: 四个字节初始化数值起始地加
/*      Block Adr: 块地址
/*输出: FM1715 NOTAGERR:无卡
/*      FM1715 BYTECOUNTERR: 接收字节错误
/*      FM1715 NOTAUTHERR: 未经权威认证
/*      FM1715 EMPTY:数据溢出错误
/*      FM1715 CRCERR: CRC 校验错
/*      FM1715 PARITYERR: 奇偶校验错
/*      FM1715 WRITEERR: 写卡块数据出错
/*      FM1715 0K: 应答正确
/**************************************
uchar MIF_Initival(uchar idata *buff,uchar Block_Adr)
{uchar idata temp;uchar i;for (i = 0; i < 4: i++){*(buff + 4 + i)=~(*(buff + i));}    for (i = 0;i < 4: i++){*(buff + 8 + i)=*(buff + i);}*(buff + 12) = Block Adr;*(buff + 13) =Block Adr;*(buff + 14) = Block Adr;*(buff + 15) =Block Adr;temp = MIF_Write(buff, Block_Adr);return temp;
}

读卡

/***************************
/*名称: HL Read
/*功能:该函数实现高级读命令
/*输入:Secnr: 扇区号
/*     Block Adr: 块地址
/*输出:操作状态码
/*读出数据存于 buffer 中
/***************************
uchar HL_Read(uchar idata *buff,uchar Block_Adr,uchar Mode)
{uchar temp;temp = HL Active(Block_Adr, Mode);if(temp != FM1715_OK){return temp;}//Readtemp = MIF_READ (buff,Block_Adr);if(temp != FM1715_OK){return temp;}return FM1715_OK
}

写卡 

/*******************************
/*名称: HL Write
/*功能:该函数实现高级写命令
/*输入: buff: 待写入数据的首地址
/*      Secnr: 刷区号
/*      Block Adr: 块地址
/*输出:操作状态码
/*******************************
uchar HL_Write(uchar idata *buff,uchar Block_Adr,uchar Mode)
{uchar temp;temp = HL_Active(Block_Adr, Mode);if(temp != FM1715_OK){return temp;}//Writetemp = MIF_Write(buff, Block_Adr);if(temp != FM1715_OK){return FM1715_WRITEERR;}return FM1715_OK;
}

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

相关文章:

【物联网无线通信技术】NFC从理论到实践(FM17XX)

NFC&#xff0c;全称是Near Field Communication&#xff0c;即“近场通信”&#xff0c;也叫“近距离无线通信”。NFC诞生于2004年&#xff0c;是基于RFID非接触式射频识别技术演变而来&#xff0c;由当时的龙头企业NXP(原飞利浦半导体)、诺基亚以及索尼联合发起。NFC采用13.5…...

Python爬虫猿人学逆向系列——第六题

题目&#xff1a;采集全部5页的彩票数据&#xff0c;计算全部中奖的总金额&#xff08;包含一、二、三等奖&#xff09; 地址&#xff1a;https://match.yuanrenxue.cn/match/6 本题比较简单&#xff0c;只是容易踩坑。话不多说请看分析。 两个参数&#xff0c;一个m一个f&…...

idea使用tomcat

1. 建立javaweb项目 2. /WEB-INF/web.xml项目配置文件 如果javaweb项目 先建立项目&#xff0c;然后在项目上添加框架支持&#xff0c;选择javaee 3. 项目结构 4.执行测试&#xff1a;...

搭建Tomcat HTTP服务:在Windows上实现外网远程访问的详细配置与设置教程

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…...

Java学习笔记——继承(包括this,super的使用总结)

继承&#xff1a; 使用情景&#xff1a;当类与类之间&#xff0c;存在相同&#xff08;共性&#xff09;的内容&#xff0c;并满足子类是父类的一种&#xff0c;就可以考虑使用继承&#xff0c;来优化代码 Java中提供一个关键字extends&#xff0c;用这个关键字&#xff0c;我…...

Android 获取应用sha1和sha256

在 Android 应用开发中&#xff0c;SHA-1&#xff08;Secure Hash Algorithm 1&#xff09;值是一种哈希算法&#xff0c;常用于生成应用的数字签名。这个数字签名用于验证应用的身份&#xff0c;并确保应用在发布到设备上时没有被篡改。 以下是生成 Android 应用的 SHA-1 值的…...

c# 方法参数修饰符(out、ref、in)的区别

在C#中&#xff0c;ref、out和in是三种方法参数修饰符&#xff0c;它们在传递参数的方式和作用上有所不同。 ref修饰符&#xff1a; 传递方式&#xff1a;使用ref修饰符的参数可以是输入输出参数&#xff0c;即在方法调用前后都可以对其进行修改。 作用&#xff1a;通过ref修…...

shell 编写一个带有进度条的程序安装脚本

需求 使用 shell 写一个 软件安装脚本&#xff0c;带有进度条 示例 #!/bin/bash# 模拟软件安装的步骤列表 steps("解压文件" "安装依赖" "配置设置" "复制文件" "")# 计算总步骤数 total_steps${#steps[]}# 安装进度的初…...

服务器数据恢复-AIX PV完整镜像方法以及误删LV的数据恢复方案

AIX中的PV相当于物理磁盘&#xff08;针对于存储来说&#xff0c;PV相当于存储映射过来的卷&#xff1b;针对操作系统来说&#xff0c;PV相当于物理硬盘&#xff09;&#xff0c;若干个PV组成一个VG&#xff0c;AIX可以将容量不同的存储空间组合起来统一分配。AIX把同一个VG的所…...

首席执行官Adam Selipsky解读“亚马逊云科技的技术产品差异化”

迄今为止&#xff0c;亚马逊云科技已经参与了21世纪几乎所有的大型计算变革&#xff0c;亚马逊云科技是一个很传奇的故事&#xff0c;它始于大约20年前的一项实验&#xff0c;当时亚马逊试图出售其过剩的服务器。人们确实对此表示怀疑。为什么在线书店试图销售云服务&#xff1…...

C++ Day3

目录 一、类 【1】类 【2】应用实例 练习&#xff1a; 【3】封装 二、this指针 【1】this指针的格式 【2】必须使用this指针的场合 三、类中的特殊成员函数 【1】构造函数 i&#xff09;功能 ii&#xff09;格式 iii&#xff09;构造函数的调用时机 iv&#xff09;…...

OpenEuler 安装mysql

下载安装包 建议直接使用在openEuler官方编译移植过的mysql-5.7.21系列软件包 参考&#xff1a;操作系统迁移实战之在openEuler上部署MySQL数据库 | 数据库迁移方案 | openEuler社区官网 MySQL 5.7.21 移植指南&#xff08;openEuler 20.03 LTS SP1&#xff09; | 数据库移植…...

[Docker] Windows 下基于WSL2 安装

Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。 1. 开启虚拟化 进入系统BIOS&#xff08;AMD 为 SVM&#xff1b;Intel 为 Intel-vt&#xff09;改为启用(enable) 2. 开启WSL 系统设置->应用->程序和功能->…...

(未完成)【Spring专题】SringAOP底层原理解析——阶段三(AOP)

目录 前言前置知识代理范式SpringAOP的理解Spring动态代理的实现 课程内容一、动态代理的实现1.1 Cglib动态代理1.2 JDK动态代理1.3 ProxyFactory&#xff1a;Spring对两种代理的封装 二、AOP基础知识AOP基础概念回顾通知Advice的分类Advisor的理解 三、创建代理对象的方式3.1 …...

使用Nodejs创建简单的HTTP服务器,借助内网穿透工具实现公网访问的方法分享

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…...

使用 OpenTelemetry 构建可观测性 03 - 导出

上一个博文中&#xff0c;我提到如何使用 OpenTelemery 的特定语言 API 来收集遥测数据&#xff0c;包含手动和自动的埋点技术&#xff0c;这很重要&#xff01;但是&#xff0c;收集遥测数据只是解决方案的第一步。 你需要把遥测数据路由转发到其他地方&#xff0c;同时添加额…...

Pyqt5打开电脑摄像头进行拍照

目录 1、设计UI界面 2、设计逻辑代码&#xff0c;建立连接显示窗口 3、结果 1、设计UI界面 将ui界面转为py文件后获得的逻辑代码为&#xff1a;&#xff08;文件名为 Camera.py&#xff09; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file …...

Flowable 7.0.0.M2 版本功能

CMMN 支持批量迁移重复支持案例重新激活支持停止内务处理批处理Http 任务支持 HTTP HEAD and OPTIONS for the Http Tasks移除了 Spring Boot 启动器 flowable-spring-boot-starter-basic - 切换为 flowable-spring-boot-starter-process flowable-spring-boot-starter-rest-ap…...

【golang】关于指针的有限操作

传统意义上来说&#xff0c;指针是一个指向某个确切的内存地址的值。这个内存地址可以是任何数据或代码的起始地址。在Go语言中有几种东西可以代表"指针"。其中最贴切传统意义的当属uintptr类型的了。该类型实际上是一个数值类型&#xff0c;也是Go语言内建的数据类型…...

ProGuard + SpringBoot3 + JDK17

1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

LINUX编译vlc

下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总&#xff08;最简化&#xff09;_底部的附件列表中】: ffmpeg - lzip…...