我正在尝试通过蓝牙使用 ESC/POS 设置通信。我正确获取蓝牙热敏打印机,并且插座指示已连接。
但是,当我传递以下命令(只是想喂食)时,什么也没有发生。事实上,我尝试发送的任何命令都没有任何反应。
private fun getDeviceByAddress(address: String): BluetoothDevice? {
return bluetoothManager.adapter.bondedDevices.find { it.address == address }
}
suspend fun feed(printer: Printer, lines: Int = 1) {
getDeviceByAddress(printer.address)?.let { device ->
device.createRfcommSocketToServiceRecord(SPP_UUID)
.let { socket ->
try {
socket.connect()
socket.outputStream.write(byteArrayOf(0x1B, 0x40))
socket.outputStream.write(byteArrayOf(0x1B, 0x64, lines.toByte()))
socket.outputStream.flush()
} catch (e: Exception) {
e.printStackTrace()
} finally {
withTimeout(100) {
socket.close()
}
}
}
}
}
可能出了什么问题?我也不知道如何验证字节是否已写入打印机。
(我知道有一个针对该特定品牌的 SDK,但我正在尝试严格通过 ESC/POS 执行此操作)
根据你在问题中所写的内容,操作可能与你提供的源代码一致。
连接后发送的第一个 ESC@(=0x1B, 0x40) 会重置打印机,因此之前发送的所有数据都将被清除。
下一个 ESCd(=0x1B, 0x64,lines.toByte()) 命令然后将指定的行数送入纸张。
如果您想使用问题中提供的 feed() 函数打印之前发送到打印机的数据然后送纸,则不应发送 ESC@。