Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Seja seu próprio CUPS - GambiConf

Seja seu próprio CUPS - GambiConf

Aqui eu conto a minha jornada de como eu fiz a minha impressora wi-fi, uma Epson L355, imprimir sem nenhum tipo de driver de impressão.

Para tal usei Python, Wireshark, um manual dos anos 90, e uma documentação não-oficial dos anos 2000.

Avatar for Arthur Mendes

Arthur Mendes

December 12, 2021

Other Decks in Programming

Transcript

  1. Sobre mim • 24 anos de idade • 4 anos

    de experiência, principalmente em Python • Curioso desde criança • Minha primeira talk ever.
  2. Epson L355 • Jato de tinta • Não possui cartuchos,

    mas um tanque de tinta! • Ótimo consumo • Roda Linux! • É uma multifuncional (inclui scanner) • Funciona via USB e por rede sem fio
  3. Primeiro teste nmap -sS -T4 -A 192.168.1.116 Starting Nmap 7.80

    ( https://nmap.org ) at 2021-12-02 23:22 -03 Nmap scan report for 192.168.1.116 Host is up (0.0071s latency). Not shown: 997 closed ports PORT STATE SERVICE VERSION 80/tcp open upnp Epson Stylus NX230 printer UPnP (UPnP 1.0; Epson UPnP SDK 1.0) |_http-server-header: EPSON_Linux UPnP/1.0 Epson UPnP SDK/1.0 |_http-title: Site doesn't have a title (text/html). 515/tcp open printer 9100/tcp open jetdirect? ... OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 24.07 seconds
  4. Primeiro teste • Porta 515 deve ser interessante, né? ◦

    cat /dev/urandom | nc 192.168.1.116 515 ◦ Nada aconteceu
  5. Será que a impressora entende PostScript? • Hora do Wireshark

    ◦ Não consegui entender NADA ◦ Mas eu tinha certeza que não era PostScript...
  6. Project Gutenprint • É um projeto que cria drivers open-source

    para impressoras • Tinha documentação do protocolo da Epson! • Mas era do começo da década...
  7. Protocolo da Epson? • Chama-se ESC/P2 ◦ Epson Standard Code

    for Printers version 2 • É derivado do ESC/P • Vem desde as impressoras matriciais da Epson • É usado por todas as impressoras jato de tinta da marca • Possui algumas diferenças do ESC/P
  8. Protocolo da Epson? • Cada cor possui, por padrão, 2

    bits de definição ◦ Uma definição maior é possível, mas eu nunca vi.
  9. Protocolo da Epson? • É organizado em “pacotes” ◦ 1b

    69 06 01 02 d4 02 3c 00 Header Conteúdo ◦ 1b 28 53 08 00 a0 0b 00 00 71 10 00 00 Tamanho
  10. Protocolo da Epson? • É necessária uma sequência de bytes

    para que a impressora entenda ESC/P2: 00 1b 01 40 45 4a 4c 20 31 32 38 34 2e 34 0a 40 |...@EJL 1284.4.@| 45 4a 4c 20 20 20 20 20 0a 1b 40 1b 40 1b 28 52 |EJL ..@.@.(R| • Ele é enviado para retirar a impressora do “1284.4 packet mode” • O Project Gutenprint chama isso de “magic command”
  11. Nova folha • Para puxar uma folha nova: 0c 1b

    40 • 0c é o caractere de “form feed” • 1b 40 é um comando de “reset”
  12. • “Magic command” • Comandos de “remote mode” • Ativação

    do modo gráfico • Configuração de página • Impressão da folha Ordem das coisas:
  13. • A impressora movimenta a cabeça de impressão em unidades

    fixas • Elas são setadas com o comando ESC (U • Essas unidades são conhecidas como VUNITS e HUNITS • VUNIT é uma unidade de posição vertical da impressora. ◦ Geralmente é proporcional ao DPI da impressão. ◦ A 360dpi, 1 VUNIT = 1/360 polegadas • HUNIT é uma unidade de posição horizontal da impressora Movimento
  14. Impressão do bitmap ESC (v Puxa um pouco de folha

    Para cada cor: ESC ($ Move a cabeça de impressão horizontalmente ESC i Imprime uma linha do bitmap \r Move a cabeça de volta pro começo da linha 0c 1b 40 Puxa uma folha nova
  15. “Simulador de impressora” • E se eu fingisse ser a

    impressora? • Posso usar a página de teste do CUPS para testar
  16. “Back to the basics” A impressora entende quatro cores •

    Ciano • Magenta • Amarelo • Preto
  17. “Back to the basics” A impressora entende quatro seis cores!

    • Ciano • Magenta • Amarelo • Preto • Preto alternativo 1 • Preto alternativo 2
  18. 6 cores? • Sim, 6 cores! • Os 3 tipos

    de preto não eram diferentes uns dos outros… • O driver de impressão usava os três.
  19. E foi aí que eu entendi, aí que eu saquei...

    • Aparentemente, cada tinta tinha uma posição inicial diferente das outras ◦ (cada “preto” estava pintado de cores diferentes) ◦ eles estavam um em cima do outro, em vez de um após o outro.
  20. Agora todas as peças se encaixaram • Cada tinta começa

    em um lugar diferente: ◦ O amarelo (0x04) e o preto alternativo 2 (0x06) começam a 2/3 polegada antes ◦ O magenta (0x01) e o preto alternativo 1 (0x05) começam a 1/3 polegada antes ◦ O preto (0x0) e o ciano (0x02) começam na linha atual.
  21. • Como eu sei se a impressão deu certo ou

    não? • Eu fui atrás porque achei que seria interessante saber • A impressora emite seu status via SNMP ◦ Simple Network Management Protocol ◦ Ela só faz isso via wireless, aparentemente • O driver do Windows lê esses dados, mas o do Linux não :( Status da impressão
  22. SNMP • Protocolo usado para obter informações de dispositivos •

    O dispositivo expõe algumas variáveis, chamadas OIDs (object identifiers) ◦ exemplo de OID: 1.3.6.1.2.1.1.1 • Esses OIDs estão organizados em repositórios chamados MIBs (Management Information Base) • Alguns deles estão padronizados! ◦ e a impressora suporta alguns (SNMP MIB-2 System, 1.3.6.1.2.1) • Outros ficam num MIB específico da marca (1.3.6.1.4.1)
  23. OIDs da impressora • 1.3.6.1.4.1.1248.1.2.2.1.1.1.1 ◦ Retorna algumas informações da

    impressora: MFG:EPSON;CMD:ESCPL2,BDC,D4,D4PX,ESCPR1;MDL:L355 Series;CLS:PRINTER;DES:EPSON L355 Series;CID:EpsonRGB;FID:FXN,DPN,WFA,ETN,AFN,DAN;RID:00; Criador | Modelo | Descrição
  24. 00000000 40 42 44 43 20 53 54 32 0d

    0a 50 00 01 01 04 06 |@BDC ST2..P.....| 00000010 02 01 ff 0f 0d 03 03 01 69 04 02 69 05 03 69 01 |........i..i..i.| 00000020 00 69 10 03 01 09 4e 13 01 01 19 0c 00 00 00 00 |.i....N.........| 00000030 00 75 6e 6b 6e 6f 77 6e 24 02 00 00 2f 01 01 36 |.unknown$.../..6| 00000040 14 ff ff ff ff ff ff ff ff ee 13 00 00 0c 07 00 |................| 00000050 00 25 00 00 00 37 05 02 00 00 00 00 |.%...7...... | 0000005c Header | Tamanho | Status |Níveis de tinta | Job de impressão | Estatísticas Valor do Status (0=erro, 2=manutenção, 3=imprimindo, 4=idle) No de páginas coloridas | No de paginas P/B
  25. Bibliografia Todos os links abaixo foram acessados por último no

    dia 09/12/2021: • Epson ESC/P Reference Manual: https://epson.ru/upload/iblock/057/esc-p.pdf • The Developer's Guide to Gutenprint: http://gimp-print.sourceforge.net/reference-html/c463.html • CUPS Website: http://www.cups.org/ • Epson Programming Guide for 4 color Inkjet Printer: https://www.epsondevelopers.com/wp-content/uploads/2017/01/ET-4500_L575_L1.pdf • Introdução a SNMP: https://www.gta.ufrj.br/grad/09_1/versao-final/snmp/Redes_I/Introducao.html • https://www.alvestrand.no/objectid/1.3.6.1.2.1.html • https://upload.wikimedia.org/wikipedia/commons/f/f3/Dithering_algorithms.png