Pular para conteúdo

Impressora Zebra ZD230 — Rede e Docker

Configuração de rede para comunicação entre o container Docker e a impressora Zebra ZD230 via socket TCP.

Topologia

┌──────────────────────────────────────────┐
│  Servidor laser-estoque                  │
│  enp1s0: 10.42.0.x                       │
│                                          │
│  ┌─────────────────────┐                 │
│  │ Container web       │                 │
│  │ network_mode: host  │──TCP:9100──→    │
│  └─────────────────────┘            │    │
└─────────────────────────────────────│────┘
                                      │
                                      ↓
                              ┌──────────────┐
                              │ Zebra ZD230  │
                              │ 10.42.0.216  │
                              │ Porta: 9100  │
                              └──────────────┘

Por que network_mode: host?

O Django precisa enviar comandos ZPL diretamente para a impressora via socket TCP (10.42.0.216:9100). Essa impressora está na rede local física (10.42.0.0/24), conectada na interface enp1s0 do servidor.

Com a rede Docker padrão (bridge), o container não consegue alcançar dispositivos na LAN física. As alternativas seriam:

Abordagem Prós Contras
network_mode: host Simples, acesso direto à LAN Menos isolamento
macvlan Container com IP próprio na LAN Complexo, problemas com DHCP
Docker network + rota estática Mais isolado Requer config no router
Proxy TCP no host Isolamento total Mais um serviço para manter

Para um sistema interno em rede controlada, network_mode: host é a solução mais simples e confiável.

Impacto no docker-compose

Como o container web usa rede host, ele se comunica com o PostgreSQL via 127.0.0.1:5432 (o DB publica a porta nesse endereço). O Nginx também precisa de network_mode: host para acessar o Gunicorn em 127.0.0.1:8000.

# docker-compose.prod.yml (trechos relevantes)
services:
  db:
    ports:
      - "127.0.0.1:5432:5432"  # Acessível apenas no host

  web:
    network_mode: host          # Acessa LAN + DB via 127.0.0.1

  nginx:
    network_mode: host          # Acessa Gunicorn via 127.0.0.1

Configuração da Impressora

Dados de conexão

Parâmetro Valor
IP 10.42.0.216
Porta 9100 (RAW/TCP)
Protocolo ZPL (Zebra Programming Language)
Modelo Zebra ZD230
Interface Ethernet

Testar conectividade

Do servidor (host):

# Ping
ping -c 3 10.42.0.216

# Testar porta TCP
nc -zv 10.42.0.216 9100

# Enviar ZPL de teste
echo '^XA^FO50,50^ADN,36,20^FDTeste^FS^XZ' | nc 10.42.0.216 9100

De dentro do container:

docker exec -it laserlab_web bash
apt-get update && apt-get install -y netcat-openbsd
nc -zv 10.42.0.216 9100

No Django

A impressão é feita via socket TCP direto:

import socket

def print_zpl(zpl_code: str, host: str = "10.42.0.216", port: int = 9100):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(10)
        s.connect((host, port))
        s.sendall(zpl_code.encode())

O IP e porta da impressora são configurados no model Printer (app labels).

Troubleshooting

Container não alcança a impressora

  1. Verificar que network_mode: host está no docker-compose.prod.yml
  2. Testar do host primeiro: nc -zv 10.42.0.216 9100
  3. Se o host alcança mas o container não → network_mode não está aplicado

Impressora não responde

  1. Verificar se está ligada e conectada à rede
  2. Verificar IP: pode ter mudado se usa DHCP (fixar IP no router/switch)
  3. Reiniciar a impressora (desligar/ligar)
  4. Verificar no painel da Zebra: Menu → Rede → TCP/IP

Timeout na impressão

  • A impressora pode estar em sleep mode
  • Aumentar o timeout do socket (atualmente 10s)
  • Verificar se há fila de impressão travada (reiniciar impressora)