如何在 Android 上使用 Python 通过蓝牙发送 ESC 打印命令?

Posted

技术标签:

【中文标题】如何在 Android 上使用 Python 通过蓝牙发送 ESC 打印命令?【英文标题】:How to send a ESC printing command over Bluetooth using Python on Android? 【发布时间】:2020-02-01 04:00:19 【问题描述】:

所以这是我最初的问题:我尝试通过蓝牙使用 CPCL 命令打印 PIL 条形码图像。打印机为容大RPP320蓝牙打印机,支持CPCL&ESC/POS。我选择 CPCL 是因为我有另一台仅运行 CPCL 的打印机,并且为了缩短开发时间,我至少目前使用 CPCL。现在我只是在测试一个基本的“Hello World”命令。因此,在阅读了 HP 和 Zebra CPCL pdf 小册子之后,我想我并没有真正理解所有内容,但足以尝试一下。 所以我从this very helpful site 那里搜到了蓝牙脚本。

这里是修改后的代码:

import bluetooth

serverMACAddress = '00:00:12:03:00:12'
port = 3
s = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
s.connect((serverMACAddress, port))
while 1:
    a = b'''!0 200 200 210 1
    TEXT 4 0 30 40 Hello World
    FORM
    OUTPUT'''
    byt = bytearray(a)
    for b in byt:
        s.send(hex(b))
sock.close()

运行此脚本后,我使用上面链接中的服务器脚本听取来自打印机的任何反馈。通过蓝牙的任何连接问题我都可以解决。 我想知道的是我应该将我的 CPCL 文本作为十六进制字节发送还是应该使用 Utf-8 或 Latin 1 或其他东西对其进行编码?因为打印机现在没有和我说话。

例如

a = '''!0 200 200 210 1
TEXT 4 0 30 40 Hello World
FORM
OUTPUT'''
enc = a.encode('Latin 1')

答案:使用 Utf-8 并将所有命令作为编码为 bytearray 的 ASCII 十进制数发送。 编辑以解决原始问题: 因此,经过数小时后,我得出的结论是 PyBluez 将无法在 android 上运行,并且不再尝试使用 CPCL 打印条形码 PIL 图像。我已经解决了我在another thread 中遇到的与 Android 问题的蓝牙连接,但我还没有完成在其他操作系统上尝试 PyBluez。我将打印机切换为接受 ESC/POS 命令并使用以下命令打印条形码(这也适用于 UROVO K319 打印机):

gs = 29
esc = 27
bcode = str(1001)
print('Building barcode command')
#extend bytearray
#initialise printer
init_cmd = [esc,64]
wrt_send = bytearray(init_cmd)

#set bcode string placement below barcode 
hri_cmd = [gs,72,2]
wrt_send.extend(bytearray(hri_cmd))
hrif = [gs,102,1]
wrt_send.extend(bytearray(hrif))

#set bcode height
hbcode_cmd = [gs,104,80]
wrt_send.extend(bytearray(hbcode_cmd))
#set bcode width
wbcode_cmd = [gs,119,6]
wrt_send.extend(bytearray(wbcode_cmd))

#print bcode very important is len of bcode for Code128 and linefeed dec 10 at end
prnt_bcode_cmd_pre = [gs,107,73,len(bcode)]
post = bytearray([10])
bar = bcode.encode('utf-8')
prnt_bcode = bytearray(prnt_bcode_cmd_pre)
prnt_bcode.extend(bar)
prnt_bcode.extend(post)
wrt_send.extend(prnt_bcode)
self.send_stream.write(wrt_send)
self.send_stream.flush()

我没有使用 escpos python 库的原因是因为我无法让它在 Android 环境中与蓝牙一起使用。我知道这不符合我在原始问题中的尝试,但它确实解决了我在 Android 上通过蓝牙在打印机上打印条形码的问题。

【问题讨论】:

【参考方案1】:

原始问题答案:使用 Utf-8 编码并将所有命令作为编码为 bytearray 的 ASCII 十进制数发送。如果您发送字符串,请将它们单独编码并扩展bytearray

【讨论】:

以上是关于如何在 Android 上使用 Python 通过蓝牙发送 ESC 打印命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Kotlin 在 Android 中使用套接字

如何从android发送消息到我的笔记本电脑python程序?

android上如何使用sqlite数据库

使用 TerminalIDE 在 Android 上运行 Python 3

如何使用python做android的自动化测试

Python - 通过 FCM / APNs 向 IOS 或 Android 设备推送通知