1# @ohos.nfc.cardEmulation (标准NFC-cardEmulation) 2 3本模块主要提供NFC卡模拟业务,包括判断支持哪种卡模拟类型,HCE卡模拟的业务实现等。 4HCE(Host Card Emulation),称为基于主机的卡模拟,表示不依赖安全单元芯片,应用程序模拟NFC卡片,可以通过NFC服务和NFC读卡器通信。 5 6> **说明:** 7> 8> 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 9 10## HCE卡模拟和AID列表的声明定义 11 12开发HCE卡模拟相关应用时,需要在应用的属性配置文件中,声明与NFC相关的属性值,比如,在module.json5文件中,声明下面属性值: 13```json 14{ 15 "module": { 16 // other declared attributes. 17 "abilities": [ 18 { 19 // other declared attributes. 20 "skills": [ 21 { 22 "actions": [ 23 "ohos.nfc.cardemulation.action.HOST_APDU_SERVICE" 24 ] 25 } 26 ], 27 "metadata": [ 28 { 29 "name": "payment-aid", 30 "value": "your payment aid" 31 }, 32 { 33 "name": "other-aid", 34 "value": "your other aid" 35 } 36 ] 37 } 38 ], 39 "requestPermissions": [ 40 { 41 "name": "ohos.permission.NFC_CARD_EMULATION", 42 // should add variable card_emulation_reason in string.json 43 "reason": "$string:card_emulation_reason", 44 } 45 ] 46 } 47} 48``` 49> **注意:** 50>1. 声明"actions"字段的内容填写,必须包含"ohos.nfc.cardemulation.action.HOST_APDU_SERVICE",不能更改。 51>2. 声明aid时,name必须为payment-aid,或者other-aid。填写错误会造成解析失败。 52>3. 声明权限时"requestPermissions"中的"name"字段的内容填写,必须是"ohos.permission.NFC_CARD_EMULATION",不能更改。 53 54## 导入模块 55 56``` 57import { cardEmulation } from '@kit.ConnectivityKit'; 58``` 59 60## cardEmulation.FeatureType<sup>(deprecated)</sup> 61 62定义不同的NFC卡模拟类型。 63 64> **说明:** 65> 66> 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#cardemulationhashcecapability9)替代。 67 68**系统能力:** SystemCapability.Communication.NFC.CardEmulation 69 70| 名称 | 值 | 说明 | 71| ---- | ---- | -------- | 72| HCE | 0 | HCE 卡模拟。 | 73| UICC | 1 | SIM 卡模拟。 | 74| ESE | 2 | ESE 卡模拟。 | 75 76## CardType<sup>9+</sup> 77 78定义卡模拟应用所使用的业务类型,是支付类型,还是其他类型。 79 80**系统能力:** SystemCapability.Communication.NFC.CardEmulation 81 82**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 83 84| 名称 | 值 | 说明 | 85| ------- | --------- | ----------------- | 86| PAYMENT | "payment" | 卡模拟应用所使用的业务是支付类型。 | 87| OTHER | "other" | 卡模拟应用所使用的业务是其他类型。 | 88 89## cardEmulation.isSupported<sup>(deprecated)</sup> 90 91isSupported(feature: number): boolean 92 93是否支持某种类型的卡模拟。 94 95> **说明:** 96> 97> 从 API version 6 开始支持,从 API version 9 开始废弃,建议使用[hasHceCapability](#cardemulationhashcecapability9)替代。 98 99**系统能力:** SystemCapability.Communication.NFC.CardEmulation 100 101**参数:** 102 103| 参数名 | 类型 | 必填 | 说明 | 104| ------- | ------ | ---- | ---------------------------------------- | 105| feature | number | 是 | 卡模拟类型值,详细请见[FeatureType](#cardemulationfeaturetypedeprecated)枚举值。 | 106 107**返回值:** 108 109| **类型** | **说明** | 110| ------- | -------------------------------------- | 111| boolean | true: 支持该类型卡模拟, false: 不支持该类型卡模拟。 | 112 113**示例:** 114 115```js 116import { cardEmulation } from '@kit.ConnectivityKit'; 117 118let isHceSupported: boolean = cardEmulation.isSupported(cardEmulation.FeatureType.HCE); 119if (!isHceSupported) { 120 console.log('this device is not supported for HCE, ignore it.'); 121} 122``` 123 124## cardEmulation.hasHceCapability<sup>9+</sup> 125 126hasHceCapability(): boolean 127 128判断设备是否支持HCE卡模拟功能。 129 130**系统能力:** SystemCapability.Communication.NFC.CardEmulation 131 132**需要权限:** ohos.permission.NFC_CARD_EMULATION 133 134**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 135 136**返回值:** 137 138| **类型** | **说明** | 139| ------- | -------------------------------- | 140| boolean | true: 支持HCE, false: 不支持HCE。 | 141 142**错误码**: 143 144以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 145 146| 错误码ID | 错误信息 | 147| -------- | ---------------------------- | 148|201 | Permission denied. | 149|801 | Capability not supported. | 150 151**示例:** 152 153```js 154import { cardEmulation } from '@kit.ConnectivityKit'; 155 156let hasHceCap: boolean = cardEmulation.hasHceCapability(); 157if (!hasHceCap) { 158 console.log('this device hasHceCapability false, ignore it.'); 159} 160``` 161 162## cardEmulation.isDefaultService<sup>9+</sup> 163 164isDefaultService(elementName: ElementName, type: CardType): boolean 165 166判断指定的应用是否为指定业务类型的默认应用。 167 168**系统能力:** SystemCapability.Communication.NFC.CardEmulation 169 170**需要权限:** ohos.permission.NFC_CARD_EMULATION 171 172**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 173 174**参数:** 175 176| 参数名 | 类型 | 必填 | 说明 | 177| ----------- | ---------------------------------------- | ---- |-------------------------| 178| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 179| type | [CardType](#cardtype9) | 是 | 卡模拟业务类型。目前只支持默认支付应用查询。 | 180 181**错误码**: 182 183以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 184 185| 错误码ID | 错误信息 | 186| -------- | ---------------------------- | 187|201 | Permission denied. | 188|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 189|801 | Capability not supported. | 190 191**返回值:** 192 193| **类型** | **说明** | 194| ------- | ------------------------------------ | 195| boolean | true: 是默认支付应用, false: 不是默认支付应用。 | 196 197 198**示例:** 199```js 200import { cardEmulation } from '@kit.ConnectivityKit'; 201import { bundleManager, Want } from '@kit.AbilityKit'; 202 203// init elementName here, bundleName and abilityName are required. 204let want: Want = { 205 bundleName: "com.example.myapplication", 206 moduleName: "entry", 207 abilityName: "EntryAbility" 208}; 209let elementName: bundleManager.ElementName = { 210 bundleName: "com.example.myapplication", 211 moduleName: "entry", 212 abilityName: "EntryAbility" 213}; 214 215let isDefaultService: boolean = cardEmulation.isDefaultService(elementName, cardEmulation.CardType.PAYMENT); 216// do something according to the isDefaultService value 217``` 218 219 220## HceService<sup>8+</sup> 221 222提供HCE卡模拟的实现,主要包括接收对端读卡设备的APDU数据,并响应APDU数据到对端读卡设备。使用HCE相关接口前,必须先判断设备是否支持HCE卡模拟能力。 223 224### startHCE<sup>(deprecated)</sup> 225 226startHCE(aidList: string[]): boolean 227 228启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 229 230> **说明:** 231> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[start](#start9)替代。 232 233**需要权限:** ohos.permission.NFC_CARD_EMULATION 234 235**系统能力:** SystemCapability.Communication.NFC.CardEmulation 236 237**参数:** 238 239| 参数名 | 类型 | 必填 | 说明 | 240| ------- | -------- | ---- | ----------------------- | 241| aidList | string[] | 是 | 动态注册卡模拟的AID列表。 | 242 243**返回值:** 244 245| **类型** | **说明** | 246| ------- | -------------------------------------- | 247| boolean | true: 启动HCE功能或HCE已启动, false: 启动失败。 | 248 249### start<sup>9+</sup> 250 251start(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname), aidList: string[]): void 252 253启动HCE业务功能。包括设置当前应用为前台优先,动态注册AID列表。 254 255**需要权限:** ohos.permission.NFC_CARD_EMULATION 256 257**系统能力:** SystemCapability.Communication.NFC.CardEmulation 258 259**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 260 261**参数:** 262 263| 参数名 | 类型 | 必填 | 说明 | 264| ------- | -------- | ---- | ----------------------- | 265| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 266| aidList | string[] | 是 | 动态注册卡模拟的AID列表,允许为空。 | 267 268**错误码:** 269 270以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 271 272| 错误码ID | 错误信息| 273| ------- | -------| 274|201 | Permission denied. | 275|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 276|801 | Capability not supported. | 277| 3100301 | Card emulation running state is abnormal in service. | 278 279### stopHCE<sup>(deprecated)</sup> 280 281stopHCE(): boolean 282 283停止HCE业务功能。包括退出当前应用前台优先,释放动态注册的AID列表,释放hceCmd的订阅。 284 285> **说明:** 286> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[stop](#stop9)替代。 287 288**需要权限:** ohos.permission.NFC_CARD_EMULATION 289 290**系统能力:** SystemCapability.Communication.NFC.CardEmulation 291 292**返回值:** 293 294| **类型** | **说明** | 295| ------- | -------------------------------------- | 296| boolean | true: 禁用HCE功能或HCE已禁用, false: 禁用失败。 | 297 298**示例:** 299 300示例请参见[on](#on8)接口的示例。 301 302### stop<sup>9+</sup> 303 304stop(elementName: [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname)): void 305 306停止HCE业务功能。包括取消APDU数据接收的订阅,退出当前应用前台优先,释放动态注册的AID列表。应用程序需要在HCE卡模拟页面的onDestroy函数里调用该接口。 307 308**需要权限:** ohos.permission.NFC_CARD_EMULATION 309 310**系统能力:** SystemCapability.Communication.NFC.CardEmulation 311 312**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 313 314**参数:** 315 316| 参数名 | 类型 | 必填 | 说明 | 317| ------- | -------- | ---- | ----------------------- | 318| elementName | [ElementName](../apis-ability-kit/js-apis-bundleManager-elementName.md#elementname) | 是 | 所属应用声明NFC卡模拟能力的页面信息(至少包含bundleName、abilityName这两项的赋值),不可以为空。 | 319 320**错误码:** 321 322以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 323 324| 错误码ID | 错误信息| 325| ------- | -------| 326|201 | Permission denied. | 327|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 328|801 | Capability not supported. | 329| 3100301 | Card emulation running state is abnormal in service. | 330 331### on<sup>8+</sup> 332 333on(type: 'hceCmd', callback: AsyncCallback\<number[]>): void 334 335订阅回调,用于接收对端读卡设备发送的APDU数据。应用程序需要在HCE卡模拟页面的onCreate函数里面调用该订阅函数。 336 337**需要权限:** ohos.permission.NFC_CARD_EMULATION 338 339**系统能力:** SystemCapability.Communication.NFC.CardEmulation 340 341**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 342 343**参数:** 344 345| 参数名 | 类型 | 必填 | 说明 | 346| -------- | ----------------------- | ---- | -------------------------------------------- | 347| type | string | 是 | 要订阅的回调类型,固定填"hceCmd"字符串。 | 348| callback | AsyncCallback\<number[]> | 是 | 订阅的事件回调,入参是符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 349 350**示例:** 351```js 352import { hilog } from '@kit.PerformanceAnalysisKit'; 353import { cardEmulation } from '@kit.ConnectivityKit'; 354import { AsyncCallback } from '@kit.BasicServicesKit'; 355import { ElementName } from './bundleManager/ElementName' 356import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 357 358let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 359let element: ElementName; 360 361export default class EntryAbility extends UIAbility { 362 onCreate(want: Want, param: AbilityConstant.LaunchParam) { 363 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onCreate'); 364 element = { 365 bundleName: want.bundleName ?? '', 366 abilityName: want.abilityName ?? '', 367 moduleName: want.moduleName 368 } 369 const apduCallback: AsyncCallback<number[]> = (err, data) => { 370 //handle the data and err 371 console.log("got apdu data"); 372 }; 373 hceService.on('hceCmd', apduCallback); 374 } 375 onDestroy() { 376 hilog.info(0x0000, 'testHce', '%{public}s', 'Ability onDestroy'); 377 hceService.stop(element) 378 } 379 // other life cycle method... 380} 381``` 382 383 384### sendResponse<sup>(deprecated)</sup> 385 386sendResponse(responseApdu: number[]): void 387 388发送APDU数据到对端读卡设备。 389 390> **说明:** 391> 从 API version 8 开始支持,从 API version 9 开始废弃,建议使用[transmit](#transmit9)替代。 392 393**需要权限:** ohos.permission.NFC_CARD_EMULATION 394 395**系统能力:** SystemCapability.Communication.NFC.CardEmulation 396 397**参数:** 398 399| 参数名 | 类型 | 必填 | 说明 | 400| ------------ | -------- | ---- | -------------------------------------------------- | 401| responseApdu | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 402 403### transmit<sup>9+</sup> 404 405transmit(response: number[]): Promise\<void> 406 407发送APDU数据到对端读卡设备,使用Promise异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 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| response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 420 421**返回值:** 422 423| **类型** | **说明** | 424| ------- | -------------------------------------- | 425| Promise\<void> | 以Promise形式异步返回发送APDU数据的结果。 | 426 427**错误码:** 428 429以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 430 431| 错误码ID | 错误信息| 432| ------- | -------| 433|201 | Permission denied. | 434|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 435|801 | Capability not supported. | 436| 3100301 | Card emulation running state is abnormal in service. | 437 438**示例:** 439```js 440import { cardEmulation } from '@kit.ConnectivityKit'; 441import { BusinessError } from '@kit.BasicServicesKit'; 442 443let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 444 445// the data app wanna send, just a example data 446const responseData = [0x1, 0x2]; 447hceService.transmit(responseData).then(() => { 448 // handle the transmit promise 449 console.log("transmit Promise success."); 450}).catch((err: BusinessError) => { 451 console.log("transmit Promise error:", err); 452}); 453``` 454 455### transmit<sup>9+</sup> 456 457transmit(response: number[], callback: AsyncCallback\<void>): void 458 459发送APDU数据到对端读卡设备,使用Callback异步回调。应用程序必须在[on](#on8)收到读卡设备发送的APDU数据后,才调用该接口响应数据。 460 461**需要权限:** ohos.permission.NFC_CARD_EMULATION 462 463**系统能力:** SystemCapability.Communication.NFC.CardEmulation 464 465**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 466 467**参数:** 468 469| 参数名 | 类型 | 必填 | 说明 | 470| ------- | -------- | ---- | ----------------------- | 471| response | number[] | 是 | 发送到对端读卡设备的符合APDU协议的数据,每个number十六进制表示,范围是0x00~0xFF。 | 472| callback | AsyncCallback\<void> | 是 | 以callback形式异步返回发送APDU数据的结果。 | 473 474**错误码:** 475 476以下错误码的详细介绍请参见[NFC错误码](errorcode-nfc.md)。 477 478| 错误码ID | 错误信息| 479| ------- | -------| 480|201 | Permission denied. | 481|401 | The parameter check failed. Possible causes: <br>1. Mandatory parameters are left unspecified.<br>2. Incorrect parameters types.<br>3. Parameter verification failed. | 482|801 | Capability not supported. | 483| 3100301 | Card emulation running state is abnormal in service. | 484 485**示例:** 486```js 487import { cardEmulation } from '@kit.ConnectivityKit'; 488import { BusinessError } from '@kit.BasicServicesKit'; 489 490let hceService: cardEmulation.HceService = new cardEmulation.HceService(); 491 492// the data app wanna send, just a example data 493try { 494 const responseData = [0x1, 0x2]; 495 496 hceService.transmit(responseData, (err : BusinessError)=> { 497 if (err) { 498 console.error(`transmit AsyncCallback err Code: ${err.code}, message: ${err.message}`); 499 } else { 500 console.log("transmit AsyncCallback success."); 501 } 502 }); 503} catch (error) { 504 console.error(`transmit AsyncCallback catch Code: ${(error as BusinessError).code}, ` + 505 `message: ${(error as BusinessError).message}`); 506} 507``` 508 509