我正在使用蓝牙ESC / POS打印机从Android设备打印发票。发票有两部分:
使用
创建蓝牙套接字bluetoothSocket = printer.createRfcommSocketToServiceRecord(uuid);
bluetoothSocket.connect();
并使用
打开输出流if(bluetoothSocket.isConnected()) outputStream = bluetoothSocket.getOutputStream();
我通过两个步骤将发票传递给输出流(首先是发票内容字符串,然后是QR位图 - 两个对象都在被调用的方法内转换为字节数组)
outputStream.write(data);
其中data
为byte[]
。在打印之前和之后,我打电话,以防万一,发送命令进行初始化的重置方法。
打印部分如下
Bitmap bitmapQR = QRgenerator.generate();
BluetoothPrinter usersPrinter = new Printer();
usersPrinter.findPrinter();
usersPrinter.connectPrinter(); // init is sent
usersPrinter.sendDataText(invoiceString, EscPosCommands.ALIGN_LEFT); // print invoice string
usersPrinter.sendDataBitImage(bitmapQR); // print QR code
usersPrinter.resetPrinter(); // init is sent once again
//usersPrinter.disconnectPrinter(); // problematic
断开打印机连接的问题方法是
if(bluetoothSocket.isConnected()) {
outputStream.close();
bluetoothSocket.close();
}
如何关闭Android设备和蓝牙之间的连接 打印机,以便打印过程成功完成,打印机将准备好不间断地打印新发票?
我在应用程序运行时已经连接了蓝牙套接字。在那之后我改变了程序,以便最后不打印QR码 - 首先打印一些文本,然后是位图,然后再打印一些文本。在这种组合中,打印与打印机之间没有任何延迟。
这让我想知道打印机是否保持光栅位图像模式。我再次计算了一切,命令有效。
用于打印位图的十六进制命令是0x1D 0x76 0x30 m xL xH yL yH d1...dk
。如果用于尺寸为255x255 px的位图,则十六进制字节数组命令为
0x1D 0x76 0x30 0x00 0x20 0x00 0xFF 0x00 bitmap[8160]
其中bitmap[8160]
是一系列位图字节,长度为8160,等于0x20 * 0xFF。
然而,当打印完成后,init命令被发送到打印机,因此打印机应该重置。或者是吗?
我注意到的另一件事是换行。如果在每个印刷部件P之后发送它们,如P1,进料,P2,进料,P3,进料......结果看起来更像P1,P2,P3,进料,进料,进料。为什么会这样?