Plugin impresoras Bluetooth Android

Documentación del plugin para impresoras térmicas Bluetooth en Android

Este post describe todas las funciones que ofrece el plugin para imprimir en impresoras térmicas Bluetooth desde Android, además de los detalles del servidor, JSON soportado, operaciones, etcétera.

El plugin del que hablo es el siguiente:

Esto te servirá para conocer todo lo que puedes hacer con el plugin y también para crear tus propios conectores en caso de ser necesario.

Documentación del servidor del plugin

El plugin inicia un servidor en localhost:8000 (si en el futuro el puerto cambia lo anunciaré en mi blog).

En la ruta /imprimir recibe peticiones POST que deben contener un JSON con la siguiente estructura:

  1. impresora: string, dirección mac de la impresora
  2. serial: string, serial o licencia si es que cuentas con ella. Si no la tienes puedes omitirla o enviar una cadena vacía
  3. operaciones: arreglo de tipo Operacion

El tipo Operacion tiene 2 propiedades:

  • nombre: string, el nombre de la operación
  • argumentos: arreglo de tipo dinámico (o genérico, ya que puede tener datos de cualquier tipo), los argumentos de la operación

Veamos un ejemplo muy simple del payload que se debe enviar. En este caso el JSON está formateado para que su lectura sea fácil, cuando tú hagas pruebas envía el JSON codificado normalmente.

{
 "operaciones": [
  {
   "nombre": "Iniciar",
   "argumentos": []
  },
  {
   "nombre": "EstablecerAlineacion",
   "argumentos": [
    1
   ]
  },
  {
   "nombre": "DescargarImagenDeInternetEImprimir",
   "argumentos": [
    "http://assets.stickpng.com/thumbs/587e32259686194a55adab73.png",
    0,
    216
   ]
  },
  {
   "nombre": "EstablecerTamañoFuente",
   "argumentos": [
    1,
    1
   ]
  },
  {
   "nombre": "EscribirTexto",
   "argumentos": [
    "parzibyte.me\n"
   ]
  },
  {
   "nombre": "Feed",
   "argumentos": [
    2
   ]
  },
  {
   "nombre": "Corte",
   "argumentos": [
    1
   ]
  },
  {
   "nombre": "Pulso",
   "argumentos": [
    48,
    60,
    120
   ]
  }
 ],
 "impresora": "FF:FF:FF:FF:FF",
 "serial": "123"
}

Internamente el plugin tiene varias funciones a las que llama por su nombre (por ejemplo, Pulso) y les pasa los argumentos dependiendo de la función, por ello es que algunas acciones tienen un argumento, algunos ninguno, etcétera.

Fíjate también en la impresora y el serial del JSON de arriba.

Sea como sea, mientras envíes un JSON válido el plugin va a imprimirlo en la impresora térmica. Y esto puedes hacerlo desde cualquier lenguaje usando cualquier librería siempre y cuando sea capaz de codificar ese JSON y enviarlo por HTTP.

Solo para que quede claro, si quisieras imprimir el JSON de arriba deberías hacer una petición POST a http://localhost:8000/imprimir enviando el JSON codificado correctamente.

Respuesta del servidor

El servidor va a responder con un true codificado como JSON o con una cadena de error.

Descripción de todas las operaciones

Anteriormente te mostré un JSON con algunas operaciones. Igualmente puedes ver las operaciones desde algún conector que yo haya programado, pero para que quede claro y documentado a continuación mostraré todas las funciones que puede hacer el plugin en la impresora térmica Bluetooth desde Android.

Primero veamos los nombres de todas las operaciones. Fíjate que una cosa es el nombre de la operación y otra cosa es el nombre de la función real, el cambio es mínimo (por ejemplo, solo la primera letra es minúscula o se omite la ñ) .

Todas las operaciones soportadas al momento son:

  1. CargarImagenLocalEImprimir
  2. Corte
  3. CorteParcial
  4. DescargarImagenDeInternetEImprimir
  5. DeshabilitarElModoDeCaracteresChinos
  6. EscribirTexto
  7. EstablecerAlineacion
  8. EstablecerEnfatizado
  9. EstablecerFuente
  10. EstablecerImpresionBlancoYNegroInversa
  11. EstablecerModoDeImpresionAlReves
  12. EstablecerRotacionDe90Grados
  13. EstablecerSubrayado
  14. EstablecerTamañoFuente
  15. Feed
  16. HabilitarElModoDeCaracteresChinos
  17. ImprimirCodigoDeBarras
  18. ImprimirImagenEnBase64
  19. Iniciar
  20. Pulso
  21. TextoSegunPaginaDeCodigos

Ahora veamos las funciones y los argumentos de cada una. Dependiendo de la acción se invocará a su función correspondiente:

  1. cargarImagenLocalEImprimir(String ubicacionImagen, int tamano, int anchoMaximo)
  2. corte(int lineas)
  3. corteParcial()
  4. descargarImagenDeInternetEImprimir(String urlImagen, int tamano, int anchoMaximo)
  5. deshabilitarElModoDeCaracteresChinos()
  6. escribirTexto(String texto)
  7. establecerAlineacion(int alineacion)
  8. establecerEnfatizado(bool enfatizado)
  9. establecerFuente(int fuente)
  10. establecerImpresionBlancoYNegroInversa(bool invertir)
  11. establecerModoDeImpresionAlReves(bool alReves)
  12. establecerRotacionDe90Grados(bool rotar)
  13. establecerSubrayado(bool subrayado)
  14. establecerTamanoFuente(int multiplicadorAncho, int multiplicadorAlto)
  15. feed(int lineas)
  16. habilitarElModoDeCaracteresChinos()
  17. imprimirCodigoDeBarras(String tipo, String datos, int tamano, int ancho, int alto)
  18. imprimirImagenEnBase64(String imagenCodificadaEnBase64, int tamano, int anchoMaximo)
  19. iniciar()
  20. pulso(int pin, int tiempoEncendido, int tiempoApagado)
  21. textoSegunPaginaDeCodigos(int numeroPagina, String pagina, String texto)

Entonces por ejemplo la acción EstablecerTamañoFuente va a invocar a establecerTamanoFuente, y el arreglo de argumentos debe tener 2 valores de tipo int que serán pasados a la función.

Obtener impresoras

Si invocas a http://localhost:8000/impresoras puede que obtengas la lista de impresoras disponibles, pero no lo recomiendo pues varias veces se queda esperando por siempre.

Lo recomendado es que averigües la MAC de la impresora desde el plugin en Ver impresoras disponibles.

Algunas otras cosas importantes

En mi impresora PT-210 debo invocar a Iniciar cada vez que imprimo una imagen. En esa misma impresora tampoco puedo definir caracteres personalizados.

Este plugin para Android está basado (pero no es compatible de ningún modo) en mi plugin para impresoras térmicas USB versión 3, mucha documentación de ahí ayudará a entender lo mostrado aquí.

El ancho de las imágenes siempre debe ser múltiplo de 8.

Los métodos que imprimen imágenes, códigos QR, códigos de barras, imágenes locales, de internet y en base64 usan la misma función de impresión de imágenes, así que procura que el ancho siempre sea múltiplo de 8.

El tamaño de la imagen no se refiere a los pixeles, sino a una redimensión de la imagen al ser impresa. Revisa la documentación del plugin versión 3 pues ahí hay más información:

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.