Resolvendo problemas

A decadas resolvo problemas de outras pessoas(empresas) usando código. Aconteceu de eu precisar resolver um problema aqui em casa com software.

Qual é o problema

Comprei uma impressora térmica para não gastar mais com cartuchos de impressão. Comprei a Peripage A40, o problema, ela comunica somente via bluetooth com o aplicativo Android/IoS.

Eu gostaria que essa impressora funcionasse como uma impressora de rede e que fosse detectada automaticamente assim que eu colocasse ela na rede.

A solução

O que eu já tinha rodando em casa:

  • Uma raspberry pi modelo B
  • Uma variação bem enxuta do debian - DietPI

Já uso esse equipamento para bloquear anúncios, usando o pihole. Funciona muito bem, mas eu apenas instalei, agora eu precisava do seguinte:

  • Conversar com a impressora via bluetooth
  • Expor para a rede a interface da impressora(torna-la pública na rede)
  • Receber o job de impressão e enviar para a impressora

Resolvi criar uma solução que visesse exatamente isso.

Como funciona essa gambiarra

Basicamente transformei um computadorzinho (Raspberry Pi) numa ponte entre a minha rede WiFi e a impressora Bluetooth. Pensa assim: a impressora só fala "bluetoothês", mas os computadores da casa falam "rede". O Raspberry fica no meio traduzindo essa conversa.

O que foi feito

Criei um programinha em Go que roda nesse Raspberry e faz essas coisas:

  1. Interface IPP na porta 631 - Qualquer dispositivo na rede pode mandar um trabalho de impressão usando o protocolo IPP padrão (o mesmo do CUPS). Funciona direto no diálogo de impressão do Linux, macOS e Windows
  2. Conversa com a impressora via Bluetooth - Usa RFCOMM para se conectar à Peripage
  3. Reconexão automática - Se a impressora desconectar, ele detecta e tenta reconectar automaticamente
  4. Fila de impressão - Um worker em background que gerencia jobs com estado individual (pendente, processando, concluído, abortado)
  5. API de configuração - É possível alterar o MAC do bluetooth e modelo da impressora em tempo de execução via REST API, sem precisar reiniciar
  6. Página web com status - Mostra conexão, nível de bateria, fila de impressão, e updates em tempo real via WebSocket

Formatos suportados

A impressora térmica só entende imagens, mas o hotPrinter converte automaticamente:

  • Imagens: PNG, JPEG
  • Texto plano
  • PDF (via pdftoppm)
  • PostScript (via Ghostscript)

Diagrama de blocos (como as peças se encaixam)

blocos

Diagrama de sequência (como acontece a mágica)

sequencia

O fluxo resumido

Você manda imprimir → Rede WiFi → Raspberry → Bluetooth → Peripage → Papel! 🎉

A parte legal é que depois de configurar, a impressora aparece automaticamente nos computadores da casa via mDNS/Bonjour (Avahi). No Linux e Mac aparece direto no diálogo de impressão. No Windows dá pra adicionar manualmente usando o endereço ipp://raspberry:631/ipp/print.

Se não quiser usar a detecção automática, basta adicionar manualmente no CUPS:

lpadmin -p Peripage -E \
  -v ipp://raspberry:631/ipp/print \
  -m everywhere

A página web (http://raspberry:8080) mostra status em tempo real (via WebSocket), bateria, fila de impressão e permite imprimir uma página de teste. Para quem prefere CLI, tem endpoints REST:

# Ver status da impressora
curl http://raspberry:8080/api/status

# Configurar impressora em runtime
curl -X POST http://raspberry:8080/api/config \
  -H "Content-Type: application/json" \
  -d '{"bluetooth":{"mac":"AA:BB:CC:DD:EE:FF","model":"A40"}}'

# Imprimir direto (sem passar pelo diálogo do sistema)
curl -F "file=@documento.pdf" http://raspberry:8080/api/print

O código tá em Go, que é uma linguagem que compila pra binário pequeno e rápido - perfeito pra rodar num Raspberry Pi antigo que já tava fazendo outras coisas aqui em casa (bloquear anúncios com Pi-hole).

O nome do projeto? hotPrinter - porque é uma impressora térmica que fica na rede, sempre pronta pra receber trabalhos. 🔥

web ui