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: 支持该类型卡模拟,&nbsp;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,&nbsp;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: 是默认支付应用,&nbsp;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已启动,&nbsp;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已禁用,&nbsp;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