Esta semana estuve recreando la API del plugin para impresoras térmicas en Android (HTTP a ESC POS Bluetooth) y escribí algunos archivos para probar la API, así que hoy vengo a compartirlos.
He usado cURL. La IP de mi dispositivo Android donde se ejecuta la aplicación es http://192.168.0.6 y el puerto es el 8000. Para imprimir hay que hacer la petición a /imprimir.
Puedes descargar el plugin en: API HTTP a ESC POS Bluetooth para Android
Plugin gratuito para impresoras térmicas Bluetooth en Android
Recuerda que debes enviar la dirección MAC en el parámetro impresora
dentro del JSON. Todos los comandos tienen la siguiente sintaxis:
curl -X POST -H "Content-Type: application/json" -d @archivo.json dirección
Por ejemplo:
curl -X POST -H "Content-Type: application/json" -d @qr.json http://192.168.0.6:8080/imprimir
Dicen que a partir de la versión 7.82.0 se puede usar --json
así:
curl --json @archivo.json dirección
Por ejemplo:
curl --json @qr.json http://192.168.0.6:8080/imprimir
Yo he probado con ambas opciones y funciona. Dicho esto, comencemos con las pruebas.
Imprimir códigos de barras
Comencemos con la impresión de códigos de barras en la impresora térmica. Tengo este archivo que muestra el tipo de código de barras arriba del código mismo.
Los formatos de códigos de barras soportados son:
- qr
- code39
- code93
- code128
- pdf417
- upca
- upce
- ean
- ean8
- itf
- codabar
Podemos probarlos con el siguiente archivo:
{
"operaciones": [
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Code39:\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"code39",
"D387266D",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"code93:\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"code93",
"D387266D",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"code128:\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"code128",
"D387266D",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"upca:\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"upca",
"012345678905",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"upce\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"upce",
"02345673",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"ean\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"ean",
"5012345678900",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"upca:\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"upca",
"012345678905",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"ean8:\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"ean8",
"50123452",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"itf\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"itf",
"50123452",
0,
200,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"codabar\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"codabar",
"D387266D",
0,
200,
80
]
}
],
"impresora": "Tu impresora",
"serial": ""
}
Código QR
Para el código QR uso este archivo:
{
"operaciones": [
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"QR:\n"
]
},
{
"nombre": "ImprimirCodigoDeBarras",
"argumentos": [
"qr",
"Parzibyte",
0,
200,
200
]
}
],
"impresora": "Tu impresora",
"serial": ""
}
Imágenes
El plugin soporta la impresión de imágenes. La API HTTP a ESC POS Bluetooth permite imprimir una imagen del almacenamiento local, una codificada como base64 o una de internet.
Podemos probar las 3 así:
{
"operaciones": [
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Imagen de internet:\n"
]
},
{
"nombre": "DescargarImagenDeInternetEImprimir",
"argumentos": [
"https://parzibyte.me/static/mariposas_cempoalxochitl_dithering.png",
0,
320
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Imagen local:\n"
]
},
{
"nombre": "CargarImagenLocalEImprimir",
"argumentos": [
"/storage/emulated/0/Pictures/Telegram/i.jpg",
0,
200
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Imagen base64:\n"
]
},
{
"nombre": "ImprimirImagenEnBase64",
"argumentos": [
"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAAAXNSR0IArs4c6QAAA1ZJREFUeF7tm1ty4zAMBOX7Hzr5cJVLkUWiBwAVPyafKYiP5gwAMru3zT8lArfS1/542wP8WcBjdECjuUi8GrN0XwaYU82DmwEuAljJjXvLkAMiMWSbqrXJmPuY032NFm+Az3gNcNv+FM3LFEiqmKpktQqPrLT/vWrhln2RjbdMdDhuAzwAIQdRUVHlW7WojVSdzoGrFUgKFoHwtRY2wEN1G6kl7KkmZdEKnBQR0kgTe0q5a9u2ltREkn/LRAY4bzvJQRALq+0NiSf2H+0u3FcYoLbrB2sQeyameHxC1k9yMllDuo0hg1fUpY5fyXWk4o/WY4BX3oUrquhSCMldqoXb9/XKOcoAYYO9AtRlwqgkVdUOK1oOYmF1nVK8AUq4noMN8B8BkiueWpEr736kfxuth3x7KraKAg2wsbEkRlATPik6ZN7KOOE1kGyKtBmqNcjG07aavPyQRwNyLW25jFdO1gAnD5KVvErAhrZ6NQWSTRHZq0VHnXfFq3W4BpIDw0EmJ776SkVyL0k1qqqlHGiAEwJEISSGNMxdMcQ1JF0Qy4f5nMAhMV1wyDgGOHnm+hiARN4kN4YWSLRDJOGT5p84K1R7GJDoqUhlHLU95FsDhIdCXKDGEGVKaYQokJw4ubeqlif9m9rAt++3fUCoLnKpN0D4D3iIZSq5kdiWCOn00CtVUrUkKRwVmKpiif3DPRrgHVE6zxvgxQAJ8FD2k4DKHZbMS5QmpQIChExKFk9iDJBQ+lQFEukShagM0y1Eok1S+89wbZULtQqqsvium05lDaepzADvSEOljVodUkS6lEZSBGm21UMn6iVjnjb5BjhXYGh5A2wE+AoVtmsN6ZymXutU76v5kGyE5L0V86qvNKdrMEBehSWAldyoniyJP62AiT9IjdSuOuUxTvpDeB0j4xvgASYBooJ9awWSylgBEvZasDKSdXbNJVmYLMwAi/9N1QAvAKjeSbsqZteDsPQao/aHRIEGOGldDPBiC1/Z6lRSQWh/opyuKrxiI5U3RnXvp7czdZCuPuqrFKi+hISyT6SL0d2cKJDEkBehtAIN8PnFRrqJGGACoAqN5EYyJrF/2m6J1BHuS22YCYTRywn51gAPlNSH2bcGSBTimKJCDNAAezXwC2+V72CevNa6AAAAAElFTkSuQmCC",
0,
80
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "Feed",
"argumentos": [
2
]
}
],
"impresora": "MAC de tu impresora",
"serial": ""
}
Si pruebas este archivo asegúrate de revisar la ubicación de la imagen que se imprime. En mi caso es /storage/emulated/0/Pictures/Telegram/i.jpg
pero en el tuyo debes ajustar lo necesario.
Texto
Las impresoras térmicas Bluetooth permiten imprimir texto en varios formatos. Puedes subrayarlo, enfatizarlo, girarlo 90 grados, cambiar la alineación y el tamaño de la fuente.
El siguiente archivo se encarga de hacer todas esas pruebas. Fíjate en que estoy invocando a Iniciar antes de cambiar cada estilo, ya que al invocar a esa operación se reinician todos los parámetros de estilo previamente aplicados.
{
"operaciones": [
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerAlineacion",
"argumentos": [
0
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Alineando 0\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerAlineacion",
"argumentos": [
1
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Alineando 1\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerAlineacion",
"argumentos": [
2
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Alineando 2\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerEnfatizado",
"argumentos": [
true
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Enfatizado\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerEnfatizado",
"argumentos": [
false
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"NO Enfatizado\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerImpresionBlancoYNegroInversa",
"argumentos": [
false
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"NO inversa\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerImpresionBlancoYNegroInversa",
"argumentos": [
true
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Inversa\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerModoDeImpresionAlReves",
"argumentos": [
true
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Impresion al reves\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerModoDeImpresionAlReves",
"argumentos": [
false
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Impresion NO al reves\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerRotacionDe90Grados",
"argumentos": [
false
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Impresion NO 90 grados\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerRotacionDe90Grados",
"argumentos": [
true
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Impresion 90 grados\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerSubrayado",
"argumentos": [
true
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Subrayado\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerSubrayado",
"argumentos": [
false
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"NO Subrayado\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerTamañoFuente",
"argumentos": [
1,
1
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Fuente 1,1\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerTamañoFuente",
"argumentos": [
2,
2
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Fuente 2,2\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerTamañoFuente",
"argumentos": [
6,
6
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Fuente 6,6\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerTamañoFuente",
"argumentos": [
3,
8
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Fuente 3,8\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerTamañoFuente",
"argumentos": [
8,
3
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Fuente 8,3\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "EstablecerTamañoFuente",
"argumentos": [
8,
8
]
},
{
"nombre": "EscribirTexto",
"argumentos": [
"Fuente 8,8\n"
]
},
{
"nombre": "Iniciar",
"argumentos": []
},
{
"nombre": "Feed",
"argumentos": [
2
]
}
],
"impresora": "",
"serial": ""
}
La salida es:

Tú mismo puedes crear archivos de prueba para consumir la API de impresoras térmicas Bluetooth, estos son solo algunos ejemplos.
Estoy aquí para ayudarte 
Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto
No te pierdas ninguno de mis posts 
Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
Plugin gratuito para impresoras térmicas Bluetooth en Android
En este post te mostraré un plugin gratuito que te va a permitir imprimir en impresoras térmicas desde Android. La aplicación (APK) que te enseñaré sirve como puente entre el programador y una impresora térmica conectada por Bluetooth para enviar comandos ESC POS, además de que es una app gratuita.…
En "Android"

Imprimir ticket en impresora térmica usando JavaScript y plugin
En este post te voy a enseñar a imprimir en una impresora térmica usando JavaScript del lado del cliente, evitando confirmación por parte del usuario, gracias a un plugin. English version here. Y también he desarrollado un plugin para Android, míralo aquí: https://parzibyte.me/blog/2022/11/01/plugin-gratuito-impresoras-termicas-bluetooth-android/ Yo recomiendo la versión 3 y final,…
En "javascript"

Plugin para impresoras térmicas versión 3
Me complace anunciar la versión 3 (y final) de mi plugin que permite imprimir en impresoras térmicas de manera gratuita. Este plugin combina lo mejor de las otras versiones en una sola. A continuación veamos sus principales características: Impresión de texto Impresión de texto con acentos, definiendo la página de…
En "Plugin ESC POS v3"