es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener el estado de una impresora de red usando el socket de C#?

Tengo una API web ASP .NET y una impresora de red (Epson TM-U220). Necesito obtener el estado de la impresora en el código de Epson e intenté hacerlo de la siguiente manera. Pero solo obtengo el estado de “lista para imprimir”. Cuando el estado es ocupado, sin papel, puerta abierta u otros, el socket se queda esperando y la API falla. No obtengo ninguna respuesta en esa situación.

var server = "<dirección ip="" de="" la="" impresora="">";

Socket clientSocket = new Socket(AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp);
clientSocket.NoDelay = true;

IPAddress ip = IPAddress.Parse(server);
IPEndPoint ipep = new IPEndPoint(ip, 9100);
clientSocket.Connect(ipep);

var command = "" + (char)27 + (char)97 + (char)14;  // Comando Epson para obtener el estado de la impresora
byte[] commandBytes = Encoding.ASCII.GetBytes(command);

clientSocket.Send(commandBytes);
var statusCode = clientSocket.Receive(commandBytes);
clientSocket.Close();

Si la impresora está lista, el código de estado será 3. No obtengo ningún otro código.</dirección>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c#, asp.net, sockets, impresión e impresoras de red, entiendo que obtener el estado de una impresora Epson requiere enviar un comando a través de una conexión de socket. Sin embargo, el código proporcionado solo devuelve el estado de “listo” de la impresora, y el socket espera indefinidamente en caso de otros estados como “ocupado”, “sin papel” o “puerta abierta”.

    Para solucionar este problema, es necesario manejar la conexión de socket de forma asíncrona y utilizar un tiempo de espera para evitar esperas indefinidas. Una forma de lograr esto es utilizando los métodos BeginConnect y EndConnect de la clase Socket para conectarse a la impresora de forma asíncrona. Luego, se pueden utilizar los métodos BeginReceive y EndReceive para recibir de forma asíncrona el estado de la impresora y agregar un tiempo de espera al método EndReceive para evitar esperas indefinidas de una respuesta.

    Aquí tienes un ejemplo de cómo implementar esta solución:

    var servidor = "<dirección ip="" de="" la="" impresora="">";
    
    Socket clienteSocket = new Socket(AddressFamily.InterNetwork, 
    SocketType.Stream, ProtocolType.Tcp);
    clienteSocket.NoDelay = true;
    
    IPAddress ip = IPAddress.Parse(servidor);
    IPEndPoint puntoFinal = new IPEndPoint(ip, 9100);
    
    // Conectarse a la impresora de forma asíncrona
    IAsyncResult resultado = clienteSocket.BeginConnect(puntoFinal, null, null);
    bool exito = resultado.AsyncWaitHandle.WaitOne(5000); // Tiempo de espera de 5 segundos
    if (!exito)
    {
        // Falló la conexión
        throw new Exception("Tiempo de espera para la conexión con la impresora.");
    }
    
    // Enviar comando Epson para obtener el estado de la impresora
    var comando = "" + (char)27 + (char)97 + (char)14;
    byte[] bytesComando = Encoding.ASCII.GetBytes(comando);
    
    clienteSocket.Send(bytesComando);
    
    // Recibir el estado de la impresora de forma asíncrona
    byte[] bytesRespuesta = new byte[1];
    resultado = clienteSocket.BeginReceive(bytesRespuesta, 0, 1, SocketFlags.None, null, null);
    exito = resultado.AsyncWaitHandle.WaitOne(5000); // Tiempo de espera de 5 segundos
    if (!exito)
    {
        // Tiempo de espera de recepción agotado
        throw new Exception("Tiempo de espera para recibir el estado de la impresora.");
    }
    
    // Obtener el código de estado de la impresora
    int codigoEstado = bytesRespuesta[0];
    
    clienteSocket.Close();
    

    Este código se conecta a la impresora de forma asíncrona con un tiempo de espera de 5 segundos y envía el comando Epson para obtener el estado de la impresora. Luego, recibe el estado de la impresora de forma asíncrona con un tiempo de espera de 5 segundos y extrae el código de estado del arreglo de bytes de respuesta.

    Con esta solución, deberías poder obtener el estado de la impresora Epson de manera confiable sin que se estrelle tu API o espere indefinidamente.</dirección>

Comments are closed.