OS X - 如何访问 USB 打印机

OS X - how to get access to USB printer

我尝试为 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 returns 错误

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 与打印机交互?

大多数 USB 设备的主要协议通常不是通过设备请求实现的。相反,每个设备通常有一个或多个 USB 接口,每个接口都有一个或多个端点。您通过管道与这些端点通信。在 macOS 上,你用 CreateInterfaceIterator 枚举设备的接口以获得 IOUSBInterfaceInterface 句柄(或者如果它是 composite/well-known 设备类型,你可以在 IOKit 匹配时直接匹配接口),然后 read/write 到具有 ReadPipe/WritePipe 系列函数的管道。 (有 Async and/or TO (timeout) 后缀的变体,我最常使用 ReadPipeAsyncTO/WritePipeAsyncTO 因为它们给你最大的控制权。)