从ESC / POS状态代码解释各个位

时间:2019-03-12 19:19:12

标签: python sockets raw-data escpos

我承认,我正在从事的这个项目并不是一个关于如何使用Python迈出第一步的教科书示例,而是我在这里。

设置

与RaspberryPi本地连接(以太网,套接字)的ESC / POS打印机,它通过AMQP远程接收打印作业。

问题

连接到AMQP代理和打印机以及打印正常。我正在努力的是使用ctypes处理打印机状态代码。

在深入研究Internet并寻找最佳方法时,我遇到了关于位操作的Python维基文章(link),该文章指出对于像我这样的用法,建议使用ctypes。这确实是一种很棒的方法,因此我立即将其应用于了我的代码(在其简化版下面)。

import socket
import ctypes

class PrinterStatus_bits( ctypes.LittleEndianStructure ):
    _fields_ = [
                ("fix0",        c_uint8, 1 ),  # asByte & 1
                ("fix1",        c_uint8, 1 ),  # asByte & 2
                ("drawer",      c_uint8, 1 ),  # asByte & 4
                ("offline",     c_uint8, 1 ),  # asByte & 8
                ("fix4",        c_uint8, 1 ),  # asByte & 16
                ("recovery",    c_uint8, 1 ),  # asByte & 32
                ("feed",        c_uint8, 1 ),  # asByte & 64
                ("fix7",        c_uint8, 1 ),  # asByte & 128
               ]

class Flags( ctypes.Union ):
    _anonymous_ = ("bit",)
    _fields_ = [
                ("bit",    PrinterStatus_bits),
                ("asByte", c_uint8           )
               ]


sock            = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address  = ('123.123.123.123', 9100)
c_uint8         = ctypes.c_uint8          
flags           = Flags()
msg             = b'\x10\x04\x01'

print('connecting to %s port %s' % server_address)
sock.connect(server_address)

print('requesting printer status')
sock.sendall(msg)
data           = sock.recv(1)
flags.asByte   = ord(data)

1个字节的接收长度是有意识地设置的,因为这是响应的固定长度。但是,这只是(四个)第一个通用状态代码。

我很想通过flags对象获得所有这些状态代码,只是不知道如何使用联合。

如果我做类似的事情:

class PrinterStatus_bits( ctypes.LittleEndianStructure ):
class PrinterOffline_bits( ctypes.LittleEndianStructure ):
class PrinterError_bits( ctypes.LittleEndianStructure ):
class PrinterPaper_bits( ctypes.LittleEndianStructure ):

class Flags( ctypes.Union ):
    _anonymous_ = ("status",)
    _fields_ = [
                ("status",   PrinterStatus_bits),
                ("offline",  PrinterOffline_bits),
                ("error",    PrinterError_bits),
                ("paper",    PrinterPaper_bits ),
                ("asByte",   c_uint8    )
               ]

我什至如何为相应的类分配适当的值?

p.s。 所有4个状态代码总是正好为1个字节长

p.p.s 我不愿意使用ctypes,如果在这种情况下它不是有效的方法,我会满意的,我将遍历所有4个响应并将这些值分配给0/1数组,但是我的好奇心使我变得更好,我想知道这是否还能做到

1 个答案:

答案 0 :(得分:1)

您正在使这个问题复杂化。

flags    = ord(data)
drawer   = (flags & 4) != 0
offline  = (flags & 8) != 0
recovery = (flags & 32) != 0
feed     = (flags & 64) != 0