Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 143 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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 

  • Este tópico foi criado há 143 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...