为了从android应用程序支持标签打印,我使用原始tcp连接到支持zpl命令语言的工业标签打印机的9100端口。
似乎android和/或某些标签打印机的tcp/ip实现有一个怪癖,使得数据传输容易出错。。。
我首先遇到了godex zx420i打印机的问题,打印机的显示将表明它正在接收数据,但随后它将什么也不做,并无限期地挂起,直到我重新启动它。解决办法是 SO_SNDBUF
至1024通孔 Socket.setSendBufferSize()
. 这在任何地方都没有记录,但我在godex的android sdk中找到了它(我在这篇博文中详细地描述了整个体验,最后提到了tcp问题。)
有趣的是如果我通过 ncat
在我的电脑里,我不需要做任何特别的事情。使我的应用程序将zpl命令发送到我的电脑(使用 ncat -l 9100 > test.zpl
将它们保存在一个文件中),然后从我的pc向打印机发送zpl命令(使用 ncat printer_ip 9100 < test.zpl
)做得很好。只有android,也不是所有android设备都有这个问题。
(在我沮丧的时候,我甚至在我的电脑上用openjdk编写了相当的java代码,而且效果也不错。)
现在我有一个非常类似的问题,与TSCME240打印机。将zpl命令从我的android应用程序发送到pc,将它们保存在一个文件中,然后将它们发送到打印机,效果很好。但是当android应用程序直接连接到打印机并发送完全相同的命令时,打印机什么也不做。
以下是我在应用程序中使用的java代码:
// 'address' was set to 'new InetSocketAddress(ipAddress, 9100)'
// 'output' refers to a ByteArrayOutputStream
try (Socket socket = new Socket()) {
socket.setSendBufferSize(1024);
socket.setSoTimeout(5000);
socket.connect(address);
output.writeTo(socket.getOutputStream());
}
如果您能为打印机提供任何可能导致损坏行为的帮助,我们将不胜感激。godex zx420i的工作非常好,因为我添加了 socket.setSendBufferSize(1024)
线(虽然这是一个谜,为什么它是必要的),但TSCME240没有做什么。
考虑到ms-windows的tcp/ip实现,或者其他一些 ncat
无论是什么,似乎都能可靠地与任何打印机型号配合使用。
更新
我现在觉得自己很愚蠢,因为在这种情况下,问题毕竟出在我发送的zpl命令中。我超过了“打印位图”命令(^gf)允许的最大大小。我做的测试,我把命令发送到我的电脑,然后到打印机是一个较小的标签。
然而,我把这个问题留着讨论,并认为它没有解决,因为我仍然不明白为什么有必要设置 SO_SNDBUF
为一些打印机工作正常1024,并希望了解这一点(在这种情况下,这是肯定的,而不是位图大小或任何其他;我从android和我的pc上发送了完全相同的字节。这次我只是因为之前的经历而下结论。)
暂无答案!
目前还没有任何答案,快来回答吧!