HarmonyOS学习路之开发篇—网络与连接(NFC开发 一)

简介: NFC(Near Field Communication,近距离无线通信技术) 是一种非接触式识别和互联技术,让移动设备、消费类电子产品、PC和智能设备之间可以进行近距离无线通信

NFC开发概述

NFC(Near Field Communication,近距离无线通信技术) 是一种非接触式识别和互联技术,让移动设备、消费类电子产品、PC和智能设备之间可以进行近距离无线通信。


HarmonyOS的NFC提供的功能有:


NFC基础查询:在进行NFC功能开发之前,开发者应该先确认设备是否支持NFC功能、NFC是否打开等基本信息。

访问安全单元(Secure Element,简称为SE):SE可用于保存重要信息,应用可以访问指定SE,并发送数据到SE上。

卡模拟:设备可以模拟卡片,替代卡片完成对应操作,如模拟门禁卡、公交卡等。

NFC消息通知:通过这个模块,开发者可以获取NFC开关状态改变的消息以及NFC的场强消息。

NFC基础查询

要进行NFC功能开发,需要设备支持NFC功能。


开发者可以通过NfcController类的方法isNfcAvailable()来确认设备是否支持NFC功能。如果设备支持NFC功能,可通过isNfcOpen()来查询NFC的开关状态。示例代码如下:

// 查询本机是否支持NFC
if (context != null) {
    NfcController nfcController = NfcController.getInstance(context);
} else {
    return;
}
boolean isAvailable = nfcController.isNfcAvailable();
if (isAvailable) {
    // 调用查询NFC是否打开接口,返回值为NFC是否是打开的状态
    boolean isOpen = nfcController.isNfcOpen();
}

访问安全单元

场景介绍

安全单元(Secure Element,简称为SE)可用于保存重要信息,应用或者其他模块可以通过接口完成以下功能:


获取安全单元的个数和名称。

判断安全单元是否在位。

在指定安全单元上打开基础通道。

在指定安全单元上打开逻辑通道。

发送APDU(Application Protocol Data Unit)数据到安全单元上。

接口说明

表1 NFC访问安全单元功能的的主要接口

image.png

image.png

开发步骤

1.调用SEService类的构造函数,创建一个安全单元服务的实例,用于访问安全单元。

2.调用isConnected()接口,查询安全单元服务的连接状态。

3.调用getReaders()接口,获取本机的全部安全单元。

4.调用Reader类的openSession()接口打开Session,返回一个打开的Session实例。

5.调用Session类的openBasicChannel(Aid aid)接口打开基础通道,或者调openLogicalChannel(Aid aid)接口打开逻辑通道,返回一个打开通道Channel实例。

6.调用Channel类的transmit(byte[] command),发送APDU到安全单元。

7.调用Channel类的closeChannel()接口关闭通道。

8.调用Session类的closeSessionChannels()接口关闭Session的所有通道。

9.调用Reader类的closeSessions()接口关闭安全单元的所有Session。

10.调用SEService类的shutdown()接口关闭安全单元服务。

private static final String ESE = "eSE";
private class AppServiceConnectedCallback implements SEService.OnCallback {
    @Override
    public void serviceConnected() {
        // 应用自实现
    }
}
// 创建安全单元服务实例
SEService sEService = new SEService(context, new AppServiceConnectedCallback());
// 查询安全单元服务的连接状态
boolean isConnected = sEService.isConnected();
// 获取本机的全部安全单元,并获取指定的安全单元eSE
Reader[] elements = sEService.getReaders();
Reader eSe = null;
for (int i = 0; i < elements.length; i++) {
    if (ESE.equals(elements[i].getName())) {
        eSe = elements[i];
        break;
    }
}
if (eSe == null) {
    return;
}
// 查询安全单元是否在位
boolean isPresent = eSe.isSecureElementPresent();
// 打开Session
Optional<Session> optionalSession = eSe.openSession();
Session session = optionalSession.orElse(null);
if (session == null) {
    return;
}
// 打开通道
if (eSe != null) {
    byte[] aidValue = new byte[]{(byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05};
    // 创建Aid实例
    Aid aid = new Aid(aidValue, 0, aidValue.length); 
    // 打开基础通道
    Optional<Channel> optionalChannel = session.openBasicChannel(aid);
    Channel basicChannel = optionalChannel.orElse(null);
    // 打开逻辑通道
    optionalChannel = session.openLogicalChannel(aid);
    Channel logicalChannel = optionalChannel.orElse(null);
    // 发送指令给安全单元,返回值为安全单元对指令的响应
    byte[] resp = logicalChannel.transmit(new byte[]{(byte)0x00, (byte)0xa4, (byte)0x00, (byte)0x00, (byte)0x02, (byte)0x00, (byte)0x00});
    // 关闭通道资源
    if (optionalChannel.isPresent()) {
        basicChannel.closeChannel();
    }
    if (optionalChannel .isPresent()) {
        logicalChannel.closeChannel();
    }
// 关闭Session资源
session.close();
// 关闭安全单元资源
eSe.closeSessions();
// 关闭安全单元服务资源
sEService.shutdown();
相关文章
|
10天前
|
监控 网络协议 Linux
网络学习
网络学习
126 67
|
10天前
|
网络协议 安全 网络安全
网络基础知识学习
【9月更文挑战第1天】
35 0
|
15天前
|
前端开发 算法 网络协议
如何学习计算机基础知识,打好前端和网络安全的基础
如何学习计算机基础知识,打好前端和网络安全的基础
29 4
|
14天前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
49 2
|
13天前
|
小程序 数据安全/隐私保护
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
在 `src/http` 目录下创建 `request.ts` 文件,并配置 Taro 的网络请求方法 `Taro.request`,支持多种 HTTP 方法并处理数据加密。
Taro@3.x+Vue@3.x+TS开发微信小程序,网络请求封装
|
15天前
|
JavaScript 前端开发 小程序
基于js开发快速学习鸿蒙基础
【8月更文挑战第26天】
27 1
|
22天前
|
数据采集 存储 前端开发
豆瓣评分9.0!Python3网络爬虫开发实战,堪称教学典范!
今天我们所处的时代是信息化时代,是数据驱动的人工智能时代。在人工智能、物联网时代,万物互联和物理世界的全面数字化使得人工智能可以基于这些数据产生优质的决策,从而对人类的生产生活产生巨大价值。 在这个以数据驱动为特征的时代,数据是最基础的。数据既可以通过研发产品获得,也可以通过爬虫采集公开数据获得,因此爬虫技术在这个快速发展的时代就显得尤为重要,高端爬虫人才的收人也在逐年提高。
|
10天前
|
安全 Linux 网络安全
网络安全学习
【9月更文挑战第1天】
25 0
|
13天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
13天前
|
安全 网络安全 Android开发
探索安卓开发之旅:从新手到专家网络安全与信息安全:防范网络威胁,保护数据安全
【8月更文挑战第29天】在这篇技术性文章中,我们将踏上一段激动人心的旅程,探索安卓开发的世界。无论你是刚开始接触编程的新手,还是希望提升技能的资深开发者,这篇文章都将为你提供宝贵的知识和指导。我们将从基础概念入手,逐步深入到安卓开发的高级主题,包括UI设计、数据存储、网络通信等方面。通过阅读本文,你将获得一个全面的安卓开发知识体系,并学会如何将这些知识应用到实际项目中。让我们一起开启这段探索之旅吧!