Skip to content

Latest commit

 

History

History
425 lines (349 loc) · 12.3 KB

protocol.md

File metadata and controls

425 lines (349 loc) · 12.3 KB

底层协议

传输协议 双向

  • 包头 USB

    • 命令总长度 < 192
      1e <1 byte 命令总长度> [命令...]
      
    • 命令总长度 >= 192
      1e <2 bytes 命令总长度> [命令...]
      

    破案了, 固件没有清零 USB 发送缓冲区, 所以会读到脏数据...

  • 包头 BLE

    [命令...]
    
  • 命令 USB && BLE

    命令按照顺序依次打包/解析

    • 数据长度 < 192
      <1 byte 命令组> <1 byte 命令类型> <1 byte 数据长度> [数据...] [1 byte 校验和 初始=0]
      
    • 数据长度 >= 192
      <1 byte 命令组> <1 byte 命令类型> <2 bytes 数据长度> [数据...] [1 byte 校验和 初始=0]
      
    • 校验和
      • 如果未启用校验, 则为 0x88
      • 否则使用这个函数计算 命令[1..命令长度] 的校验和

命令列表 - 命令组 0x1f

  • 0x2_ 打印命令 (特殊命令)

    • 0x20 未知打印命令
    • 0x21 未知打印命令
    • 0x22 未知打印命令
    • 0x23 (X)
    • 0x24 (0x1f 0x24 0x00 cksum 打印机进纸后, 打印一行空白内容后出纸)
    • 0x25 (X)
    • 0x26 (X)
    • 0x27 打印标签宽度 待测试
    • 0x28 (0x1f 0x28 0x00 cksum 打印机进纸后, 打印一行空白内容后出纸)
    • 0x29 未知打印命令
    • 0x2a 打印 N 点的一行
    • 0x2b 打印有前导空白的一行
    • 0x2c 未知打印命令
    • 0x2d 未知打印命令
    • 0x2e 重复行
    • 0x2f (X)
  • 0x3_

    • 0x30 (X)
    • 0x31 (X)
    • 0x32 (X)
    • 0x33 (X)
    • 0x34 (X)
    • 0x35 (X)
    • 0x36 (X)
    • 0x37 (X)
    • 0x38 (X)
    • 0x39 (X)
    • 0x3a (X)
    • 0x3b (X)
    • 0x3c (X)
    • 0x3d 未知打印命令
    • 0x3e (X)
    • 0x3f (X)
  • 0x4_ 打印设置

    • 0x40 (X)
    • 0x41 (X)
    • 0x42 打印纸类型
    • 0x43 打印浓度
    • 0x44 打印速度
    • 0x45 打印纸间隔
    • 0x46 (X)
    • 0x47 # TODO 电机模式
    • 0x48 # TODO 自动关机时间(分钟)
    • 0x49 # TODO
    • 0x4a (X)
    • 0x4b (X)
    • 0x4c (X)
    • 0x4d # TODO
    • 0x4e (X)
    • 0x4f (X)
  • 0x5_

    • 0x50 (X)
    • 0x51 (X)
    • 0x52 # TODO 支持的纸张类型
    • 0x53 (X)
    • 0x54 (X)
    • 0x55 (X)
    • 0x56 (X)
    • 0x57 # TODO 支持的电机模式
    • 0x58 (X)
    • 0x59 # TODO 支持的语言
    • 0x5a (X)
    • 0x5b # TODO
    • 0x5c (X)
    • 0x5d (X)
    • 0x5e (X)
    • 0x5f (X)
  • 0x7_ 设备信息

    • 0x70 # TODO 打印机状态
    • 0x71 # TODO DPI
    • 0x72 # TODO 打印宽度, 出纸宽度
    • 0x73 # TODO 打印统计
    • 0x74 (X)
    • 0x75 制造商
    • 0x76 (X)
    • 0x77 # TODO
    • 0x78 # FIXME
    • 0x79 设备名
    • 0x7a # TODO 硬件版本
    • 0x7b # TODO
    • 0x7c 软件版本
    • 0x7d # TODO 蓝牙mac地址
    • 0x7e # TODO 打印机会重启
    • 0x7f # TODO

TODO

  • 0x52 # TODO SupportedGapTypes 支持的纸张类型 02, 03, 04, 00

  • 0x57 # TODO SupportedMotorModes 支持的电机模式 0c

  • 0x59 # TODO SupportedLanguages 支持的语言 61, 01

  • 0x5b # TODO 00, 00

  • 连接方式 也许是打印机类型 (# FIXME 任何参数都返回 0x02 0x43) 主机->设备 0x78

    • 参数 BLE
      • [0] 0x06 (i8)
    • 参数 USB
      • [0] 0x10 (i8)
  • 0x70 # TODO 打印机状态 00, 01, 02, 00, 00, 35, 01, 10

  • 0x73 # TODO 打印统计 00, 01, b6, 4b, 00, 01, 76, ce, 00, 00, 71, 58, 00, 00, 00, de

    • workLines
    • printLines
    • nullLines
    • printPages
  • 0x77 # TODO 32, 00, 00, 00, 00, 88, 00 32, 04, 00, 00, 20, 88, 00

    • 0x32 = 0b00110010
  • 0x7a # TODO 硬件版本 0x26, 0x01, 0x04, 0x01, 0x04

  • 0x7d # TODO 蓝牙mac地址 10, 60, 6e, 41, 37, c4, 37, 14, 60, 6e, 41, 37, c4, 37 60:6e:41:37:c4:37

  • 0x71 # TODO DPI (300) 01, 2c

  • 0x72 # TODO (0x0240=打印宽度576px, 0x023a=出纸宽度57.0mm) 02, 40, 02, 3a, 00, 00, 00, 00, 00

  • 0x7b # TODO 32

  • 0x7e # TODO 打印机会重启

  • 0x7f # TODO 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00

电池数量, hardwareFlags, softwareFlags

  • (# FIXME) 主机->设备 0x84
    • 无参数
byte[] byteArray = dataPackage.toByteArray(); // 0x84
if (byteArray.length >= 25) {
  this.printer_param_2.batteryCount = byteArray[23] & 255;
} else {
  this.printer_param_2.batteryCount = 2;
}
this.printer_param_2.hardwareFlags = dataPackageReader.readInt();
if (dataPackageReader.getRemainingLength() >= 4) {
  this.printer_param_2.softwareFlags = dataPackageReader.readInt();
} else {
  this.printer_param_2.softwareFlags = 1 | (this.printer_param_2.hardwareFlags & 16);
}

peripheralFlags

  • (# FIXME) 读取 peripheralFlags 主机->设备 0x83
    • 无参数
  • (# FIXME) peripheralFlags 设备->主机 0x83
    • 如果数据长度 > 1 且 [0] = 0x01:
      • [1] peripheralFlags
    • 否则
      • [0] peripheralFlags

打印头温度/电池电压和充电状态

  • (# FIXME) 读取打印头温度/电池电压和充电状态 主机->设备 0x88
    • 参数 读取打印头温度
      • [0] 0x01
    • 参数 读取电池电压和充电状态
      • [0] 0x02
  • (# FIXME) 打印头温度 设备->主机 0x88
    • [0] 0x01
    • [2:1] ((short) (((short) (((short) (0 | (readBytes[1] & 255))) << 8)) | (readBytes[2] & 255))) * 0.1d
  • (# FIXME) 电池电压和充电状态 设备->主机 0x88
    • [0] 0x02
    • [1..]
      if (readBytes.length > 10) {
        this.printer_param_2.chargeStatus = readBytes[10] & 255;
      }
      if (readBytes.length > 8) {
        this.printer_param_2.batteryVoltage = (((readBytes[7] & 255) << 8) + (readBytes[8] & 255)) * 0.01d;
      }

0x9e 未知

  • (# FIXME) 主机->设备 0x9e

芯片ID/生产日期/升级CRC/stackHead, stackTail, heapHead, heapTail, maxStack, heapUnused, heapMinUnused

  • (# FIXME) 主机->设备 0x9f
    • 参数 读取芯片ID
      • [0] 0x0a
    • 参数 读取生产日期
      • [0] 0x11
    • 参数 读取升级CRC
      • [0] 0x29
    • 参数 读取 stackHead, stackTail, heapHead, heapTail, maxStack, heapUnused, heapMinUnused
      • [0] 0x61 需要进一步确定

激活 > 0x80 命令

  • (# FIXME) 主机->设备 0x80
    • 发送 > 0x80 的命令前, 需要发送这个命令
    • 参数
      • [0] 0x7f
  • (# FIXME) 设备->主机 0x80
    • [0] 0x7f

设备信息

设备名

  • (已验证) 读取设备名 主机->设备 0x79
    • 无参数
  • (已验证) 设备名 设备->主机 0x79
    • [..]0x00 结尾的设备名 型号-序列号 (str)

软件版本

  • (已验证) 读取软件版本 主机->设备 0x7c
    • 无参数
  • (已验证) 软件版本 设备->主机 0x7c
    • [..]0x00 结尾的软件版本 x.y yyyymmdd

制造商

  • (已验证) 读取制造商 主机->设备 0x75
    • 无参数
  • (已验证) 制造商 设备->主机 0x75
    • [..]0x00 结尾的制造商名 (str)
      • gbk / gb2312 编码

其他

  • 读取信息 主机->设备 0x75
    • (已验证) 无参数 制造商
    • 参数 系列 # FIXME
      • [0] 0x53
    • 参数 内部型号 # FIXME
      • [0] 0x44
  • (已验证) 制造商 设备->主机 0x75
    • [..]0x00 结尾的制造商名 (str)
      • gbk / gb2312 编码
  • 系列 设备->主机 0x75 # FIXME
    • [..]0x00 结尾的系列名 (str)
  • 内部型号 设备->主机 0x75 # FIXME
    • [..]0x00 结尾的内部型号名 (str)

打印设置

打印浓度

  • (已验证) 设置打印浓度 主机->设备 0x43
    • 参数
      • [0] 要设置的浓度值 (i8)
        • 0x00 最淡 1
        • ...
        • 0x03 较淡 4
        • ...
        • 0x05 正常 6
        • ...
        • 0x09 较浓 10
        • ...
        • 0x0e 最浓 15
  • (已验证) 读取打印浓度 主机->设备 0x43
    • 无参数
  • (已验证) 打印浓度 设备->主机 0x43
    • [0] 打印浓度
      • 0x00 最淡 1
      • ...
      • 0x03 较淡 4
      • ...
      • 0x05 正常 6
      • ...
      • 0x09 较浓 10
      • ...
      • 0x0e 最浓 15

打印速度

  • (已验证) 设置打印速度 主机->设备 0x44
    • 参数
      • [0] 要设置的打印速度值 (i8)
        • 0x00 最慢 1
        • 0x01 较慢 2
        • 0x02 正常 3
        • 0x03 较快 4
        • 0x04 最快 5
  • (已验证) 读取打印速度 主机->设备 0x44
    • 无参数
  • (已验证) 打印速度 设备->主机 0x44
    • [0] 打印速度
      • 0x00 最慢 1
      • 0x01 较慢 2
      • 0x02 正常 3
      • 0x03 较快 4
      • 0x04 最快 5

打印纸类型

  • (已验证) 设置打印纸类型 主机->设备 0x42
    • 参数
      • [0] 要设置的打印纸类型 (i8)
        • 0x00 Ticket 小票纸
        • 0x02 Adhesive 不干胶
        • 0x03 CardPaper 卡纸
        • 0x04 Transparent 透明贴
  • (已验证) 读取打印纸类型 主机->设备 0x42
    • 无参数
  • (已验证) 打印纸类型 设备->主机 0x42
    • [0]
      • 0x00 Ticket 小票纸
      • 0x02 Adhesive 不干胶
      • 0x03 CardPaper 卡纸
      • 0x04 Transparent 透明贴

打印纸间隔

  • (已验证) 设置打印纸间隔 主机->设备 0x45
    • 参数
      • [0] / [1:0] / [2:0] 要设置的打印纸间隔(0.01 mm)
        • 最小值 50 (0.5 mm)
  • (已验证) 读取打印纸间隔 主机->设备 0x45
    • 无参数
  • (已验证) 打印纸间隔 设备->主机 0x45
    • [0] / [1:0] / [2:0] 打印纸间隔(0.01 mm)

打印标签宽度

  • 设置打印标签宽度 主机->设备 0x27
    • 参数
      • [0] 要设置的打印标签宽度 (打印点数+7)/8

        设置打印标签的宽度, 取值为 (打印点数+7)/8。因为打印机打印分辨率为 8 个 点每毫米, 因此取值其实为打印标签的宽度毫米数。 DT20 和 DP20 系列打印机的有效打印最大宽度均为 48 毫米。

其他

  • 电机模式 主机->设备 0x47

    • 参数
      • [0] 未知 (i8) # TODO 00
  • 0x48 # TODO 自动关机时间(分钟) 00

  • 0x49 # TODO 61, 61, 10

  • 0x4d # TODO 01, 02, 04, 00

打印命令

  • 0x1b 0x40 初始化打印参数

    初始化打印参数到默认值, 开始打印一张标签的第一个命令。

  • 0x1b 0x4a n 走 N(0~255) 个空行

  • 0x1f 0x2a nL nH [...] 打印 N 打印 N 点的一行, [...]为需要打印的数据, 其字节数为(n+7)/ 8。nL nH 是用两个

    字节表示的点数, 低字节在前, 高字节在后。 打印数据按照从左到右的顺序排列, 一个比特位表示一个打印点, 比特位 1 表示需 要打印的点, 0 表示不需要打印的点, 靠左的点在一个字节的较高位。 如果指定的点数超过了标签的宽度, 则超出的打印内容将被忽略;如果指定的点数 不足标签的宽度, 则默认缺少的数据为 0, 即为不需要打印的内容。

  • 0x1f 0x2b m n [...] 打印有前导空白的一行

    打印有前导空白的一行, m 为前导零的字节数(0 ~ 191), n 为打印数据的字节数 (0 ~ 191), [...]为需要打印的数据, 其字节数由 n 指定。 打印数据按照从左到右的顺序排列, 一个比特位表示一个打印点, 比特位 1 表示需 要打印的点, 0 表示不需要打印的点, 靠左的点在一个字节的较高位。 如果指定的前导零点数(m * 8) 加打印数据点数 (n * 8)超过了标签的宽度, 则超 出的打印内容将被忽略;如果指定的点数不足标签的宽度, 则默认缺少的数据为 0, 即 为不需要打印的内容。 本打印命令为 1F 2A 打印命令的数据压缩型命令, 对于一行打印数据有较多前导空 白(前导零, 即无需打印内容)的情况, 使用本命令能有效地压缩打印数据量。

  • 0x1f 0x2e n 重复行

    打印和上一行一样内容的重复行。N 为重复行数-1, 比方说重复行数为 2, 则 N 的 取值为 1; 重复行数为 192, 则 N 的取值为 191, 类推。 注意: N 的取值要小于 192, 如果重复行数大于 192, 则需要拆分成多条打印重复 行命令。比方说如果实际重复行数为 256, 则需要拆分成下面两条打印重复行命令: 1F 2E BF 1F 2E 3F

  • 0x0c 定位到下一纸张边界

    定位到下一张标签的边界, 结束一张标签的打印。