• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 扩展外设管理开发指导
2
3
4## 场景介绍
5
6扩展外设主要是指通过物理接口连入主设备的配件设备,如手写板、打印机和扫描仪等。应用通过扩展外设管理能力可以查询绑定扩展外设,从而使用扩展外设驱动提供的定制能力来使用扩展外设,如打印机的配套软件。
7
8扩展外设支持Tablet和特定设备上使用。
9
10
11## 接口说明
12
13扩展外设管理主要提供的功能有:查询扩展外设列表、绑定和解绑查询到的设备。
14
15扩展外设管理开放能力如下,具体请查阅[API参考文档](../reference/apis/js-apis-driver-deviceManager.md)。
16
17**表1** 扩展外设管理开放能力接口
18
19| 接口名                                                                                                                                                      | 描述                                                                                    |
20| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
21| queryDevices(busType?: number): Array<Readonly<Device>>                                                                                         | 查询扩展外设列表。                                                                        |
22| bindDevice(deviceId: number, onDisconnect: AsyncCallback<number>, callback: AsyncCallback<{deviceId: number, remote: rpc.IRemoteObject}>): void | 绑定设备,绑定成功后返回设备驱动的IRemoteObject通信对象,通过该对象与设备驱动进行交互。 |
23| bindDevice(deviceId: number, onDisconnect: AsyncCallback<number>): Promise<{deviceId: number, remote: rpc.IRemoteObject}>                       | 绑定设备的Promise形式。                                                                 |
24| unbindDevice(deviceId: number, callback: AsyncCallback<number>): void                                                                                 | 解绑设备。                                                                              |
25| unbindDevice(deviceId: number): Promise<number>                                                                                                       | 解绑设备的Promise形式。                                                                              |
26
27
28## 开发步骤
29
30应用可通过查询绑定扩展外设,从而使用扩展外设的定制驱动能力。开发示例如下:
31
32
331. 查询设备列表。
34
35    ```ts
36    import deviceManager from '@ohos.driver.deviceManager';
37    import { BusinessError } from '@ohos.base';
38
39    let matchDevice : deviceManager.USBDevice | null = null;
40    try {
41      let devices : Array<deviceManager.Device> = deviceManager.queryDevices(deviceManager.BusType.USB);
42      for (let item of devices) {
43        let device : deviceManager.USBDevice = item as deviceManager.USBDevice;
44        // 通过productId和vendorId来匹配要使用的USB设备
45        if (device.productId == 1234 && device.vendorId === 2345) {
46          matchDevice = device;
47          break;
48        }
49      }
50    } catch (error) {
51      let errCode = (error as BusinessError).code;
52      let message = (error as BusinessError).message;
53      console.error(`Failed to query device. Code is ${errCode}, message is ${message}`);
54    }
55    if (!matchDevice) {
56      console.error('No match device');
57    }
58    ```
59
602. 绑定相应的设备。
61
62    ```ts
63    import deviceManager from '@ohos.driver.deviceManager';
64    import { BusinessError } from '@ohos.base';
65    import rpc from '@ohos.rpc';
66
67    interface DataType {
68      deviceId : number;
69      remote : rpc.IRemoteObject;
70    }
71
72    let remoteObject : rpc.IRemoteObject | null = null;
73    try {
74      // 12345678为示例deviceId,应用开发时可以通过queryDevices查询到相应设备的deviceId作为入参
75      deviceManager.bindDevice(12345678, (error : BusinessError, data : number) => {
76        console.error('Device is disconnected');
77      }, (error : BusinessError, data : DataType) => {
78        if (error) {
79          console.error(`bindDevice async fail. Code is ${error.code}, message is ${error.message}`);
80          return;
81        }
82      console.info('bindDevice success');
83      remoteObject = data.remote;
84      });
85    } catch (error) {
86      let errCode = (error as BusinessError).code;
87      let message = (error as BusinessError).message;
88      console.error(`bindDevice fail. Code is ${errCode}, message is ${message}`);
89    }
90    if (!remoteObject) {
91      console.error('Bind device failed');
92    }
93    ```
94
953. 绑定成功后使用设备驱动能力。
96
97    ```ts
98    import { BusinessError } from '@ohos.base';
99    import rpc from '@ohos.rpc';
100
101    let option : rpc.MessageOption = new rpc.MessageOption();
102    let data : rpc.MessageSequence = rpc.MessageSequence.create();
103    let reply : rpc.MessageSequence = rpc.MessageSequence.create();
104    data.writeString('hello');
105    let code = 1;
106    // remoteObject应用可以通过绑定设备获取到
107    let remoteObject : rpc.IRemoteObject | null = null;
108    // code和data内容取决于驱动提供的接口
109    if (remoteObject != null) {
110      (remoteObject as rpc.IRemoteObject).sendMessageRequest(code, data, reply, option)
111        .then(() => {
112          console.info('sendMessageRequest finish.');
113        }).catch((error : BusinessError) => {
114          let errCode = (error as BusinessError).code;
115          console.error('sendMessageRequest fail. code:' + errCode);
116        });
117    }
118    ```
119
1204. 设备使用完成,解绑设备。
121
122    ```ts
123    import deviceManager from '@ohos.driver.deviceManager';
124    import { BusinessError } from '@ohos.base';
125
126    try {
127      // 12345678为示例deviceId,应用开发时可以通过queryDevices查询到相应设备的deviceId作为入参
128      deviceManager.unbindDevice(12345678, (error : BusinessError, data : number) => {
129        if (error) {
130          let errCode = (error as BusinessError).code;
131          let message = (error as BusinessError).message;
132          console.error(`unbindDevice async fail. Code is ${errCode}, message is ${message}`);
133          return;
134        }
135        console.info(`unbindDevice success`);
136    });
137    } catch (error) {
138      let errCode = (error as BusinessError).code;
139      let message = (error as BusinessError).message;
140      console.error(`unbindDevice fail. Code is ${errCode}, message is ${message}`);
141    }
142    ```
143