#打卡不停更#【FFH】OpenHarmony设备开发(九)-NFC 原创
前言
本文主要以小熊派Nano上面使用的NT3H1201为例,介绍个人对NFC的一些理解.
NT3H12021 NFC芯片主要特点:
-
工作频率:13.56MHz;
-
用户读写区:1904 bytes;
-
SRAM:64 bytes;
-
NT3H1201 NFC标签可直接作为标准IIC 设备使用;
NDEF协议
ndef 全称 nfc data exchange format,是轻量级的紧凑的二进制格式,可带有URL、vCard和NFC定义的各种数据类型。
NDEF可以记录多个数据(NFC record),而数据(NFC record)里面又具体地分为了数据头(NFC record header)和数据信息(NFC record payload)
数据头
数据头的具体定义如下:
Bit 7 6 5 4 3 2 1 0
------ ------ ------ ------ ------ ------ ------ ------
[ MB ] [ ME ] [ CF ] [ SR ] [ IL ] [ TNF ]
[ TYPE LENGTH ]
[ PAYLOAD LENGTH *n ]
[ ID LENGTH ]
[ TYPE ]
[ ID ]
第一字节:
第0位:MB(消息开始)判断是否为NDEF信息的开始
第1位:ME(消息结束)判断是否为NDEF信息的结束
第2位:CF(块标志)是否为分块消息
第3位:SR(短记录位)如果Payload Length只需要1字节的长度,则SR置1
第4位:IL(ID长度字段)表示了ID是否存在,若置0,ID和ID长度都不存在
第5,6,7位:TNF(消息类型)描述该消息的类型,指引着用户需要如何处理消息,常用的便是nfc forum well-Known type:0x01
第二字节:
type length指的是type的长度,而type表示了存储的数据类型,当TNF设置为0x01时,type length可以设置为0x01,而type可以设置为以下值:
“U”:存储URI数据
“T”:存储文本数据
“Sig”:存储数字签名数据
“Sp”:存储与该海报相关的一些资讯信息,如图片、相关介绍等,
“Gc”:用于传递控制信息
第三字节:
PAYLOAD LENGTH指的是paylod数据信息长度,当SR位置为1时,该部分只有一字节,否则占用多字节
第四字节:
ID length描述了ID的长度,当type设置为URI时(即数据信息是URI类型),才会使用到ID.并且IL位需要置为1.
ID是一个 URI 引用的标识符,URI 引用可以是相对的,也可以是绝对的.NDEF 使用 URIs[RFC 3986]作为某些标识符.
数据信息
payload:存储着需要被用户使用的数据信息,里面包含了数据信息补充说明+数据信息,例如文本类型的Payload结构为:
语言码长度+语言码类型+Text
API接口
对于小熊派nano提供NFC库中的API接口:
- 在nfc.h中提供了两个写入接口
-
bool storeText(RecordPosEnu position, uint8_t *text)
写入文本类型数据
position:描述此数据为第几个record,只有单个数据的时候可以填为0
text:文本数据
-
bool storeUrihttp(RecordPosEnu position, uint8_t *http)
写入URI类型数据
position:描述此数据为第几个record,只有单个数据的时候可以填为0
http:网站地址
- NT3H提供了常用的API接口
-
bool NT3HWriteUserData(uint8_t page, const uint8_t *data);
向NFC存储地址写入data数据,page表示内存页数
-
bool NT3HReadHeaderNfc(uint8_t *endRecordsPtr, uint8_t *ndefHeader)
查看第一页,查询所有存储记录的总大小. endRecordsPtr返回不包括NDEF_END_BYTE的总大小的值,ndefHeader保存第一条记录的NDEF Header
实例
对于NT3H12021 NFC芯片,I2C设备地址为0x55,起始存放地址0x00
当我们想要向里面写入一个hello,world!的时候,便可以向该地址0x00存入以下data数据:
D1 01 0F 54 02 65 6E 68 65 6C 6C 6F 2C 77 6F 72 6C 64 21
我们接下来对这一串代码进行分析:
粗略分析,将数据头和数据信息区分开来:D1 01 0F 54 || 02 65 6E 68 65 6C 6C 6F 2C 77 6F 72 6C 64 21
第一字节:D1=1101 0001
MB和ME都置1,表示一整个NDEF消息里面只有该一个record
CF置0,表示没有分块
SR置1,表示Payload Length只有1字节长度
IL置0,因为此次为文本类型,不需要用上ID以及ID Length
TNF为001,表示使用nfc forum well-Known type
第二字节:01
Type Length的长度为1字节
第三字节:0F
Payload Length,表示数据信息payload的长度为15字节
第四字节:54
Type,0x54是ASCII码中的"T",即表示了该消息是文本记录类型
数据信息:
02
:语言码长度为2字节
65 6E
:=“en”,表示使用编码为US-ASCII码
68 65 6C 6C 6F 2C 77 6F 72 6C 64 21
=“hello,world!”