0

我已授予对 UsbDevice 的访问权限,获取了他的设备名称 ( /dev/bus/usb/002/002) 并将其传递给执行的进程以使用 USB 设备(更详细的是avrdude )

Process process = Runtime.getRuntime().exec(commandArray);

并得到“权限被拒绝”错误:

W/System.err( 9368): avrdude: ser_open(): can't open device "/dev/bus/usb/002/002": Permission denied
W/System.err( 9368): ioctl("TIOCMGET"): Invalid argument

Avrdude 位于应用程序沙箱 ( /data/data/%package%) 中,因此它不需要 root 即可执行 avrdude(当然)。我相信如果我授予对 UsbDevice android 应用程序进程的访问权限,并且所有子进程(avrdude)都可以访问相应的 USB 设备文件。

有什么想法吗?不希望生根。

4

2 回答 2

2

似乎需要 Android USB 主机 API 才能访问 USB 设备,并且您可能无法像在普通 Linux 系统上所期望的那样直接从本机代码访问设备文件。

鉴于此限制,我认为有几种可能的解决方法。您的 ArduinoDroid 应用程序需要从 Java 读取/写入 USB,所以问题是如何在 avrdude 和 ArduinoDroid 之间传递数据。根据我的经验,一个好的方法是通过网络连接。例如,以下 avrdude 命令将使用 localhost 的 6800 端口对 Arduino 进行编程。

avrdude -v -patmega328p -carduino -Pnet:localhost:6800 -D -Uflash:w:firmware.hex:i

我通过连接到我的串行镜像应用程序并通过蓝牙对 Arduino 进行编程,在 Linux-on-Android 中运行 avrdude 时自己完成了此操作。我已在此演示文稿中解释了此过程。

http://jeffboody.net/sparkfun-lunch-and-learn-20130124.pdf

我的 Serial Mirror 应用程序的源代码也可以在此处获得。

https://github.com/jeffboody/spp-mirror

如果使用“exec”调用 avrdude 不授予网络权限,您可能需要将 avrdude 构建为库,以便它具有与您的应用程序相同的权限。Android 本机代码支持套接字。

我能想到的第二个选项是为 avrdude 提供一个 JNI 接口,以通过 Java 读/写 USB。我认为这会更加困难,因为它可能需要对 avrdude 进行重大更改。

于 2013-06-04T14:51:30.117 回答
1

关于文件描述符,您可以使用 JNI 将其传递给本机。

// 爪哇

私人本机 void NativePassFd(int fd);

// C

JNIEXPORT void JNICALL Java_com_MyName_MyPackage_MyClass_NativePassFd(JNIEnv* env, jobject obj, jint fd);

从本机代码中,您应该能够使用读/写功能。这些应该与 fread/fwrite 行为相同,只是它们将使用 fd 而不是 FILE 指针。重要的是 fd 在另一个进程中是无效的(除非通过特殊机制传递,例如 Android 的 Binder 机制。

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

于 2013-06-06T03:39:43.547 回答