鸿蒙开发(API 12 Beta6版)【NFC标签读写】 网络篇

简介

近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行,通信距离一般在10厘米距离内。电子设备可以通过NFC通信技术和NFC标签通信,从标签中读取数据,或写入数据到标签。

NFC标签可能会支持一种或多种通信技术,具体技术如下:

  • NfcA (也称为 ISO 14443-3A)
  • NfcB (也称为 ISO 14443-3B)
  • NfcF (也称为 JIS 6319-4)
  • NfcV (也称为 ISO 15693)
  • IsoDep
  • NDEF
  • MifareClassic
  • MifareUltralight

场景介绍

电子设备通过NFC天线位置触碰NFC标签卡片,完成NFC标签卡片的读取或写入。从使用场景上,可以分成NFC标签前台读写,和NFC标签后台读写。

  • NFC标签前台读写

    前台读写是指在触碰NFC标签之前,用户先在电子设备上打开特定的应用程序,用户明确想使用所打开的应用程序和NFC标签进行读写操作。用户打开应用程序在前台,并且进入应用的刷卡页面之后,电子设备触碰NFC标签,只会把读取到的卡片分发给前台应用。

  • NFC标签后台读写

    后台读写是指不打开特定的NFC标签应用程序,电子设备触碰发现NFC标签后,根据NFC标签的技术类型,分发给能够处理的应用程序。如果能匹配到多个应用程序,则弹出应用选择器列举出应用列表给用户手动选择。用户选择指定的应用后,自动跳转到应用程序的NFC标签读写卡页面。

  • 标签读写约束条件

    不管是前台读写,还是后台读写,电子设备能够发现NFC标签的前提条件是设备必须是亮屏和解锁状态。

接口说明

获取不同技术类型标签对象的接口说明如下表,根据不同技术的标签对象来执行NFC标签的读写。

接口名功能描述
getNfcA(tagInfo: TagInfo): NfcATag获取NfcA技术类型的标签对象。
getNfcB(tagInfo: TagInfo): NfcBTag获取NfcB技术类型的标签对象。
getNfcF(tagInfo: TagInfo): NfcFTag获取NfcF技术类型的标签对象。
getNfcV(tagInfo: TagInfo): NfcVTag获取NfcV技术类型的标签对象。
getIsoDep(tagInfo: TagInfo): IsoDepTag获取IsoDep技术类型的标签对象。
getNdef(tagInfo: TagInfo): NdefTag获取NDEF技术类型的标签对象。
getMifareClassic(tagInfo: TagInfo): MifareClassicTag获取MifareClassic技术类型的标签对象。
getMifareUltralight(tagInfo: TagInfo): MifareUltralightTag获取MifareUltralight技术类型的标签对象。

开发步骤

前台读取标签

  1. 在module.json5文件中声明NFC标签读取的权限,以及声明NFC标签特定的action;
  2. import需要的tag模块和其他相关的模块;
  3. 判断设备是否支持NFC能力;
  4. 调用tag模块中前台优先的接口,使能前台应用程序优先处理所发现的NFC标签功能;
  5. 获取特定技术类型的NFC标签对象;
  6. 执行读写接口完成标签数据的读取或写入数据到标签;
  7. 退出应用程序NFC标签页面时,调用tag模块退出前台优先功能。
    "abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ts","description": "$string:EntryAbility_desc","icon": "$media:icon","label": "$string:EntryAbility_label","startWindowIcon": "$media:icon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home",// Add the nfc tag action to filter out for this application."ohos.nfc.tag.action.TAG_FOUND"]}]}],"requestPermissions": [{// Add the permission for nfc tag operations."name": "ohos.permission.NFC_TAG","reason": "$string:app_name",}]
import { tag } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { AbilityConstant, UIAbility, Want, bundleManager } from '@kit.AbilityKit';let nfcTagElementName: bundleManager.ElementName;
let foregroundRegister: boolean;async function readerModeCb(error : BusinessError, tagInfo : tag.TagInfo) {if (!error) {// 获取特定技术类型的NFC标签对象if (tagInfo == null || tagInfo == undefined) {hilog.error(0x0000, 'testTag', 'readerModeCb tagInfo is invalid');return;}if (tagInfo.uid == null || tagInfo.uid == undefined) {hilog.error(0x0000, 'testTag', 'readerModeCb uid is invalid');return;}if (tagInfo.technology == null || tagInfo.technology == undefined || tagInfo.technology.length == 0) {hilog.error(0x0000, 'testTag', 'readerModeCb technology is invalid');return;}// 执行读写接口完成标签数据的读取或写入数据到标签// use the IsoDep technology to access this nfc tag.let isoDep : tag.IsoDepTag | null = null;for (let i = 0; i < tagInfo.technology.length; i++) {if (tagInfo.technology[i] == tag.ISO_DEP) {try {isoDep = tag.getIsoDep(tagInfo);} catch (error) {hilog.error(0x0000, 'testTag', 'readerModeCb getIsoDep error = %{public}s', JSON.stringify(error));return;}}// use other technology to access this nfc tag if neccessary.}if (isoDep == undefined) {hilog.error(0x0000, 'testTag', 'readerModeCb getIsoDep is invalid');return;}// connect to this nfc tag using IsoDep technology.try {isoDep.connect(); } catch (error) {hilog.error(0x0000, 'testTag', 'readerModeCb isoDep.connect() error = %{public}s', JSON.stringify(error));return;}if (!isoDep.isConnected()) {hilog.error(0x0000, 'testTag', 'readerModeCb isoDep.isConnected() false.');return;}// transmit data to the connected tag.let cmdData = [0x01, 0x02, 0x03, 0x04]; // please change the raw data to be correct.try {isoDep.transmit(cmdData).then((response : number[]) => {hilog.info(0x0000, 'testTag', 'readerModeCb isoDep.transmit() response = %{public}s.', JSON.stringify(response));}).catch((err : BusinessError)=> {hilog.error(0x0000, 'testTag', 'readerModeCb isoDep.transmit() err = %{public}s.', JSON.stringify(err));return;});} catch (businessError) {hilog.error(0x0000, 'testTag', 'readerModeCb isoDep.transmit() businessError = %{public}s.', JSON.stringify(businessError));return;}} else {hilog.info(0x0000, 'testTag', 'readerModeCb readerModeCb error %{public}s', JSON.stringify(error));}
}export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');// 判断设备是否支持NFC能力if (!canIUse("SystemCapability.Communication.NFC.Core")) {hilog.error(0x0000, 'testTag', 'nfc unavailable.');return;}nfcTagElementName = {bundleName: want.bundleName ?? '',abilityName: want.abilityName ?? '',moduleName: want.moduleName,}}onForeground() {// Ability has brought to foregroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');if (nfcTagElementName != undefined) {// 调用tag模块中前台优先的接口,使能前台应用程序优先处理所发现的NFC标签功能let techList : number[] = [tag.NFC_A, tag.NFC_B, tag.NFC_F, tag.NFC_V];try {tag.on('readerMode', nfcTagElementName, techList, readerModeCb);foregroundRegister = true;} catch (error) {hilog.error(0x0000, 'testTag', 'on readerMode error = %{public}s', JSON.stringify(error));}}}onBackground() {// Ability has back to backgroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');// 退出应用程序NFC标签页面时,调用tag模块退出前台优先功能if (foregroundRegister) {foregroundRegister = false;try {tag.off('readerMode', nfcTagElementName);} catch (error) {hilog.error(0x0000, 'testTag', 'off readerMode error = %{public}s', JSON.stringify(error));}}}
}

后台读取标签

  1. 在module.json5文件中声明NFC标签读取的权限,声明NFC标签特定的action,以及声明本应用程序的能够处理的NFC标签技术类型;
  2. import需要的tag模块和其他相关的模块;
  3. 获取特定技术类型的NFC标签对象;
  4. 执行读写接口完成标签数据的读取或写入数据到标签。
    "abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ts","description": "$string:EntryAbility_desc","icon": "$media:icon","label": "$string:EntryAbility_label","startWindowIcon": "$media:icon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home",// Add the nfc tag action to filter out for this application."ohos.nfc.tag.action.TAG_FOUND"],"uris": [{"type":"tag-tech/NfcA"},{"type":"tag-tech/IsoDep"}// Add other technologies if neccessary,// such as: NfcB/NfcF/NfcV/Ndef/MifareClassic/MifareUL/NdefFormatable]}]}],"requestPermissions": [{// Add the permission for nfc tag operations."name": "ohos.permission.NFC_TAG","reason": "$string:app_name",}]
import { tag } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');// 获取特定技术类型的NFC标签对象let tagInfo : tag.TagInfo;try {tagInfo = tag.getTagInfo(want);} catch (error) {hilog.error(0x0000, 'testTag', 'getTagInfo error = %{public}s', JSON.stringify(error));return;}if (tagInfo == null || tagInfo == undefined) {hilog.error(0x0000, 'testTag', 'tagInfo is invalid');return;}if (tagInfo.uid == null || tagInfo.uid == undefined) {hilog.error(0x0000, 'testTag', 'uid is invalid');return;}if (tagInfo.technology == null || tagInfo.technology == undefined || tagInfo.technology.length == 0) {hilog.error(0x0000, 'testTag', 'technology is invalid');return;}// 执行读写接口完成标签数据的读取或写入数据到标签// use the IsoDep technology to access this nfc tag.let isoDep : tag.IsoDepTag | null = null;for (let i = 0; i < tagInfo.technology.length; i++) {if (tagInfo.technology[i] == tag.ISO_DEP) {try {isoDep = tag.getIsoDep(tagInfo);} catch (error) {hilog.error(0x0000, 'testTag', 'getIsoDep error = %{public}s', JSON.stringify(error));return;}}// use other technology to access this nfc tag if neccessary.}if (isoDep == undefined) {hilog.error(0x0000, 'testTag', 'getIsoDep is invalid');return;}// connect to this nfc tag using IsoDep technology.try {isoDep.connect(); } catch (error) {hilog.error(0x0000, 'testTag', 'isoDep.connect() error = %{public}s', JSON.stringify(error));return;}if (!isoDep.isConnected()) {hilog.error(0x0000, 'testTag', 'isoDep.isConnected() false.');return;}// transmit data to the connected tag.let cmdData = [0x01, 0x02, 0x03, 0x04]; // please change the raw data to be correct.try {isoDep.transmit(cmdData).then((response : number[]) => {hilog.info(0x0000, 'testTag', 'isoDep.transmit() response = %{public}s.', JSON.stringify(response));}).catch((err : BusinessError)=> {hilog.error(0x0000, 'testTag', 'isoDep.transmit() err = %{public}s.', JSON.stringify(err));return;});} catch (businessError) {hilog.error(0x0000, 'testTag', 'isoDep.transmit() businessError = %{public}s.', JSON.stringify(businessError));return;}}
}

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/420095.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRI…

虚幻引擎VR游戏开发02 | 性能优化设置

常识&#xff1a;VR需要保持至少90 FPS的刷新率&#xff0c;以避免用户体验到延迟或晕眩感。以下是优化性能的一系列设置&#xff08;make sure the frame rate does not drop below a certain threshold&#xff09; In project setting-> &#xff08;以下十个设置都在pr…

强烈推荐!分享5款ai论文生成软件

在当今学术研究和写作领域&#xff0c;AI论文生成工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是五款值得推荐的AI论文生成软件&#xff0c;特别是千笔-AIPassPaper。 ### 千笔-…

C++ —— 关于string类

目录 1. auto和范围for 1.1 auto关键字 1.2 范围for 2. string的三种遍历方式 3. string类的常用接口说明 3.1 成员函数 3.2 Iterators:&#xff08;迭代器&#xff09; 3.2.1正向迭代器和反向迭代器 3.3 Capacity&#xff08;容量&#xff09; 3.4 Modifiers&#x…

智算时空 重塑视界│智汇云舟2024视频孪生产品发布会圆满举行,多个“全球首款”重磅亮相

​秋风送爽&#xff0c;丹桂飘香。9月6日&#xff0c;由北京智汇云舟科技有限公司主办&#xff08;简称&#xff1a;智汇云舟&#xff09;&#xff0c;北京北科软科技有限公司&#xff08;简称&#xff1a;北科软&#xff09;、北京恒升联合科技有限公司&#xff08;简称&#…

Leetcode 236-二叉树的最近公共祖先

同剑指offer 68-II 二叉树的最近公共祖先/lcr 194 题目描述 题目转载自LeetCode 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0…

【Rust】Mdbook插件开发和分享——多图浏览和多语言代码

mdbook-image-slider 受DevExpress文档多图浏览的启发&#xff0c;我开发这个插件&#xff0c;在查看多个图片和图片的描述的时候非常方便 项目地址&#xff1a;https://github.com/VinciYan/mdbook-image-slider.git 特点 鼠标置于图片查看区域时显示切换图片按钮鼠标点击图…

VS Code 文件定位功能

1、取消“当前打开文件”的自动定位功能。 设置 ->搜索 Explorer: Auto Reveal -> 将配置改为 false 2.在vs2017中定位文件 Tools->Option->Projects And Solutions->General, tick “track Active Item in Solution Explorer” 工具-> 选项->项目和…

iOS——GCD再学习

GCD 使用GCD好处&#xff0c;具体如下&#xff1a; GCD 可用于多核的并行运算&#xff1b;GCD 会自动利用更多的 CPU 内核&#xff08;比如双核、四核&#xff09;&#xff1b;GCD 会自动管理线程的生命周期&#xff08;创建线程、调度任务、销毁线程&#xff09;&#xff1b…

华为手机找不到wifi调试?不急,没有wifi调试一样可以进行局域网模式调试

最近小黄在使用uniapp启动无线调试的时候突然发现华为的手机突然找不到wifi调试了&#xff0c;那么我们怎么进行无线调试呢&#xff1f; 其实他只是找不到开关而已&#xff0c;正常使用就行。 1.使用数据线连接手机。 打开cmd命令行执行&#xff1a;adb tcpip 5555 2.再执行ad…

物联网之Arduino开发环境的下载与安装、ESP32开发环境的下载与安装、常见环境配置问题的解决办法、COM端口不可用的解决方法

MENU 前言下载和安装Arduino安装ESP32开发环境常见问题JSON下载失败和下载速度慢配置解释器没有发现端口检测到端口&#xff0c;但是有警告图标&#xff0c;端口无法使用 前言 想玩开发板必须得写代码&#xff0c;要不然Arduino不知道怎么运行&#xff0c;Arduino的开发语言是C…

❤《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案

《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案 文章目录 《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案1、问题一&#xff1a;原生开发中 request请求中返回 的数据无法 使用this传递给 data{}中怎么办&#xff1f;2、刚登录后如何将token信息保存&#xf…

用于客户支持的 GenAI:探索 Elastic Support Assistant

作者&#xff1a;Chris Blaisure, Cory Mangini 我们很高兴地宣布推出 Elastic 的支持助手。本博客将带你了解我们最新的生成式 AI 工具以及它可以帮助你使用 Elastic 技术的一些常见场景。 Elastic 支持助手现已在 Support Hub 上可用 今天&#xff0c;我们宣布 Elastic 支持…

每日一题,力扣leetcode Hot100之206反转链表

原来的链表是1-2-3-4-5-null 反转后是5-4-3-2-1-null 只需要循环遍历&#xff0c;并且借一个temp便可以完成反转 class Solution:def reverseList(self, head: ListNode) -> ListNode:cur, pre head, Nonewhile cur:tmp cur.next # 暂存后继节点 cur.nextcur.next pre…

【软件测试】盒木进销存管理系统 需求说明书

目录 1 引言 2 项目概述 3 平台、角色和权限 3.1 Web端 4 Web端需求 4.1 登录/注册页面 4.1.1 业务描述 4.1.2 需求描述 4.1.3 行为人 4.1.4 UI页面 4.1.5 业务规则 4.2 首页 4.2.1 业务描述 4.2.2 需求描述 4.2.3 行为人 4.2.4 UI界面 4.2.5 业务规则 4.3报…

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶…

第144天:内网安全-Linux权限维持OpenSSHPAM后门SSH软链接公私钥登录

目录 案例一&#xff1a; 权限维持-Linux-替换版本-OpenSSH 后门 案例二&#xff1a; 权限维持-Linux-更改验证-SSH-PAM 后门 案例三&#xff1a; 权限维持-Linux-登录方式-软链接&公私钥&新帐号 ssh软链接 公私钥 新帐号 案例一&#xff1a; 权限维持-Linux-替换…

记录|C#的软件图标更换

目录 前言一、软件界面的图标二、软件外的图标更新时间 前言 参考文章&#xff1a; 自己开发出的软件&#xff0c;肯定要更换图标&#xff0c;无论是软件打开前还是软件上的。如下图&#xff1a; 一、软件界面的图标 直接在Form的属性中进行icon的更换【如下图&#xff1a;】…

android kotlin 基础复习 继承 inherit

1、新建文件kt 2、代码&#xff1a; /**用户基类**/ open class Person1(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")println("name:${name},age:${age}")} }/**子…

线程的状态(java)

“苦&#xff1f; 何止是苦~~~~~” 本期内容来分享一下线程状态相关的知识哦&#xff01;&#xff01;&#xff01; 对于进程来说&#xff0c;进程是有两种状态的。 一种是就绪状态&#xff1a;正在CPU上执行&#xff0c;或者随时可以去CPU上执行的。 另一种是阻塞状态&…