Phomemo-tools
这个软件包旨在提供工具,使用Linux系统通过Phomemo M02、M110、M120和M220热敏打印机打印图片。
此处所有信息均通过嗅探Android应用程序发出的蓝牙数据包进行反向工程获得。
可以在phomemo-tools RPM找到python3-pybluez和phomemo-tools CUPS驱动程序。
1. 使用方法
1.1. 蓝牙
- 连接
$ bluetoothctl devices
Device DC:0D:30:90:23:C7 Mr.in_M02
$ bluetoothctl pair DC:0D:30:90:23:C7
Attempting to pair with DC:0D:30:90:23:C7
[CHG] Device DC:0D:30:90:23:C7 Connected: yes
[CHG] Device DC:0D:30:90:23:C7 Bonded: yes
[CHG] Device DC:0D:30:90:23:C7 ServicesResolved: yes
[CHG] Device DC:0D:30:90:23:C7 Paired: yes
Pairing successful
$ sudo rfcomm connect 0 DC:0D:30:90:23:C7
Connected /dev/rfcomm0 to DC:0D:30:90:23:C7 on channel 1
Press CTRL-C for hangup
- 发送图片到打印机(Python脚本目前仅适用于M02打印机):
tools/phomemo-filter.py my_picture.png > /dev/rfcomm0
1.2. USB
-
插入USB打印机线缆
-
检查打印机是否存在:
$ lsusb
...
Bus 003 Device 013: ID 0493:b002 MAG Technology Co., Ltd
...
您可以在dmesg和/dev中看到串行端口:
$ dmesg
...
usb 3-3.7.2: new full-speed USB device number 13 using xhci_hcd
usb 3-3.7.2: New USB device found, idVendor=0493, idProduct=b002, bcdDevice= 3.00
usb 3-3.7.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-3.7.2: Product: USB Virtual COM
usb 3-3.7.2: Manufacturer: Nuvoton
usb 3-3.7.2: SerialNumber: A02014090305
cdc_acm 3-3.7.2:1.0: ttyACM0: USB ACM device
usblp 3-3.7.2:1.2: usblp0: USB Bidirectional printer dev 13 if 2 alt 0 proto 2 vid 0x0493 pid 0xB002
$ ls -lrt /dev
...
drwxr-xr-x. 2 root root 100 Dec 5 17:44 usb
crw-rw----. 1 root dialout 166, 0 Dec 5 17:44 ttyACM0
...
$ ls -lrt /dev/usb
total 0
crw-------. 1 root root 180, 96 Dec 5 16:46 hiddev0
crw-------. 1 root root 180, 97 Dec 5 16:46 hiddev1
crw-rw----. 1 root lp 180, 0 Dec 5 17:44 lp0
- 发送图片到打印机(Python脚本目前仅适用于M02打印机):
您需要是root用户或在lp组中
# tools/phomemo-filter.py my_picture.png > /dev/usb/lp0
2. CUPS
2.1. 安装
在Debian上,您可能需要安装cups:
$ sudo apt-get update
$ sudo apt-get -y install cups
然后您可以构建并安装phomemo-tools文件:
$ cd cups
$ make
$ sudo make install
2.2. 配置
2.2.1. 图形界面
2.2.2.1.1. 前提条件
要使用USB连接,您需要python3-pyusb。 例如,在Fedora上:
$ sudo dnf install python3-pyusb
在Fedora上,SELinux似乎会阻止后端创建蓝牙套接字。 如果您在系统日志中看到这样的错误消息:
localhost.localdomain cupsd[2659]: Can\'t open Bluetooth connection: [Errno 13] Permission denied
您可能需要禁用SELinux强制执行以允许后端正常运行:
$ sudo semanage permissive -a cupsd_t
我没有找到一种方法来正确定义SELinux规则,以允许后端使用蓝牙套接字而无需更改强制执行模式 (ausearch/audit2allow组合无法解决问题)。
2.2.2.1.1. 配对打印机
- 打开打印机
- 打开"设置"窗口:
- 选择"蓝牙"面板:
- 选择您的蓝牙打印机(这里是"Mr.in_M02"):
- 您的打印机必须配对但未连接("已断开连接"):
- 选择"打印机"面板:
您可能需要解锁才能添加新打印机。
点击"添加打印机..."。
- 选择您的打印机并点击"添加":
- 您的打印机将出现在打印机列表中:
- 点击打印机的设置菜单并选择"打印选项":
- 选择"介质尺寸标签 50mmx70mm"并点击"测试页":
- 检查结果:
2.2.2. 命令行界面
2.2.2.1. 蓝牙
此定义将使用"phomemo"后端连接到打印机:
2.2.2.1.1 M02
$ sudo lpadmin -p M02 -E -v phomemo://DC0D309023C7 \
-P /usr/share/cups/model/Phomemo/Phomemo-M02.ppd.gz
2.2.2.1.2 M110、M120、M220
使用"Phomemo-M110.ppd.gz"。此驱动程序与M110、M120和M220兼容。 -p选项定义打印机名称。应根据使用的打印机进行更改。
$ sudo lpadmin -p M110 -E -v phomemo://DC0D309023C7 \
-P /usr/share/cups/model/Phomemo/Phomemo-M110.ppd.gz
2.2.2.2. USB
此定义将使用 /dev/usb/lp0 设备连接到打印机:
2.2.2.2.1 M02
$ sudo lpadmin -p M02 -E -v serial:/dev/usb/lp0 \
-P /usr/share/cups/model/Phomemo/Phomemo-M02.ppd.gz
2.2.2.1.2 M110, M120, M220
使用"Phomemo-M110.ppd.gz"。此驱动程序与M110、M120和M220兼容。 -p 选项定义打印机名称。应根据所使用的打印机进行更改。
$ sudo lpadmin -p M110 -E -v serial:/dev/usb/lp0 \
-P /usr/share/cups/model/Phomemo/Phomemo-M110.ppd.gz
2.2.2.3. 检查打印机选项
您可以使用以下命令检查打印机的选项,该命令将列出带有"*"标记的打印机默认设置:
$ lpoptions -d M02 -l
2.2.2.4. 打印
您可以使用以下命令通过CUPS打印文本:
$ echo "This is test" | lp -d M02 -o media=w50h60 -
您可以使用以下命令通过CUPS打印图像:
$ lp -d M02 -o media=w50h60 my_picture.png
M110、M120和M220打印机支持LabelWithGaps、Continuous和LabelWithMarks媒体类型,可以按以下方式指定:
$ echo "This is test" | lp -d M110 -o media=w30h20 -o MediaType=Continuous
3. M02协议
通过分析蓝牙数据包,似乎使用的是EPSON ESC/POS命令。
3.1. 头部
0x1b 0x40 -> 命令 ESC @: 初始化打印机
0x1b 0x61 -> 命令 ESC a: 选择对齐方式
0x01 范围: 0 (左对齐), 1 居中,
2 (右对齐)
0x1f 0x11 0x02 0x04
3.2. 数据块标记
0x1d 0x76 0x30 -> 命令 GS v 0 : 打印光栅位图
0x00 模式: 0 (正常), 1 (双倍宽度),
2 (双倍高度), 3 (四倍)
0x30 0x00 16位,小端序:每行字节数 (48)
0xff 0x00 16位,小端序:图像中的行数 (255)
值似乎是16位小端序
如果图像未完成,必须发送一个新的数据块标记, 包含剩余的行数(最大为255)。
3.3. 尾部
0x1b 0x64 -> 命令 ESC d : 打印并进纸n行
0x02 进纸的行数
0x1b 0x64 -> 命令 ESC d : 打印并进纸n行
0x02 进纸的行数
0x1f 0x11 0x08
0x1f 0x11 0x0e
0x1f 0x11 0x07
0x1f 0x11 0x09
3.4. 图像
每行长48字节,每个位表示一个点(384点/行)。 一行的宽度为48毫米(80点/厘米或203.2 dpi,如Phomemo公布的)。 高度和宽度的比例为1。
3.5. 打印机消息
1a 04 5a
1a 09 0c
1a 07 01 00 00
1a 08
51 30 30 31 45 30 XX XX XX XX XX XX XX XX XX -> 序列号: E05C0XXXXXX
4. M110/M120/M220协议
分析USB数据包。
4.1. 头部
0x1b 0x4e 0x0d -> 打印速度
0x05 范围: 0x01 (慢) - 0x05 (快)
0x1b 0x4e 0x04 -> 打印密度
0x0f 范围: 01 - 0f
0x1f 0x11 -> 媒体类型
0x0a 模式: 0a="带间隙的标签" 0b="连续" 26="带标记的标签"
4.2. 数据块标记
0x1d 0x76 0x30 -> 命令 GS v 0 : 打印光栅位图
0x00 模式: 0 (正常), 1 (双倍宽度),
2 (双倍高度), 3 (四倍)
0x2b 0x00 16位,小端序:每行字节数 (43)
0xf0 0x00 16位,小端序:图像中的行数 (240)
4.3. 尾部
0x1f 0xf0 0x05 0x00
0x1f 0xf0 0x03 0x00