Я пытаюсь получить доступ к USB-устройству из апплета в Linux. Я использовал пример кода из javax.usb для перечисления всех устройств. Код работает, когда я запускаю его из Eclipse (в средстве просмотра апплета), но показывает только один USB-концентратор и 0 устройств при использовании в браузере.
У меня был похожий результат с этим кодом до того, как я использовал его в апплете (1 концентратор, 0 устройств), когда разрешения на /dev/bus/usb/*
не были установлены должным образом, поэтому я дал разрешения на чтение / запись всем (в /etc/udev/rules.d/
) просто чтобы быть уверенным, но это все равно ничего не меняет в результатах. ( Редактировать : чтобы уточнить, приложение работало, но результаты апплета не изменились)
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE:="0666", GROUP:="usbusers"
SUBSYSTEM=="usb_device", MODE:="0666", GROUP:="usbusers"
Апплет подписан (и jsr80.jar
, jsr80_ri.jar
и jsr80_linux.jar
также), есть .java.policy, предоставляющая все разрешения моему апплету в моей домашней папке, и все необходимые библиотеки найдены. Код выполняется, он просто не видит никаких USB-устройств (только при запуске из браузера, тот же код работает при запуске из Eclipse)
В html-файле:
<applet code="apples.TheApplet" archive="SignedApplet.jar,jsr80.jar,jsr80_linux.jar,jsr80_ri.jar" width=600 Height=400>
и код Java:
public class TheApplet extends Applet {
public void init() {
System.setSecurityManager(null);
try {
// Access the system USB services, and access to
// the root
// hub. Then traverse through the root hub.
System.out.println( "********\nGoing to try to getUsbServices()");
UsbServices services = UsbHostManager
.getUsbServices();
System.out.println( "********\nSuccess?");
System.out.println( "********\nTry getRootUsbHub()");
UsbHub rootHub = services.getRootUsbHub();
System.out.println( "********\nSuccess?!");
System.out.println( "********\nTry traverse(rootHub)");
traverse(rootHub);
System.out.println( "********\nSuccess.");
} catch (Exception e1) {
System.out.println( "********\n"
+ e1.getMessage());
}
}
public static void traverse(UsbDevice device) {
if (device.isUsbHub()) {
System.out.println( "********\nFound USB Hub, traversing...");
// This is a USB Hub, traverse through the hub.
List attachedDevices = ((UsbHub) device).getAttachedUsbDevices();
System.out.println( "\t"+attachedDevices.size()+" attached devices");
for (int i = 0; i < attachedDevices.size(); i++) {
traverse((UsbDevice) attachedDevices.get(i));
}
} else {
try {
System.out.println( "********\n"
+ "Device:\n\tManufacturerString:\t"
+ device.getManufacturerString());
device.getManufacturerString();
} catch (Exception e) {
e.printStackTrace();
System.out.println( "********\n" + e.getMessage());
}
}
}
}
У кого-нибудь есть идеи, как заставить это работать?
Редактировать
Я добавляю пример вывода при запуске апплета из Eclipse:
...Scan3...
********
Hello!
********
Going to try to getUsbServices()
********
Success?
********
Try getRootUsbHub()
********
Success?!
********
Try traverse(rootHub)
********
Found USB Hub, traversing...
5 attached devices
********
Found USB Hub, traversing...
2 attached devices
********
Found USB Hub, traversing...
1 attached devices
********
Device:
ManufacturerString: HHP
********
Device:
ManufacturerString: Qualcomm Incorporated
********
Found USB Hub, traversing...
1 attached devices
********
Device:
ManufacturerString: Logitech Inc.
********
Found USB Hub, traversing...
0 attached devices
********
Found USB Hub, traversing...
0 attached devices
********
Found USB Hub, traversing...
0 attached devices
********
Success.
И тот же точный код, из браузера:
...Scan3...
********
Hello!
********
Going to try to getUsbServices()
********
Success?
********
Try getRootUsbHub()
********
Success?!
********
Try traverse(rootHub)
********
Found USB Hub, traversing...
0 attached devices
********
Success.
Как видно, в браузере отображается 1 USB-концентратор и 0 устройств.