谁能告诉我如何使用Objective-C作为iPhone应用程序对USB设备进行编程?
我想通过iPhone访问USB设备内容
我想使用我的应用程序将我的电脑变成Android配件.因此,与专用硬件不同,这将只是将手机切换到附件模式的PC,从而在与主机硬件相关联的手机上启动一些Java应用程序并创建通信通道.
我在Linux上使用libusb 找到了一个示例代码(加上一些Java Android应用程序).它通过使用标准VID和PID"打开"手机来工作.然后它发送命令打开附件模式,以及模型,版本等元数据.
如果手机支持配件模式,它将断开并重新枚举不同的PID.然后,示例代码检查它是否执行并打开新设备.
但是,我正试图在Windows上运行它.我找到了一些USB库,比如LibUsbDotNet,但它们似乎都要求设备使用WinUSB/libusb驱动程序.我在LibUsbDotNet中使用了一个工具来为我的手机生成一个libusb驱动程序,并将其安装在旧的通用可移动驱动器上.但这意味着我现在无法将手机作为可移动驱动器访问,因此这不是解决方案.
有没有办法(最好是库)可以打开任何基于VID和PID的连接USB设备,然后向它发送一些原始命令?
之后,设备将使用不同的PID重新枚举,我可以使用它来创建自己的WinUSB驱动程序,因此这不是问题.我只需要通过/围绕默认驱动程序注入一些命令来打开附件模式.
(我更喜欢.NET解决方案,但任何Windows都可以,我可以编写自己的互操作包装器)
我试图在RHEL5上作为非root用户与USB设备连接.该设备是一个GPIO接口(其文档可以在http://www.xdimax.com/sub20/sub20.html上找到),它使用libusb-1.0.使用其API打开设备的过程是:
sub_device d;
d = sub_find_devices(0);
sub_handle h = sub_open(d);
Run Code Online (Sandbox Code Playgroud)
当我这样做时,sub_find_devices()调用工作,但在sub_open()调用时,我得到libusb错误-3,这表示我没有权限打开设备进行写入.
我对这个问题进行了一些研究,发现我应该创建一个udev规则.在设备的sysfs节点上使用udevinfo,我得到了:
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
KERNEL=="2-1.2"
SUBSYSTEM=="usb"
SYSFS{configuration}==""
SYSFS{serial}=="15F2"
SYSFS{product}=="SUB-20"
SYSFS{manufacturer}=="XDIMAX"
SYSFS{maxchild}=="0"
SYSFS{version}==" 1.10"
SYSFS{devnum}=="6"
SYSFS{speed}=="12"
SYSFS{bMaxPacketSize0}=="64"
SYSFS{bNumConfigurations}=="1"
SYSFS{bDeviceProtocol}=="00"
SYSFS{bDeviceSubClass}=="00"
SYSFS{bDeviceClass}=="ff"
SYSFS{bcdDevice}=="0001"
SYSFS{idProduct}=="ffc3"
SYSFS{idVendor}=="04d8"
SYSFS{bMaxPower}=="100mA"
SYSFS{bmAttributes}=="80"
SYSFS{bConfigurationValue}=="1"
SYSFS{bNumInterfaces}==" 1"
Run Code Online (Sandbox Code Playgroud)
然后我在文件中创建了以下udev规则/etc/udev/rules.d/991-local.rules:
SYSFS{idVendor}=="04d8", SYSFS{idProduct}=="ffc3", NAME="sub20", GROUP="582", MODE="0660"
Run Code Online (Sandbox Code Playgroud)
582是我的普通用户所属的组的GID.我也尝试了组名称的规则,但它没有用.创建此规则后,将/dev/sub20使用正确的权限创建设备文件,但仅在插入设备时才存在,这使我有理由相信udev规则在正确的设备上匹配.但是,我的代码仍然会出错-3.
对代码进行分析后发现了这个问题:
open("/dev/bus/usb/002/006", O_RDWR) = -1 EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)
/dev/bus/usb...节点上的权限仍然是root:root,所以这可能表明我的udev规则存在问题,尽管我不知道那可能是什么.
如果我尝试进行调用open("/dev/sub20", O_RDWR),我会得到返回值ENXIO (No such device or address),这是udev规则中错误的另一个可能指示器,尽管/dev/sub20文件明确地以某种方式与正确的设备相关联,因为它仅在插入设备时才存在. …
我能够通过Android的USB Host API获得与设备通信的权限.
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
protected void execute(Context ctxt) {
UsbManager manager = (UsbManager) viewer.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
UsbDevice d = null;
for (String s : deviceList.keySet()) {
d = deviceList.get(s);
}
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(ctxt, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
viewer.registerReceiver(mUsbReceiver, filter);
manager.requestPermission(d, mPermissionIntent);
}
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized …Run Code Online (Sandbox Code Playgroud) 我搜索了几个小时但没有用.我已经看到它libusb_detach_kernel_driver在Mac OS X不支持的任何地方,但我无法找到它的补丁或替代品.
libusb_claim_interface 返回: libusb: 0.863377 error [darwin_claim_interface] USBInterfaceOpen: another process has device opened for exclusive access
如何从内核中分离USB设备?
我试图libusb在这种方法中建议使用不带根的Nexus 5 (通过将usb文件描述符从java传输到本机端).
我的应用程序通过权限请求权限UsbManager.requestPermission,然后运行调用libusb_initcreate的本机方法libusb_context.
但libusb_init返回LIBUSB_ERROR_OTHER代码(-99).在挖掘代码后,我明白为什么会发生这种情况.libusb报告'could not find usbfs'因为opendir("/dev/bus/usb")返回0.
也是从adb shell我无法执行ls /dev,奇怪,因为我有权利(在华为U8950-1具有相同的权利,我可以这样做):
drwxr-xr-x root root 2014-09-04 10:26 dev
看起来像下面描述的方法不适用于所有Android设备.有人可以解释原因吗?
我有一个问题是干净地关闭我使用的Linux应用程序libusb(内核不回收接口):
int rc;
rc = libusb_reset_device(handle_);
if (rc < 0) {
cerr << "Error resetting the device: " << libusb_error_name(rc);
}
for (int ifnum = 0; ifnum < 2; ifnum++) {
rc = libusb_release_interface(handle_, ifnum);
if (rc < 0) {
cerr << "Error releasing interface: " << libusb_error_name(rc);
}
if (libusb_kernel_driver_active(handle_, ifnum)) {
cerr << "Reattaching CDC ACM kernel driver.";
rc = libusb_attach_kernel_driver(handle_, ifnum);
if (rc < 0) {
cerr << "Error reattaching CDC ACM kernel driver: " …Run Code Online (Sandbox Code Playgroud) 这不是家庭作业问题,尽管这是一个工作问题。几个月前,我会写一份规范,老板会把它承包出去,钱很紧。所以我正在尝试自己做这件事。
我是一个弱 C 编码器,如果 gcc 吐出一些可以在没有段错误的情况下运行的东西,或者有时根本没有任何东西,我很幸运。不过,我管。Libftdi 已构建,我仔细阅读了它的示例可执行文件/代码和文档。但我还是迷路了。
有谁知道使用 MPSEE 模式并连接到 SPI 设备的软件项目?这里有没有人足够聪明来提供一个例子?我真的可以使用帮助。我不需要把这个放在银盘上递给我,但我什至无法开始。如果我什至能弄清楚如何初始化它并向 FTDI ic 另一侧的芯片发送一个字节,我想我可能会设法解决它。
任何帮助表示赞赏。
我有一个想要实现的 USB 协议,但我对实现它的最佳方法有点迷失。
USB 协议涉及来回交换数据和确认数据包,如下所示:
Device: data
Host: ACK
Host: reply
Device: ACK
Run Code Online (Sandbox Code Playgroud)
但有时,数据包可能会像这样异步进入:
Device: data #1
Device: data #2
Host: ACK #1
...
Run Code Online (Sandbox Code Playgroud)
我想要一个 API,它可以抽象出 USB 的所有细节,让程序只处理实际数据,而不必担心数据包标头或确认数据包或类似的事情。理想情况下,有一个write_to_device函数会阻塞直到设备确认数据包,一个函数read_from_device会阻塞直到收到数据包,还有一个is_data_available函数会立即返回队列上是否有任何数据。
我正在考虑运行一个单独的线程来处理 USB 事件。该线程将处理所有数据封装和确认。
当数据包进入时,处理线程将发送一个 ACK 数据包,然后提取原始数据并将其写入管道。该read_from_device函数(从主线程调用)将简单地从此管道中读取并自然阻塞,直到有数据为止。但是如果我使用这个方案,我将没有一个干净的方法来实现一个is_data_available函数 - 没有办法在不读取数据的情况下检查管道中是否有数据。
像这样的东西:
[ Main thread ][ Processing thread ]
| Read from pipe || |
| || USB packet comes in |
| || Send ACK packet |
| || Extract data |
| || …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 PyUSB 和 libusb 从带有 HID USB 连接的 Tenma 72-7732 万用表读取电压。到目前为止,这是我的代码:
def main():
import usb.core
import usb.util
import usb.backend
import sys
#find device
dev = usb.core.find(idVendor=0x1a86, idProduct=0xe008)
# did you find it?
if dev is None:
raise ValueError('Device not found')
else:
print "Device found"
dev.set_configuration()
endpoint = dev[0][(0,0)][0]
data = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, 0, 100000)
print data
main()
Run Code Online (Sandbox Code Playgroud)
这会找到设备,但是当它尝试读取数据时,会出现超时错误。万用表的文档和支持非常糟糕,所以我无法去那里寻求帮助。如何成功读取设备?
libusb ×10
usb ×7
android ×3
c ×3
android-ndk ×2
linux ×2
permissions ×2
c++ ×1
cocoa-touch ×1
device ×1
driver ×1
iphone ×1
libusb-1.0 ×1
macos ×1
objective-c ×1
python ×1
pyusb ×1
winusb ×1