You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:38:18