J'ai pu imprimer l'imprimante thermique "PAPERANG" depuis Python (Windows10, Python3.6)

Désolé je t'ai fait attendre! J'ai pu imprimer l'imprimante thermique "PAPERANG" de Python.

Exemple de code

Télécharger depuis ici

Environnement

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

Courir

$ python message_process.py

Commentaire

Je change le fourchu de ici.

Lorsque j'essaye d'exécuter message_process.py, j'obtiens une erreur dans la fonction de filtre. Mettez les fonctions de filtrage aux lignes 47 et 64 dans une liste. Comment utiliser map / filter dans Python3

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
))

Avec pybluez, OSError apparaît à find_service sur la 63ème ligne, donc PyBluez-win10 est utilisé. * Erreur du système d'exploitation lorsque le programme tente d'utiliser des fonctions de bluetooth._msbt # 279

service_matches = find_service(uuid=self.uuid, address=self.address)

J'obtiens une erreur indiquant que le nom du service est introuvable, alors imprimons et affichons service_matches.

[{'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 Puisqu'il s'agit de'SerialPort ', ajoutez b à'SerialPort' à la ligne 65.

lambda s: 'protocol' in s and 'name' in s and s['protocol'] == 'RFCOMM' and s['name'] == b'SerialPort',

Lorsque j'imprime service_matches, j'obtiens l'erreur struct.pack suivante.

 File "message_process.py", line 88, in packPerBytes
    result += struct.pack('<i', self.crc32(bytes))
struct.error: argument out of range

Changeons <i à la ligne 88 en <I. struct - Interpréter les octets comme des données binaires compactées

result += struct.pack('<I', self.crc32(bytes))

Ensuite, j'obtiens une erreur d'encodage, donc

File "message_process.py", line 110, in recv
    logging.info("Recv: " + raw_msg.encode('hex'))
AttributeError: 'bytes' object has no attribute 'encode'

Remplacez .encode ('hex') sur les lignes 110 et 122 par .hex (). [Comment corriger l'erreur AttributeError: l'objet 'bytes' n'a pas d'attribut'encode '?](Https://stackoverflow.com/questions/55701623/how-do-i-fix-attributeerror-bytes-object-has-no- attribut-encodage)

logging.info("Recv: " + raw_msg.hex())
 ・ ・ ・
, self.payload_length, self.payload.hex()

Puisqu'une erreur de la fonction de carte apparaît dans image_process.py, placez la fonction de carte sur la 32e ligne de la liste.

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()

De plus, étant donné que la plage de plage de l'instruction for sur la 20e ligne est float, transtypez-la en int.

for b in range(int(len(bits) / 8)):

J'obtiens une erreur dans struct.pack à la ligne 153, donc je peux la commenter.

 msg = struct.pack("<%dc" % len(binary_img, *binary_img)

Pour imprimer une ligne de 300 lignes, elle doit être binaire. Le contenu de sendImageToBt est la chaîne de caractères binaires dans msg tel quel.

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)

J'ai pu imprimer. 86242649_182835276314024_4717528697094012928_n.jpg

En fait, vous devez envoyer à self.sendToBt pour chaque ligne.

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)

C'est la vraie ligne de 300 lignes. J'ai changé le nom de la fonction en sendBinaryToBt.

86189532_333920134236910_8458868322023243776_n.jpg

\ Xff est noir et \ x00 est blanc. Il est facile de comprendre si \ xff est converti en nombre binaire, mais \ xff devient 0b11111111 et huit lignes verticales noires sont dessinées. Par conséquent, 8 bits sont utilisés pour représenter 8 pixels de l'image. La largeur de la ligne horizontale est jusqu'à 48 '\ xff'. Autrement dit, la largeur de l'image est de 8 x 48 = 384 pixels.

L'image est redimensionnée, binarisée, convertie à une valeur de [0,1], convertie en hexadécimal de 8 pixels et imprimée ligne par ligne.

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)

terminé. Vous pouvez maintenant imprimer n'importe quelle image! 86259996_614941075716724_5170025822672650240_n.jpg

Si cet article est utile, veuillez acheter des huîtres crues dans le livre Gachi.

Recommended Posts

J'ai pu imprimer l'imprimante thermique "PAPERANG" depuis Python (Windows10, Python3.6)
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
Python: j'ai pu récurer en lambda
Je voulais utiliser la bibliothèque Python de MATLAB
Python: peut être répété en lambda
Je veux utiliser jar de python
Ce que j'étais accro à Python autorun
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
Utilisez Python de Java avec Jython. J'étais aussi accro.
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
python Je ne sais pas comment obtenir le nom de l'imprimante que j'utilise habituellement.
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
J'ai pu me moquer d'AWS-Batch avec python, moto, donc je vais le laisser
[IBM Cloud] J'ai essayé d'accéder à la table Db2 on Cloud à partir de Cloud Funtions (python)
Je veux utiliser le solveur ceres de python
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
[Python] Je vais télécharger FTP sur le serveur FTP.
Je veux afficher la progression en Python!
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
J'ai augmenté la version Python de 2 à 3, mais chaque fois que je redémarre le terminal ubuntu, la version reste 2.
Je veux voir le nom de fichier de DataLoader
[Python] Comment supprimer les valeurs en double de la liste
J'ai essayé de représenter graphiquement les packages installés en Python
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de toucher un fichier CSV avec Python
Affiche l'heure à partir du moment où le programme a été lancé en python
J'ai essayé de résoudre Soma Cube avec python
J'étais accro au grattage avec Selenium (+ Python) en 2020
Je veux hériter de l'arrière avec la classe de données python
La première étape pour obtenir Blender disponible à partir de Python
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
Je veux écrire en Python! (3) Utiliser des simulacres
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai senti que j'avais porté le code Python en C ++ 98.
J'ai lu la référence Chainer (mise à jour de temps en temps)
Je veux utiliser le jeu de données R avec python
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
J'ai essayé de résumer les opérations de chaîne de Python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
[Qualification] J'ai essayé d'étudier Python à partir des bases pour passer l'examen de base de la certification d'ingénieur python3 (dossier d'examen)
[Qualification] J'ai essayé d'étudier Python à partir des bases pour passer l'examen de base de certification d'ingénieur python3 (édition d'étude)
J'ai essayé de trouver l'entropie de l'image avec python
Je veux initialiser si la valeur est vide (python)
J'ai remplacé le livre de recettes Windows PowerShell par un script python.
[Python] Poésie que j'ai commencé & Impression que j'ai passé de Pipenv à la poésie
J'ai essayé de simuler la propagation de l'infection avec Python
J'étais accro au débogueur Python pdb pendant 2 minutes
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
J'ai pu implémenter l'authentification d'application Web avec flask-login