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