OS X-如何访问USB打印机

时间:2018-08-01 11:46:55

标签: macos printing usb iokit

我尝试编写OS X的应用程序,该应用程序将在与USB连接的Xprinter xp-370b上打印条形码。 我使用IOKit库。

我可以在我的代码中以io_service_t device;的形式获得此打印机的设备对象。然后,我创建IOUSBDeviceInterface **dev;并使用(*dev)->USBDeviceOpen(dev);打开设备。

如何向该设备发送任何消息?我尝试:

IOReturn WriteToDeviceZ(IOUSBDeviceInterface **dev, UInt16 length, UInt8 writeBuffer[])
{
    IOUSBDevRequest request;
    IOReturn kr;
    USBDeviceAddress address;
    kr = (*dev)->GetDeviceAddress(dev, &address);
    if (kr != kIOReturnSuccess)
    {
        printf("No address err 0x%x\n", kr);
        return kr;
    }

    request.bmRequestType = USBmakebmRequestType(kUSBOut, kUSBVendor, kUSBDevice);
    request.bRequest = 0xa0;
    request.wValue = address;
    request.wIndex = 0;
    request.wLength = length;
    request.pData = writeBuffer;

    return (*dev)->DeviceRequest(dev, &request);
}

但是ii返回错误

kr = WriteToDeviceZ(dev, sizeof(array), array);
if (kr != kIOReturnSuccess)
{
    printf("WriteToDevice reset returned err 0x%x\n", kr);
    (*dev)->USBDeviceClose(dev);
    (*dev)->Release(dev);
    return kr;
}

WriteToDevice reset returned err 0xe000404f

也许还有另一种方法可以通过USB与打印机交互?

1 个答案:

答案 0 :(得分:1)

大多数USB设备的主要协议通常不是通过设备请求实现的。相反,每个设备通常具有一个或多个USB接口,每个USB接口具有一个或多个端点。您通过管道与这些端点进行通信。在macOS上,您使用CreateInterfaceIterator枚举设备的接口以获得IOUSBInterfaceInterface的句柄(或者,如果它是复合/知名设备类型,则可以在IOKit匹配期间直接匹配该接口),然后读取/使用ReadPipe / WritePipe系列函数写入管道。 (有些带有Async和/或TO(超时)后缀的变体,我经常使用ReadPipeAsyncTO / WritePipeAsyncTO,因为它们可以为您提供最大的控制权。)