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