Android Kotlin开发:BLE热敏打印机打印特征及写入内容咨询
问题:Kotlin开发Android应用,BLE热敏打印机打印内容的特征选择与写入格式
我正在用Kotlin开发Android应用,需要通过BLE(低功耗蓝牙)协议控制热敏打印机打印小票。已经成功连接设备并读取到其服务与特征,但不清楚应选用哪个特征进行打印,也不知道需要向该特征写入何种内容。
以下是发现的打印机服务与特征:
Service UUID: 00001800-0000-1000-8000-00805f9b34fb Characteristic UUID: 00002a00-0000-1000-8000-00805f9b34fb Service UUID: 0000ae30-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae01-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae02-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae03-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae04-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae05-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae10-0000-1000-8000-00805f9b34fb Service UUID: 0000ae3a-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae3b-0000-1000-8000-00805f9b34fb Characteristic UUID: 0000ae3c-0000-1000-8000-00805f9b34fb
解决方案
1. 特征选择
首先排除标准服务:00001800-0000-1000-8000-00805f9b34fb是BLE通用访问服务,对应的00002a00-xxxx是设备名称特征,和打印无关。
剩下的0000ae30-xxxx与0000ae3a-xxxx是厂商自定义服务,按以下逻辑筛选:
- 先检查特征的属性,打印数据需往支持
WRITE或WRITE_NO_RESPONSE的特征发送,可通过characteristic.properties判断。 - 从UUID命名规律看,
0000ae01-xxxx至0000ae05-xxxx更可能是数据/控制通道,0000ae10-xxxx大概率是状态查询类特征;0000ae3b/3c属于另一组自定义特征。 - 优先测试
0000ae01-xxxx或0000ae02-xxxx,这类UUID是多数BLE热敏打印机的打印特征首选。
2. 写入内容格式
热敏打印机普遍遵循ESC/POS指令集,需将文本转换为符合指令集的字节数组发送:
- 基础文本:转成打印机支持的编码(多为GBK、GB2312,部分新设备支持UTF-8)字节数组,换行需追加
0x0A。 - 格式控制:通过ESC指令实现加粗、对齐、字体大小调整,例如:
- 开启加粗:
byteArrayOf(0x1B, 0x45, 0x01) - 关闭加粗:
byteArrayOf(0x1B, 0x45, 0x00) - 居中对齐:
byteArrayOf(0x1B, 0x61, 0x01)
- 开启加粗:
- 打印切纸:发送
byteArrayOf(0x1B, 0x6D)(部分设备用0x1B, 0x4A, 0x00)
3. Kotlin代码示例
// 假设已获取到目标打印特征printCharacteristic val printData = buildPrintData() bleGatt?.writeCharacteristic(printCharacteristic, printData, BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE) private fun buildPrintData(): ByteArray { val content = StringBuilder().apply { append("订单小票\n") append("----------------\n") append("商品:Android开发实战\n") append("价格:¥129\n") append("时间:${System.currentTimeMillis()}\n") append("----------------\n") append("谢谢惠顾\n\n") } // 转GBK编码,追加切纸指令 val textBytes = content.toString().toByteArray(charset("GBK")) val cutCmd = byteArrayOf(0x1B, 0x6D) return textBytes + cutCmd }
4. 额外提示
- 若写入后无反应,可先发送初始化指令
byteArrayOf(0x1B, 0x40)重置打印机状态。 - 尝试调整BLE MTU大小(默认23),部分打印机支持更大MTU,减少分包次数提升打印效率。
- 若特征写入返回失败,检查是否已开启BLE通知(部分打印机需要绑定通知特征才能接收数据)。
内容的提问来源于stack exchange,提问作者Valko
相关产品推荐
相关产品推荐

