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