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