Tut mir leid, dass ich dich warten ließ! Ich konnte den Thermodrucker "PAPERANG" aus Python drucken.
Download von hier
$ conda create -n paperang python=3.6
$ conda activate paperang
$ cd miaomiaoji-tool
$ pip install PyBluez-win10
$ pip install opencv-python
$ python message_process.py
Ich ändere die Gabelung von hier.
Wenn ich versuche, message_process.py auszuführen, wird ein Fehler in der Filterfunktion angezeigt. Fügen Sie die Filterfunktionen in den Zeilen 47 und 64 in eine Liste ein. Verwendung von Map / Filter in Python 3
valid_devices = list(filter(lambda d: len(d) == 2 and d[1] in valid_names, nearby_devices))
・ ・ ・
valid_service = list(filter(
lambda s: 'protocol' in s and 'name' in s and s['protocol'] == 'RFCOMM' and s['name'] == 'SerialPort',
service_matches
))
Im Fall von Pybluez wird OSError bei find_service in der 63. Zeile angezeigt, sodass PyBluez-win10 verwendet wird. * Betriebssystemfehler, wenn das Programm versucht, Funktionen von bluetooth._msbt # 279 zu verwenden
service_matches = find_service(uuid=self.uuid, address=self.address)
Ich erhalte die Fehlermeldung, dass der Dienstname nicht gefunden werden kann. Lassen Sie uns also service_matches drucken und anzeigen.
[{'host': '00:15:83:B7:11:AF', 'name': b'SerialPort', 'description': '', 'port': 1, 'protocol': 'RFCOMM', 'rawrecord': b'5J\t\x00\x00\n\x00\x01\x00\x0f\t\x00\x015\x03\x19\x11\x01\t\x00\x045\x0c5\x03\x19\x01\x005\x05\x19\x00\x03\x08\x01\t\x00\x055\x03\x19\x10\x02\t\x00\x08\x08\xff\t\x00\t5\x085\x06\x19\x11\x01\t\x01\x02\t\x01\x00%\nSerialPort', 'service-classes': [b'1101'], 'profiles': [(b'1101', 258)], 'provider': None, 'service-id': None, 'handle': 65551}, {'host': '00:15:83:B7:11:AF', 'name': b'WeChat', 'description': '', 'port': 8, 'protocol': 'RFCOMM', 'rawrecord': b'5T\t\x00\x00\n\x00\x01\x00\x0e\t\x00\x015\x11\x1c\xe5\xb1R\xedkF\t\xe9Fxf^\x9a\x97,\xbc\t\x00\x045\x0c5\x03\x19\x01\x005\x05\x19\x00\x03\x08\x08\t\x00\x055\x03\x19\x10\x02\t\x00\x08\x08\xff\t\x00\t5\x085\x06\x19\x11\x01\t\x01\x02\t\x01\x00%\x06WeChat', 'service-classes': ['E5B152ED-6B46-09E9-4678-665E9A972CBC'], 'profiles': [(b'1101', 258)], 'provider': None, 'service-id': None, 'handle': 65550}]
'name': b Da es sich um 'SerialPort' handelt, fügen Sie in Zeile 65 b zu 'SerialPort' hinzu.
lambda s: 'protocol' in s and 'name' in s and s['protocol'] == 'RFCOMM' and s['name'] == b'SerialPort',
Wenn ich service_matches drucke, wird der folgende struct.pack-Fehler angezeigt.
File "message_process.py", line 88, in packPerBytes
result += struct.pack('<i', self.crc32(bytes))
struct.error: argument out of range
Ändern wir <i in Zeile 88 in <I. struct - Bytes als gepackte Binärdaten interpretieren
result += struct.pack('<I', self.crc32(bytes))
Dann bekomme ich also einen Codierungsfehler
File "message_process.py", line 110, in recv
logging.info("Recv: " + raw_msg.encode('hex'))
AttributeError: 'bytes' object has no attribute 'encode'
Ändern Sie den .encode ('hex') in den Zeilen 110 und 122 in .hex (). [Wie behebe ich AttributeError: 'Bytes'-Objekt hat kein Attribut'encode'?](Https://stackoverflow.com/questions/55701623/how-do-i-fix-attributeerror-bytes-object-has-no- Attribut-Codierung)
logging.info("Recv: " + raw_msg.hex())
・ ・ ・
, self.payload_length, self.payload.hex()
Da der Kartenfunktionsfehler in image_process.py angezeigt wird, fügen Sie die Kartenfunktion in die 32. Zeile der Liste ein.
File "\miaomiaoji-tool\image_process.py", line 20, in frombits
for b in range(len(bits) / 8):
TypeError: object of type 'map' has no len()
Da der Bereichsbereich der for-Anweisung in der 20. Zeile float ist, setzen Sie ihn in int um.
for b in range(int(len(bits) / 8)):
Ich erhalte einen Fehler in struct.pack in Zeile 153, damit ich ihn auskommentieren kann.
msg = struct.pack("<%dc" % len(binary_img, *binary_img)
Um eine Zeile mit 300 Zeilen zu drucken, muss sie binär sein. Der Inhalt von sendImageToBt ist die binäre Zeichenfolge in msg.
def sendImageToBt(self, binary_img):
self.sendPaperTypeToBt()
# msg = struct.pack("<%dc" % len(binary_img, *binary_img)
msg = binary_img
self.sendToBt(msg, BtCommandByte.PRT_PRINT_DATA, need_reply=False)
self.sendFeedLineToBt(self.padding_line)
Print a pure black image with 300 lines
img = b'\xff' * 48 * 300
mmj.sendImageToBt(img)
Ich konnte drucken.
Tatsächlich müssen Sie für jede Zeile an self.sendToBt senden.
def sendImageToBt(self, binary_img):
self.sendPaperTypeToBt()
# msg = struct.pack("<%dc" % len(binary_img, *binary_img)
msgs = [binary_img[x: x+192] for x in range(0, len(binary_img), 192)] # 4*48
for msg in msgs:
self.sendToBt(msg, BtCommandByte.PRT_PRINT_DATA, need_reply=False)
self.sendFeedLineToBt(self.padding_line)
Dies ist die wahre 300-Linien-Linie. Ich habe den Funktionsnamen in sendBinaryToBt geändert.
\ Xff ist schwarz und \ x00 ist weiß. Es ist leicht zu verstehen, ob \ xff in eine Binärzahl konvertiert wird, aber \ xff wird zu 0b11111111 und es werden acht schwarze vertikale Linien gezeichnet. Daher werden 8 Bits verwendet, um 8 Pixel des Bildes darzustellen. Die Breite der horizontalen Linie beträgt bis zu 48 '\ xff'. Das heißt, die Bildbreite beträgt 8 x 48 = 384 Pixel.
Das Bild wird in der Größe geändert, binärisiert, in einen Wert von [0,1] konvertiert, um 8 Pixel in hexadezimal konvertiert und zeilenweise gedruckt.
def sendImageToBt(self, binary_img):
self.sendPaperTypeToBt()
height, width = binary_img.shape[:]
for line in range(height):
bits = [0 if x > 0 else 1 for x in binary_img[line]]
bits = [bits[x:x+8] for x in range(0, len(bits), 8)]
msg = ''
for bit in bits:
bin = '0b'+''.join(str(x) for x in bit)
msg += '{:02x}'.format(int(bin, 0))
msg = bytes.fromhex(msg)
self.sendToBt(msg, BtCommandByte.PRT_PRINT_DATA, need_reply=False)
self.sendFeedLineToBt(self.padding_line)
・ ・ ・
Print an existing image(need opencv):
img = cv2.imread('kumamcn.png', 0)
ret, binary_img = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
height, width = binary_img.shape[:]
binary_img = cv2.resize(binary_img, (384, int(height*384.0/width)), cv2.INTER_AREA)
mmj.sendImageToBt(binary_img)
erledigt. Jetzt können Sie jedes Bild drucken!
Wenn Sie diesen Artikel nützlich finden, kaufen Sie bitte rohe Austern in Ihrem Buch.
Recommended Posts