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

这篇具有很好参考价值的文章主要介绍了HarmonyOS学习路之开发篇—网络与连接(NFC开发 一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)可用于保存重要信息,应用或者其他模块可以通过接口完成以下功能:

  1. 获取安全单元的个数和名称。
  2. 判断安全单元是否在位。
  3. 在指定安全单元上打开基础通道。
  4. 在指定安全单元上打开逻辑通道。
  5. 发送APDU(Application Protocol Data Unit)数据到安全单元上。

接口说明

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

类名

接口名

功能描述

SEService

SEService()

创建一个安全单元服务的实例。

isConnected()

查询安全单元服务是否已连接。

shutdown()

关闭安全单元服务。

getReaders()

获取全部安全单元。

getVersion()

获得安全单元服务的版本。

OnCallback

用于回调的内部类,用于定义回调接口。在服务连接成功后,回调该接口通知应用。

Reader

getName()

获取安全单元的名称。

isSecureElementPresent()

检查安全单元是否在位。

openSession()

打开当前安全单元上的session。

closeSession()

关闭当前安全单元上的所有session。

Session

openBasicChannel(Aid aid)

打开基础通道。

openLogicalChannel(Aid aid)

创建逻辑通道。

getATR()

获得重设安全单元指令的响应。

closeSessionChannels()

关闭当前session的所有通道。

Channel

isClosed()

判断通道是否关闭。

isBasicChannel()

判断是否是基础通道。

transmit(byte[] command)

发送指令到安全单元。

getSelectResponse()

获得应用程序选择指令的响应。

closeChannel()

关闭通道。

Aid

Aid(byte[] aid, int offset, int length)

构造一个AID类的实例。

isAidValid()

查询AID是否有效。

getAidBytes()

获取AID的字节数组形式的值。文章来源地址https://www.toymoban.com/news/detail-517501.html

开发步骤

  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();

到了这里,关于HarmonyOS学习路之开发篇—网络与连接(NFC开发 一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS学习路之开发篇—设备管理(位置开发)

    移动终端设备已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动,都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时,系统的位置能力可以提供实时准确的位置数据。对于开发

    2024年02月16日
    浏览(47)
  • HarmonyOS学习路之开发篇—AI功能开发(实体识别)

    实体识别能够从自然语言中提取出具有特定意义的实体,并在此基础上完成搜索等一系列相关操作及功能。 实体识别覆盖范围大,能够满足日常开发中对实体识别的需求,让应用体验更好。识别准确率高,能够准确地提取到实体信息,对应用基于信息的后续服务形成关键影响

    2024年02月11日
    浏览(108)
  • HarmonyOS学习路之开发篇—AI功能开发(语音播报)

    语音播报(Text to Speech,下文简称TTS),基于华为智慧引擎(HUAWEI HiAI Engine)中的语音播报引擎,向开发者提供人工智能应用层API。该技术提供将文本转换为语音并进行播报的能力。 支持超长文本播报,最大文本长度为100000个字符。 语音播报不支持多线程调用。 实时语音交

    2024年02月11日
    浏览(79)
  • HarmonyOS学习路之开发篇—多媒体开发(相机开发 一)

    HarmonyOS相机模块支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发,最常见的操作如:预览、拍照、连拍和录像等。 相机静态能力 用于描述相机的固有能力的一系列参数,比如朝向、支持的分辨率等信息。 物理相机 物理相机就是独

    2024年02月10日
    浏览(67)
  • HarmonyOS学习路之开发篇—多媒体开发(图像开发 一)

    HarmonyOS图像模块支持图像业务的开发,常见功能如图像解码、图像编码、基本的位图操作、图像编辑等。当然,也支持通过接口组合来实现更复杂的图像处理逻辑。 图像解码 图像解码就是不同的存档格式图片(如JPEG、PNG等)解码为无压缩的位图格式,以方便在应用或者系统

    2024年02月11日
    浏览(49)
  • HarmonyOS学习路之开发篇—多媒体开发(相机开发 二)

    Camera操作类,包括相机预览、录像、拍照等功能接口。 接口名 描述 triggerSingleCapture​(FrameConfig frameConfig) 启动相机帧的单帧捕获。 triggerMultiCapture​(ListFrameConfig frameConfigs) 启动相机帧的多帧捕获。 configure​(CameraConfig config) 配置相机。 flushCaptures​() 停止并清除相机帧的捕获

    2024年02月11日
    浏览(55)
  • HarmonyOS学习路之开发篇—多媒体开发(图像开发 二)

    图像编码就是将PixelMap图像编码成不同存档格式图片,用于后续其他处理,比如保存、传输等。当前仅支持JPEG格式。 ImagePacker主要用于图像编码。 接口名 描述 create() 创建图像打包器实例。 initializePacking(byte[] data, PackingOptions opts) 初始化打包任务,将字节数组设置为打包后输

    2024年02月11日
    浏览(58)
  • HarmonyOS学习路之开发篇—流转(跨端迁移 二)

    完成环境搭建,在DevEco Studio中,选择手机设备,Empty Feature Ability(Java)模板创建项目,在项目自动创建的MainAbility中实现IAbilityContinuation接口。 在AbilitySlice中实现一个用于控制基础功能的页面,以下演示代码逻辑都将在AbilitySlice中实现,代码示例如下: 在MainAbility对应的config

    2024年02月13日
    浏览(42)
  • HarmonyOS学习路之开发篇—流转(多端协同 二)

     完成 环境搭建,在DevEco Studio中,选择手机设备,Empty Feature Ability(Java)模板创建项目,在项目自动创建的MainAbility中实现IAbilityContinuation接口。 在AbilitySlice中实现一个用于控制基础功能的页面,以下演示代码逻辑都将在AbilitySlice中实现,代码示例如下: 在FA对应的config.json中

    2024年02月15日
    浏览(40)
  • HarmonyOS学习路之开发篇—流转(多端协同 一)

    开发者在应用FA中通过调用流转任务管理服务、分布式任务调度的接口,实现多端协同。 主要流程如下: 设备A上的应用FA向流转任务管理服务注册一个流转回调。 Alt1-系统推荐流转:系统感知周边有可用设备后,主动为用户提供可选择流转的设备信息,并在用户完成设备选择

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包