Ir para conteúdo
  • Cadastre-se

dev botao

Recommended Posts

Postado

Ola pessoal

Segue outro shell script criado para teste de impressoras ESC/POS no Linux

O objetivo com esse é realizar uma consulta de status ("Transmit real-time status" = DLE EOT) de forma a obter as seguintes informações:

  • Se a impressora está em status Online (DLE EOT 1 - BIT 3 / 0x08)
  • Caso offline, verificar o possível motivo (DLE EOT 2)
    • se a tampa da impressora está aberta (BIT 2 / 0x04)
    • se está sem bobina/inserida incorretamente (BIT 5 / 0x20)

Quem quiser usar, pode salvar o fonte abaixo em um arquivo .sh (ex: check_status_escpos.sh), conceder permissões de leitura e execução para ele (chmod u+rx check_status_escpos.sh) e executar da seguinte forma:

./check_status_escpos.sh ARQ_DEVICE_IMPRESSORA
Ex: ./check_status_escpos.sh /dev/usb/lp0

 

Código fonte:

#!/bin/bash

# Obtem o status de uma impressora ESC/POS
# 16-11-2024 - Paulo Sergio Travaglia
# Parametros
#  1 - device (ex: /dev/usb/lp0)
#
# Dependencias:
# comandos: dd, awk, timeout

if [ $# -lt 1 ]
then
  echo "Uso: $0 PORTA"
  exit 255
fi

p_porta="$1"

########
## MAIN
########

if [ ! -c ${p_porta} ]
then
  echo "Dispositivo nao e um dispositivo caractere"
  exit 1
fi

if [ ! -r ${p_porta} ] || [ ! -w ${p_porta} ]
then
  echo "Nao existe permissao de leitura/gravacao para o usuario $USER"
  exit 2
fi

# submete o comando de obtencao de status online/offline
# Obs: Envia pelo menos 3 vezes o comando, porque durante os testes
# com uma unica submissao eventualmente o byte nao e retornado
# no device associado a porta
  for x in $(seq 3)
  do
    echo 1 | awk '{printf("%c%c%c",0x10,0x04,0x1)}' > ${p_porta}
    if [ $? -ne 0 ]
    then
      echo "Problemas ao tentar enviar o comando para ${p_porta}"
      exit 3
    fi
    sleep 0.1
  done

# Le o byte retornado correspondente ao status
sleep 0.2
v_status=$(timeout --kill-after=1 1 dd if=${p_porta} bs=1 count=1 2>/dev/null | od -d |awk 'NR==1{ if( and(int($NF),8) == 0 ){print "ONLINE" }else{print "OFFLINE"}  }')

if [ "${v_status}" = "OFFLINE" ]
then
  # Verifica o motivo de estar offline
  for x in $(seq 3)
  do
    echo 1 | awk '{printf("%c%c%c",0x10,0x04,0x2)}' > ${p_porta}
    sleep 0.1
  done

  sleep 0.2
  v_motivo_offline=$(timeout --kill-after=1 1 dd if=${p_porta} bs=1 count=1 2>/dev/null | od -d | awk 'NR==1{print $NF}')
  
  v_tampa_aberta=$(echo ${v_motivo_offline} |awk '{ if( and(int($NF),4) == 4 ){print "S" }else{print "N"}}')

  if [ ${v_tampa_aberta} = "S" ]
  then
    echo -n "Offline - A tampa esta aberta"
    exit 200
  else
    
    v_sem_papel=$(echo ${v_motivo_offline} |awk '{ if( and(int($NF),32) == 32 ){print "S" }else{print "N"}}')

    if [ "${v_sem_papel}" = "S" ]
    then
      echo -n "Offline - Sem papel"
      exit 201
    else
      echo -n "Offline - Desconhecido"
      exit 202
    fi
  fi

else
  echo -n "Online"
  exit 0
fi

 

  • Curtir 1
Postado

Nota: a versão do awk precisa ser o gawk, por conta de uma funcao/operador bitwise usado (and) não presente em outras implementações como o mawk 

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.