从 java 应用程序打印到 TSC 打印机
Printing to TSC printer from java application
我正在开发一个 java 应用程序(它将 运行 在 linux 桌面上)使用 TSC TTP-244 Pro 打印机打印运输标签。本打印机支持 TSPL2 命令。
我正在使用 USB 连接并开始使用 usb4java 高级 API 编写一些简单的测试以便与这台打印机通信。我能够成功查询打印机 status/state <ESC>?!
或 <ESC>?S
(<ESC>
这里是 ASCII 27)没有任何问题但无法发出 PRINT
命令.
下面是我的代码。
@Test
public void printTest() throws UsbException
{
final UsbServices services = UsbHostManager.getUsbServices();
UsbDevice printerUsbDevice = findDevice(services.getRootUsbHub(), 0x1234, 0x1734);
UsbConfiguration configuration = device.getActiveUsbConfiguration();
UsbInterface iface = configuration.getUsbInterface((byte) 1);
iface.claim();
try
{
UsbEndpoint inEndpoint = iface.getUsbEndpoint(0x01);
UsbPipe pipe = inEndpoint.getUsbPipe();
UsbEndpoint outEndpoint = iface.getUsbEndpoint(0x82);
UsbPipe pipe2 = outEndpoint.getUsbPipe();
pipe2.open();
pipe.open();
pipe.syncSubmit(27 + "!?".getBytes("US-ASCII"));
pipe.close();
pipe2.open();
byte[] statusResponse = pipe2.syncSubmit(new byte[1]);
pipe2.close();
System.out.println(new String(statusResponse, "US-ASCII")); // Here status got is "00" if ok otherwise getting error code
pipe.open();
pipe.syncSubmit("SIZE 57 mm,37 mm");
pipe.syncSubmit("GAP 3 mm,0 mm");
pipe.syncSubmit("DIRECTION 1");
pipe.syncSubmit("CLS");
pipe.syncSubmit("TEXT 10,10 "3",0,1,1, "Test printing");
pipe.syncSubmit("PRINT 1");
pipe.close();
// at this pint of time, printer is not printing anything instead just idle
}
finally
{
iface.release();
}
}
private UsbDevice findDevice(UsbHub hub, short vendorId, short productId)
{
for (UsbDevice device : (List<UsbDevice>) hub.getAttachedUsbDevices())
{
UsbDeviceDescriptor desc = device.getUsbDeviceDescriptor();
if (desc.idVendor() == vendorId && desc.idProduct() == productId) return device;
if (device.isUsbHub())
{
device = findDevice((UsbHub) device, vendorId, productId);
if (device != null) return device;
}
}
return null;
}
我的 USB 通信是否正确?
与 TSC 打印机的 USB 通信是否可以在不安装任何打印机驱动程序的情况下工作(在 linux 上)?
是的,您的沟通是正确的。
是的,linux 上的 USB 通信可以直接工作,无需驱动程序。
如果打印机不接受某些命令,请仔细检查该命令,也许应该有一些控制和,或者您错过了什么?研究这个命令应该如何构造。
我做过一个用串口和打印机通信的项目,命令的细节很重要。状态命令可以没有控制和并且非常简单,这就是它工作的原因out-of-the-box,但是对于更复杂的命令,您需要阅读文档和调试。
也有可能打印机使用不同的 USB 端点进行 "status" 以外的通信。
我正在开发一个 java 应用程序(它将 运行 在 linux 桌面上)使用 TSC TTP-244 Pro 打印机打印运输标签。本打印机支持 TSPL2 命令。
我正在使用 USB 连接并开始使用 usb4java 高级 API 编写一些简单的测试以便与这台打印机通信。我能够成功查询打印机 status/state <ESC>?!
或 <ESC>?S
(<ESC>
这里是 ASCII 27)没有任何问题但无法发出 PRINT
命令.
下面是我的代码。
@Test
public void printTest() throws UsbException
{
final UsbServices services = UsbHostManager.getUsbServices();
UsbDevice printerUsbDevice = findDevice(services.getRootUsbHub(), 0x1234, 0x1734);
UsbConfiguration configuration = device.getActiveUsbConfiguration();
UsbInterface iface = configuration.getUsbInterface((byte) 1);
iface.claim();
try
{
UsbEndpoint inEndpoint = iface.getUsbEndpoint(0x01);
UsbPipe pipe = inEndpoint.getUsbPipe();
UsbEndpoint outEndpoint = iface.getUsbEndpoint(0x82);
UsbPipe pipe2 = outEndpoint.getUsbPipe();
pipe2.open();
pipe.open();
pipe.syncSubmit(27 + "!?".getBytes("US-ASCII"));
pipe.close();
pipe2.open();
byte[] statusResponse = pipe2.syncSubmit(new byte[1]);
pipe2.close();
System.out.println(new String(statusResponse, "US-ASCII")); // Here status got is "00" if ok otherwise getting error code
pipe.open();
pipe.syncSubmit("SIZE 57 mm,37 mm");
pipe.syncSubmit("GAP 3 mm,0 mm");
pipe.syncSubmit("DIRECTION 1");
pipe.syncSubmit("CLS");
pipe.syncSubmit("TEXT 10,10 "3",0,1,1, "Test printing");
pipe.syncSubmit("PRINT 1");
pipe.close();
// at this pint of time, printer is not printing anything instead just idle
}
finally
{
iface.release();
}
}
private UsbDevice findDevice(UsbHub hub, short vendorId, short productId)
{
for (UsbDevice device : (List<UsbDevice>) hub.getAttachedUsbDevices())
{
UsbDeviceDescriptor desc = device.getUsbDeviceDescriptor();
if (desc.idVendor() == vendorId && desc.idProduct() == productId) return device;
if (device.isUsbHub())
{
device = findDevice((UsbHub) device, vendorId, productId);
if (device != null) return device;
}
}
return null;
}
我的 USB 通信是否正确?
与 TSC 打印机的 USB 通信是否可以在不安装任何打印机驱动程序的情况下工作(在 linux 上)?
是的,您的沟通是正确的。
是的,linux 上的 USB 通信可以直接工作,无需驱动程序。
如果打印机不接受某些命令,请仔细检查该命令,也许应该有一些控制和,或者您错过了什么?研究这个命令应该如何构造。
我做过一个用串口和打印机通信的项目,命令的细节很重要。状态命令可以没有控制和并且非常简单,这就是它工作的原因out-of-the-box,但是对于更复杂的命令,您需要阅读文档和调试。
也有可能打印机使用不同的 USB 端点进行 "status" 以外的通信。