#打卡不停更#【FFH】OpenHarmony设备开发(九)-NFC 原创

X丶昕雪
发布于 2022-10-23 16:43
浏览
2收藏

前言

本文主要以小熊派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中提供了两个写入接口
  1. bool storeText(RecordPosEnu position, uint8_t *text)

    写入文本类型数据

    position:描述此数据为第几个record,只有单个数据的时候可以填为0

    text:文本数据

  2. bool storeUrihttp(RecordPosEnu position, uint8_t *http)

    写入URI类型数据

    position:描述此数据为第几个record,只有单个数据的时候可以填为0

    http:网站地址

  • NT3H提供了常用的API接口
  1. bool NT3HWriteUserData(uint8_t page, const uint8_t *data);

    向NFC存储地址写入data数据,page表示内存页数

  2. 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!”

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
2
收藏 2
回复
举报
回复
    相关推荐