Ich konnte den Thermodrucker "PAPERANG" aus Python (Windows10, Python3.6) drucken.

Tut mir leid, dass ich dich warten ließ! Ich konnte den Thermodrucker "PAPERANG" aus Python drucken.

Beispielcode

Download von hier

Umgebung

$ conda create -n paperang python=3.6
$ conda activate paperang
$ cd miaomiaoji-tool
$ pip install PyBluez-win10
$ pip install opencv-python

Lauf

$ python message_process.py

Kommentar

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. 86242649_182835276314024_4717528697094012928_n.jpg

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.

86189532_333920134236910_8458868322023243776_n.jpg

\ 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! 86259996_614941075716724_5170025822672650240_n.jpg

Wenn Sie diesen Artikel nützlich finden, kaufen Sie bitte rohe Austern in Ihrem Buch.

Recommended Posts

Ich konnte den Thermodrucker "PAPERANG" aus Python (Windows10, Python3.6) drucken.
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Python: Ich konnte in Lambda rekursieren
Ich wollte die Python-Bibliothek von MATLAB verwenden
Python: Kann in Lambda wiederholt werden
Ich möchte ein Glas aus Python verwenden
Was ich süchtig nach Python Autorun war
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Python Ich weiß nicht, wie ich den Druckernamen bekomme, den ich normalerweise benutze.
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich konnte AWS-Batch mit Python, Moto verspotten, also werde ich es verlassen
[IBM Cloud] Ich habe versucht, über Cloud Funtions (Python) auf die Tabelle Db2 on Cloud zuzugreifen.
Ich möchte Ceres Solver aus Python verwenden
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
[Python] Ich werde FTP auf den FTP-Server hochladen.
Ich möchte den Fortschritt in Python anzeigen!
Ich war nüchtern süchtig danach, awscli von einem in crontab registrierten Python 2.7-Skript aus aufzurufen
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich habe die Python-Version von 2 auf 3 erhöht, aber jedes Mal, wenn ich das Ubuntu-Terminal neu starte, bleibt die Version 2.
Ich möchte den Dateinamen von DataLoader sehen
[Python] So entfernen Sie doppelte Werte aus der Liste
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Geben Sie die Zeit ab dem Start des Programms in Python aus
Ich habe versucht, Soma Cube mit Python zu lösen
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Ich möchte mit Python-Datenklasse nach hinten erben
Der erste Schritt, um Blender von Python verfügbar zu machen
[Python] Ich habe versucht, die Top 10 der Lidschatten grafisch darzustellen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Ich habe die Chainer-Referenz gelesen (von Zeit zu Zeit aktualisiert).
Ich möchte R-Datensatz mit Python verwenden
Wovon ich süchtig war, als ich Python Tornado benutzte
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
*
[Qualifikation] Ich habe versucht, Python von Grund auf zu lernen, um die Grundprüfung für die Python3-Ingenieurzertifizierung (Studienausgabe) abzulegen.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Ich habe das Windows PowerShell-Kochbuch durch ein Python-Skript ersetzt.
[Python] Poesie Ich habe angefangen & Eindruck, dass ich von Pipenv zu Poesie gewechselt bin
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich war 2 Minuten lang süchtig nach Python-Debugger-PDF
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Ich konnte die Web-App-Authentifizierung mit Flask-Login implementieren