Device filter
WebUSB requestDevice method requires a filters option to select which devices to show in the picker.
Tango extended the filter concept to select which USB interface is used for communication with the ADB daemon.
Filters in WebUSB API
WebUSB defines a USBDeviceFilter interface to be used in requestDevice method. It has the following fields:
interface USBDeviceFilter {
vendorId?: number | undefined;
productId?: number | undefined;
classCode?: number | undefined;
subclassCode?: number | undefined;
protocolCode?: number | undefined;
serialNumber?: string | undefined;
}
Some fields must be specified in pairs to be valid:
- When
productIdis specified,vendorIdmust also be specified. - When
protocolCodeis specified,subclassCodemust also be specified. - When
subclassCodeis specified,classCodemust also be specified.
If a filter has multiple fields, the device must match all fields to be included. For example, this filter only allows a specific manufacturer and model pair:
const device: USBDevice = await navigator.usb.requestDevice({
filters: [
{
vendorId: 0x18d1,
productId: 0x4ee2,
},
],
});
filters is an array, so multiple filters can be specified. If any filter matches, the device will be included. For example, to allow multiple manufacturers/models:
const device: USBDevice = await navigator.usb.requestDevice({
filters: [
{
vendorId: 0x18d1,
productId: 0x4ee2,
},
{
vendorId: 0x04e8,
productId: 0x6860,
},
],
});
Filters in Tango
Because we need to know which interface to use for communication with ADB daemon, the classCode, subclassCode, and protocolCode fields are required. Usually they are 0xFF, 0x42, and 0x01 respectively, but can be different if your device has a different configuration.
interface AdbDeviceFilter {
classCode: number;
subclassCode: number;
protocolCode: number;
vendorId?: number | undefined;
productId?: number | undefined;
serialNumber?: string | undefined;
}
The ADB_DEFAULT_DEVICE_FILTER constant contains the above default values. It can be merged into your filter object:
- JavaScript
- TypeScript
import { ADB_DEFAULT_DEVICE_FILTER } from "@yume-chan/adb-daemon-webusb";
const filters = [
{
...ADB_DEFAULT_DEVICE_FILTER,
vendorId: 0x18d1,
productId: 0x4ee2,
},
];
import { type AdbDeviceFilter, ADB_DEFAULT_DEVICE_FILTER } from "@yume-chan/adb-daemon-webusb";
const filters: AdbDeviceFilter[] = [
{
...ADB_DEFAULT_DEVICE_FILTER,
vendorId: 0x18d1,
productId: 0x4ee2,
},
];
In next version, ADB_DEFAULT_DEVICE_FILTER will be automatically merged into the specified filters, so you don't need to do it manually.
The AdbDeviceFilter type will be removed, and the filters option will use USBDeviceFilter type directly (all fields are optional).
Empty filters array will be treated as [ADB_DEFAULT_DEVICE_FILTER], so undefined, [], [{}] and [ADB_DEFAULT_INTERFACE_FILTER] will all have the same effect.