1# @ohos.nfc.cardEmulation (标准NFC-cardEmulation) 2 3<!--Kit: Connectivity Kit--> 4<!--Subsystem: Communication--> 5<!--Owner: @amunra03--> 6<!--Designer: @wenxiaolin--> 7<!--Tester: @zs_111--> 8<!--Adviser: @zhang_yixin13--> 9 10本模块主要提供NFC卡模拟业务,包括判断支持哪种卡模拟类型,HCE卡模拟的业务实现等。<br> 11HCE(Host Card Emulation),称为基于主机的卡模拟,表示不依赖安全单元芯片,应用程序模拟NFC卡片,可以通过NFC服务和NFC读卡器通信。 12 13> **说明:** 14> 15> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 16 17## HCE卡模拟和AID列表的声明定义 18 19开发HCE卡模拟相关应用时,需要在应用的属性配置文件中,声明与NFC相关的属性值,比如,在module.json5文件中,声明下面属性值: 20```json 21// 适用于除轻量级智能穿戴产品之外其它设备 22{ 23 "module": { 24 // 其他已声明的属性 25 "abilities": [ 26 { 27 // 其他已声明的属性 28 "skills": [ 29 { 30 "actions": [ 31 "ohos.nfc.cardemulation.action.HOST_APDU_SERVICE" 32 ] 33 } 34 ], 35 "metadata": [ 36 { 37 "name": "payment-aid", 38 "value": "your payment aid" 39 }, 40 { 41 "name": "other-aid", 42 "value": "your other aid" 43 } 44 ] 45 } 46 ], 47 "requestPermissions": [ 48 { 49 "name": "ohos.permission.NFC_CARD_EMULATION", 50 // 必须要添加reason: card_emulation_reason 51 "reason": "$string:card_emulation_reason" 52 } 53 ] 54 } 55} 56``` 57```json 58// 轻量级智能穿戴设备 59{ 60 "module": { 61 // 其他已声明的属性 62 "abilities": [ 63 { 64 // 其他已声明的属性 65 "metaData": { 66 "customizeData": [ 67 { 68 "name": "paymentAid", 69 "value": "A0000000041012" 70 }, 71 { 72 "name": "otherAid", 73 "value": "A0000000041010" 74 } 75 ] 76 }, 77 "skills": [ 78 { 79 "entities": [ 80 "ohos.nfc.cardemulation.action.HOST_APDU_SERVICE" 81 ], 82 "actions": [ 83 "ohos.nfc.cardemulation.action.HOST_APDU_SERVICE" 84 ] 85 } 86 ] 87 } 88 ], 89 "reqPermissions": [ 90 { 91 "name": "ohos.permission.NFC_CARD_EMULATION", 92 // 必须要添加reason: card_emulation_reason 93 "reason": "$string:card_emulation_reason", 94 "usedScene":{ 95 "ability":[ 96 "FormAbility" 97 ], 98 "when":"always" 99 } 100 }, 101 { 102 "name": "ohos.permission.NFC_TAG", 103 // 必须要添加reason: card_emulation_reason 104 "reason": "$string:card_emulation_reason", 105 "usedScene":{ 106 "ability":[ 107 "FormAbility" 108 ], 109 "when":"always" 110 } 111 } 112 ] 113 } 114} 115``` 116> **注意:** 117>1. 声明"actions"字段的内容填写,必须包含"ohos.nfc.cardemulation.action.HOST_APDU_SERVICE",不能更改。 118>2. 声明aid(参考ISO/IEC 7816-4规范)时,name必须为payment-aid或者other-aid。填写错误会造成解析失败。 119>3. 声明权限时"requestPermissions"中的"name"字段的内容填写,必须是"ohos.permission.NFC_CARD_EMULATION",不能更改。 120>4. 轻量级智能穿戴产品不同于其他设备,仅支持FA模型,属性配置和接口调用方式与其它设备有所区别,详见示例。 121 122## 导入模块 123 124``` 125// 适用于除轻量级智能穿戴产品之外其它设备 126import { cardEmulation } from '@kit.ConnectivityKit'; 127``` 128 129<!--code_no_check_fa--> 130``` 131// 轻量级智能穿戴设备 132import cardEmulation from '@ohos.nfc.cardEmulation'; 133``` 134 135## FeatureType<sup>(deprecated)</sup> 136 137定义不同的NFC卡模拟类型。 138 139> **说明:** 140> 141> 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#cardemulationhashcecapability9)替代。 142 143**系统能力:** SystemCapability.Communication.NFC.CardEmulation 144 145| 名称 | 值 | 说明 | 146| ---- | ---- | -------- | 147| HCE | 0 | HCE 卡模拟。 | 148| UICC | 1 | SIM 卡模拟。 | 149| ESE | 2 | ESE 卡模拟。 | 150 151## CardType<sup>9+</sup> 152 153定义卡模拟应用所使用的业务类型,是支付类型,还是其他类型。 154 155**系统能力:** SystemCapability.Communication.NFC.CardEmulation 156 157**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 158 159| 名称 | 值 | 说明 | 160| ------- | --------- | ----------------- | 161| PAYMENT | "payment" | 卡模拟应用所使用的业务是支付类型。 | 162| OTHER | "other" | 卡模拟应用所使用的业务是其他类型。 | 163 164## cardEmulation.isSupported<sup>(deprecated)</sup> 165 166isSupported(feature: number): boolean 167 168是否支持某种类型的卡模拟。 169 170> **说明:** 171> 172> 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#cardemulationhashcecapability9)替代。 173 174**系统能力:** SystemCapability.Communication.NFC.CardEmulation 175 176**参数:** 177 178| 参数名 | 类型 | 必填 | 说明 | 179| ------- | ------ | ---- | ---------------------------------------- | 180| feature | number | 是 | 卡模拟类型值,详细请见[FeatureType](#featuretypedeprecated)枚举值。 | 181 182**返回值:** 183 184| **类型** | **说明** | 185| ------- | -------------------------------------- | 186| boolean | true: 支持该类型卡模拟, false: 不支持该类型卡模拟。 | 187 188**示例:** 189 190```js 191// 适用于除轻量级智能穿戴产品之外其它设备 192import { cardEmulation } from '@kit.ConnectivityKit'; 193 194let isHceSupported: boolean = cardEmulation.isSupported(cardEmulation.FeatureType.HCE); 195if (!isHceSupported) { 196 console.log('this device is not supported for HCE, ignore it.'); 197} 198``` 199<!--code_no_check_fa--> 200```js 201// 适用于轻量化智能穿戴设备 202import cardEmulation from '@ohos.nfc.cardEmulation'; 203 204let isHceSupported = cardEmulation.isSupported(cardEmulation.FeatureType.HCE); 205if (!isHceSupported) { 206 console.log('this device is not supported for HCE, ignore it.'); 207} 208``` 209 210## cardEmulation.hasHceCapability<sup>9+</sup> 211 212hasHceCapability(): boolean 213 214判断设备是否支持HCE卡模拟功能。 215 216**系统能力:** SystemCapability.Communication.NFC.CardEmulation 217 218**需要权限:** ohos.permission.NFC_CARD_EMULATION 219 220**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 221 222**返回值:** 223 224| **类型** | **说明** | 225| ------- | -------------------------------- | 226| boolean | true: 支持HCE, false: 不支持HCE。 | 227 228**错误码**: 229 230以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 231 232| 错误码ID | 错误信息 | 233| -------- | ---------------------------- | 234|201 | Permission denied. | 235|801 | Capability not supported. | 236 237**示例:** 238 239```js 240// 适用于除轻量级智能穿戴产品之外其它设备 241import { cardEmulation } from '@kit.ConnectivityKit'; 242 243let hasHceCap: boolean = cardEmulation.hasHceCapability(); 244if (!hasHceCap) { 245 console.log('this device hasHceCapability false, ignore it.'); 246} 247``` 248 249<!--code_no_check_fa--> 250```js 251// 适用于轻量化智能穿戴设备 252import cardEmulation from '@ohos.nfc.cardEmulation'; 253 254let hasHceCap = cardEmulation.hasHceCapability(); 255if (!hasHceCap) { 256 console.log('this device hasHceCapability false, ignore it.'); 257} 258``` 259 260## cardEmulation.isDefaultService<sup>9+</sup> 261 262isDefaultService(elementName: ElementName, type: CardType): boolean 263 264判断指定的应用是否为指定业务类型的默认应用。 265 266**系统能力:** SystemCapability.Communication.NFC.CardEmulation 267 268**需要权限:** ohos.permission.NFC_CARD_EMULATION 269 270**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 271 272**参数:** 273 274| 参数名 | 类型 | 必填 | 说明 | 275| ----------- | ---------------------------------------- | ---- |-------------------------| 276| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 277| type | [CardType](#cardtype9) | 是 | 卡模拟业务类型。目前只支持默认支付应用查询。 | 278 279**错误码:** 280 281以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 282 283| 错误码ID | 错误信息 | 284| -------- | ---------------------------- | 285|201 | Permission denied. | 286|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 287|801 | Capability not supported. | 288 289**返回值:** 290 291| **类型** | **说明** | 292| ------- | ------------------------------------ | 293| boolean | true: 是默认支付应用, false: 不是默认支付应用。 | 294 295 296**示例:** 297```js 298// 适用于除轻量级智能穿戴产品之外其它设备 299import { cardEmulation } from '@kit.ConnectivityKit'; 300import { bundleManager, Want } from '@kit.AbilityKit'; 301 302// 需要初始化 elementName、bundleName、abilityName,根据实际应用信息更改为正确的值 303let elementName: bundleManager.ElementName = { 304 bundleName: "com.example.myapplication", 305 moduleName: "entry", 306 abilityName: "EntryAbility" 307}; 308 309let isDefaultService: boolean = cardEmulation.isDefaultService(elementName, cardEmulation.CardType.PAYMENT); 310``` 311 312<!--code_no_check_fa--> 313```js 314// 适用于轻量化智能穿戴设备 315import cardEmulation from '@ohos.nfc.cardEmulation'; 316 317let appName = "com.example.testquestionlite"; 318let isDefaultService = cardEmulation.isDefaultService(appName, cardEmulation.CardType.PAYMENT); 319``` 320 321## HceService<sup>8+</sup> 322 323提供HCE卡模拟的实现,主要包括接收对端读卡设备的APDU数据,并响应APDU数据到对端读卡设备。使用HCE相关接口前,必须先判断设备是否支持HCE卡模拟能力。 324 325### startHCE<sup>(deprecated)</sup> 326 327startHCE(aidList: string[]): boolean 328 329启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 330 331> **说明:** 332> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[start](#start9)替代。 333 334**需要权限:** ohos.permission.NFC_CARD_EMULATION 335 336**系统能力:** SystemCapability.Communication.NFC.CardEmulation 337 338**参数:** 339 340| 参数名 | 类型 | 必填 | 说明 | 341| ------- | -------- | ---- | ----------------------- | 342| aidList | string[] | 是 | 动态注册卡模拟的AID列表。 | 343 344**返回值:** 345 346| **类型** | **说明** | 347| ------- | -------------------------------------- | 348| boolean | true: 启动HCE功能或HCE已启动, false: 启动失败。 | 349 350### start<sup>9+</sup> 351 352start(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md), aidList: string[]): void 353 354启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 355 356**需要权限:** ohos.permission.NFC_CARD_EMULATION 357 358**系统能力:** SystemCapability.Communication.NFC.CardEmulation 359 360**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 361 362**参数:** 363 364| 参数名 | 类型 | 必填 | 说明 | 365| ------- | -------- | ---- | ----------------------- | 366| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 367| aidList | string[] | 是 | 动态注册卡模拟的AID列表,允许为空。 | 368 369**错误码:** 370 371以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 372 373| 错误码ID | 错误信息| 374| ------- | -------| 375|201 | Permission denied. | 376|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 377|801 | Capability not supported. | 378| 3100301 | Card emulation running state is abnormal in service. | 379 380### stopHCE<sup>(deprecated)</sup> 381 382stopHCE(): boolean 383 384停止HCE业务功能。包括退出当前应用前台优先,释放动态注册的AID列表,释放hceCmd的订阅。 385 386> **说明:** 387> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[stop](#stop9)替代。 388 389**需要权限:** ohos.permission.NFC_CARD_EMULATION 390 391**系统能力:** SystemCapability.Communication.NFC.CardEmulation 392 393**返回值:** 394 395| **类型** | **说明** | 396| ------- | -------------------------------------- | 397| boolean | true: 禁用HCE功能或HCE已禁用,false: 禁用失败。 | 398 399**示例:** 400 401示例请参见[on](#on8)接口的示例。 402 403### stop<sup>9+</sup> 404 405stop(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md)): void 406 407停止HCE业务功能。包括取消APDU数据接收的订阅,退出当前应用前台优先,释放动态注册的AID列表。应用程序需要在HCE卡模拟页面的onDestroy函数里调用该接口。 408 409**需要权限:** ohos.permission.NFC_CARD_EMULATION 410 411**系统能力:** SystemCapability.Communication.NFC.CardEmulation 412 413**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 414 415**参数:** 416 417| 参数名 | 类型 | 必填 | 说明 | 418| ------- | -------- | ---- | ----------------------- | 419| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 420 421**错误码:** 422 423以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 424 425| 错误码ID | 错误信息| 426| ------- | -------| 427|201 | Permission denied. | 428|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 429|801 | Capability not supported. | 430| 3100301 | Card emulation running state is abnormal in service. | 431 432### on<sup>8+</sup> 433 434on(type: 'hceCmd', callback: AsyncCallback\<number[]>): void 435 436订阅回调,用于接收对端读卡设备发送的APDU数据。应用程序需要在HCE卡模拟页面的onCreate函数里面调用该订阅函数。 437 438**需要权限:** ohos.permission.NFC_CARD_EMULATION 439 440**系统能力:** SystemCapability.Communication.NFC.CardEmulation 441 442**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 443 444**参数:** 445 446| 参数名 | 类型 | 必填 | 说明 | 447| -------- | ----------------------- | ---- | -------------------------------------------- | 448| type | string | 是 | 要订阅的回调类型,固定填"hceCmd"字符串。 | 449| callback | AsyncCallback\<number[]> | 是 | 订阅的事件回调,入参是符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 450 451**错误码:** 452 453以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 454 455| 错误码ID | 错误信息| 456| ------- | -------| 457|201 | Permission denied. | 458|401 | Invalid parameter. | 459|801 | Capability not supported. | 460 461**示例:** 462```js 463// 适用于除轻量级智能穿戴产品之外其它设备 464import { hilog } from '@kit.PerformanceAnalysisKit'; 465import { cardEmulation } from '@kit.ConnectivityKit'; 466import { AsyncCallback } from '@kit.BasicServicesKit'; 467import { ElementName } from './bundleManager/ElementName' 468import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 469 470let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 471let element: ElementName; 472 473export default class EntryAbility extends UIAbility { 474 onCreate(want: Want, param: AbilityConstant.LaunchParam) { 475 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onCreate'); 476 element = { 477 bundleName: want.bundleName ?? '', 478 abilityName: want.abilityName ?? '', 479 moduleName: want.moduleName 480 } 481 const apduCallback: AsyncCallback<number[]> = (err, data) => { 482 //处理数据和异常 483 console.log("got apdu data"); 484 }; 485 hceService.on('hceCmd', apduCallback); 486 } 487 onDestroy() { 488 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onDestroy'); 489 hceService.stop(element); 490 } 491 // 生命周期内的其它功能 492} 493``` 494 495**示例:** 496<!--code_no_check_fa--> 497```js 498// 适用于轻量级智能穿戴设备 499import cardEmulation from '@ohos.nfc.cardEmulation'; 500 501let appName = "com.example.testquestionlite"; 502 503export default { 504 data:{ 505 fontSize: '30px', 506 fontColor: '#50609f', 507 hide: 'show', 508 headCon: appName, 509 paymentAid: ["A0000000041010", "A0000000041012"] 510 }, 511 onCreate() { 512 console.info('onCreate'); 513 }, 514 onReady() { 515 cardEmulation.hasHceCapability(); 516 cardEmulation.isDefaultService(appName, cardEmulation.CardType.PAYMENT); 517 cardEmulation.isDefaultService(appName, cardEmulation.CardType.OTHER); 518 let HceService = new cardEmulation.HceService(); 519 520 HceService.start(appName, this.paymentAid); 521 HceService.on("hceCmd", (data) => { 522 console.log('data:' + data); 523 // 应用程序实际想要发送的数据, 此处仅作为示例 524 let responseData = [0x1, 0x2]; 525 HceService.transmit(responseData, () => { 526 console.log('sendResponse start'); 527 }); 528 console.log('sendResponse end'); 529 }); 530 }, 531 onDestroy() { 532 } 533 // 生命周期内的其它功能 534} 535``` 536 537### off<sup>18+</sup> 538 539off(type: 'hceCmd', callback?: AsyncCallback\<number[]>): void 540 541取消APDU数据接收的订阅。 542 543**需要权限:** ohos.permission.NFC_CARD_EMULATION 544 545**系统能力:** SystemCapability.Communication.NFC.CardEmulation 546 547**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 548 549**参数:** 550 551| 参数名 | 类型 | 必填 | 说明 | 552| -------- | ----------------------- | ---- | -------------------------------------------- | 553| type | string | 是 | 要取消订阅的事件类型,固定填"hceCmd"字符串。 | 554| callback | AsyncCallback\<number[]> | 否 | 订阅的事件回调,每个number十六进制表示,范围是0x00~0xFF。 | 555 556**错误码:** 557 558以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 559 560| 错误码ID | 错误信息| 561| ------- | -------| 562|201 | Permission denied. | 563|801 | Capability not supported. | 564 565**示例:** 566```js 567// 适用于除轻量级智能穿戴产品之外其它设备 568import { hilog } from '@kit.PerformanceAnalysisKit'; 569import { cardEmulation } from '@kit.ConnectivityKit'; 570import { AsyncCallback } from '@kit.BasicServicesKit'; 571import { ElementName } from './bundleManager/ElementName' 572import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 573 574let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 575let element: ElementName; 576const apduCallback: AsyncCallback<number[]> = (err, data) => { 577 // 处理数据和异常 578 console.log("AsyncCallback got apdu data"); 579}; 580 581export default class EntryAbility extends UIAbility { 582 onCreate(want: Want, param: AbilityConstant.LaunchParam) { 583 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onCreate'); 584 element = { 585 bundleName: want.bundleName ?? '', 586 abilityName: want.abilityName ?? '', 587 moduleName: want.moduleName 588 } 589 hceService.on('hceCmd', apduCallback); 590 } 591 onDestroy() { 592 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onDestroy'); 593 hceService.off('hceCmd', apduCallback); 594 hceService.stop(element); 595 } 596 // 生命周期内的其它功能 597} 598``` 599 600### sendResponse<sup>(deprecated)</sup> 601 602sendResponse(responseApdu: number[]): void 603 604发送APDU数据到对端读卡设备。 605 606> **说明:** 607> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[transmit](#transmit9)替代。 608 609**需要权限:** ohos.permission.NFC_CARD_EMULATION 610 611**系统能力:** SystemCapability.Communication.NFC.CardEmulation 612 613**参数:** 614 615| 参数名 | 类型 | 必填 | 说明 | 616| ------------ | -------- | ---- | -------------------------------------------------- | 617| responseApdu | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 618 619### transmit<sup>9+</sup> 620 621transmit(response: number[]): Promise\<void> 622 623发送APDU数据到对端读卡设备,使用Promise异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 624 625**需要权限:** ohos.permission.NFC_CARD_EMULATION 626 627**系统能力:** SystemCapability.Communication.NFC.CardEmulation 628 629**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 630 631**参数:** 632 633| 参数名 | 类型 | 必填 | 说明 | 634| ------------ | -------- | ---- | -------------------------------------------------- | 635| response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 636 637**返回值:** 638 639| **类型** | **说明** | 640| ------- | -------------------------------------- | 641| Promise\<void> | 以Promise形式异步返回发送APDU数据的结果。 | 642 643**错误码:** 644 645以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 646 647| 错误码ID | 错误信息| 648| ------- | -------| 649|201 | Permission denied. | 650|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 651|801 | Capability not supported. | 652| 3100301 | Card emulation running state is abnormal in service. | 653 654**示例:** 655```js 656// 适用于除轻量级智能穿戴产品之外其它设备 657import { cardEmulation } from '@kit.ConnectivityKit'; 658import { BusinessError } from '@kit.BasicServicesKit'; 659 660let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 661 662// 应用程序实际想要发送的数据, 此处仅作为示例 663const responseData = [0x1, 0x2]; 664hceService.transmit(responseData).then(() => { 665 // 处理 promise 的回调 666 console.log("transmit Promise success."); 667}).catch((err: BusinessError) => { 668 console.error("transmit Promise error:", err); 669}); 670``` 671 672<!--code_no_check_fa--> 673```js 674// 适用于轻量级智能穿戴设备 675import cardEmulation from '@ohos.nfc.cardEmulation'; 676 677let hceService = new cardEmulation.HceService(); 678 679// 应用程序实际想要发送的数据, 此处仅作为示例 680let responseData = [0x1, 0x2]; 681hceService.transmit(responseData).then(() => { 682 // 处理 promise 的回调 683 console.log("transmit Promise success."); 684}); 685console.log("transmit Promise end."); 686``` 687 688### transmit<sup>9+</sup> 689 690transmit(response: number[], callback: AsyncCallback\<void>): void 691 692发送APDU数据到对端读卡设备,使用Callback异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 693 694**需要权限:** ohos.permission.NFC_CARD_EMULATION 695 696**系统能力:** SystemCapability.Communication.NFC.CardEmulation 697 698**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 699 700**参数:** 701 702| 参数名 | 类型 | 必填 | 说明 | 703| ------- | -------- | ---- | ----------------------- | 704| response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 705| callback | AsyncCallback\<void> | 是 | 回调函数。当发送APDU数据成功时,err为undefined,否则为错误对象。 | 706 707**错误码:** 708 709以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 710 711| 错误码ID | 错误信息| 712| ------- | -------| 713|201 | Permission denied. | 714|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 715|801 | Capability not supported. | 716| 3100301 | Card emulation running state is abnormal in service. | 717 718**示例:** 719```js 720// 适用于除轻量级智能穿戴产品之外其它设备 721import { cardEmulation } from '@kit.ConnectivityKit'; 722import { BusinessError } from '@kit.BasicServicesKit'; 723 724let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 725 726// 应用程序实际想要发送的数据, 此处仅作为示例 727try { 728 const responseData = [0x1, 0x2]; 729 730 hceService.transmit(responseData, (err : BusinessError)=> { 731 if (err) { 732 console.error(`transmit AsyncCallback err Code: ${err.code}, message: ${err.message}`); 733 } else { 734 console.log("transmit AsyncCallback success."); 735 } 736 }); 737} catch (error) { 738 console.error(`transmit AsyncCallback catch Code: ${(error as BusinessError).code}, ` + 739 `message: ${(error as BusinessError).message}`); 740} 741``` 742 743<!--code_no_check_fa--> 744```js 745// 适用于轻量级智能穿戴设备 746import cardEmulation from '@ohos.nfc.cardEmulation'; 747 748let hceService = new cardEmulation.HceService(); 749 750// 应用程序实际想要发送的数据, 此处仅作为示例 751let responseData = [0x1, 0x2]; 752hceService.transmit(responseData, () => { 753 console.log("transmit Promise success."); 754}); 755console.log("transmit Promise end."); 756``` 757 758