Macos OS X-如何访问USB打印机

Macos OS X-如何访问USB打印机,macos,printing,usb,iokit,Macos,Printing,Usb,Iokit,我尝试为OSX编写一个应用程序,它可以在连接USB的XPrinterXP-370b上打印条形码。 我使用IOKit库 我可以在我的代码中获取此打印机的设备对象,即io\u service\t设备。然后我创建ioubdebeviceinterface**dev并使用(*dev)->usbdevicepen(dev)打开设备 如何将任何消息发送到此设备?我尝试: IOReturn WriteToDeviceZ(IOUSBDeviceInterface **dev, UInt16 length, UI

我尝试为OSX编写一个应用程序,它可以在连接USB的XPrinterXP-370b上打印条形码。 我使用IOKit库

我可以在我的代码中获取此打印机的设备对象,即
io\u service\t设备。然后我创建
ioubdebeviceinterface**dev并使用
(*dev)->usbdevicepen(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与打印机交互?

大多数USB设备的主协议通常不通过设备请求实现。相反,每个设备通常有一个或多个USB接口,每个接口都有一个或多个端点。您可以通过管道与这些端点通信。在macOS上,您可以使用
CreateInterfaceIterator
枚举设备的接口,以获得
iOnBinterfaceInterface
句柄(或者,如果它是复合/众所周知的设备类型,您可以在IOKit匹配期间直接匹配接口),然后使用
ReadPipe
/
writepe
函数系列读取/写入管道。(有一些变量带有异步和/或TO(超时)后缀,我最常用的是
ReadPipeAsyncTO
/
WritePipeAsyncTO
,因为它们给了您最多的控制权。)

我如何从“iOubDeviceInterface”获得
iOubInInterface
?我尝试一下。但是迭代器没有任何interfaceRefs
IOIBfindInterfaceRequest请求;io_迭代器\u t迭代器;io_服务接口EF;(*dev)->CreateInterfaceIterator(开发、请求和初始化);而((interfaceRef=IOIteratorNext(intIterator))!=0{}
您需要填写请求结构。设置
request.bInterfaceClass=kiousbfinderfacedontcare;request.bInterfaceSubClass=kiousbfinderfacedontcare;request.bInterfaceProtocol=kiousbfinderfacedontcare;request.bAlternateSetting=kiousbfinderfacedontcare为我工作。现在我有了设备接口