Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Conectando Impresora por Bluetooth = Error Socket (https://www.clubdelphi.com/foros/showthread.php?t=90814)

jhonalone 10-09-2016 01:15:29

Conectando Impresora por Bluetooth = Error Socket
 
Hola, amigos.

Intento imprimir recibos desde un smartfone a una impresora inalámbrica por BlueTooth.
Estuve indagando en el foro y en internet varios días y no encontré una solución satisfactoria.

Uso Delphi10 Seattle.

Encontré un ejemplo en la dirección C:\RadStudio10\17.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Bluetooth\Classic Bluetooth Basic app.

Comencé a hacer pruebas con con este proyecto de ejemplo de Embarcadero y he llegado a la conclusión de que tiene un problema al crear el socket para la conexión.

El error que da la aplicación compilada y SIN MODIFICACIÓN DE CÓDIGO es el siguiente:

java.io.IOException: read failed, socket might closed or time out, read ret:-1

He intentado localizar el error con el siguiente código:

Código Delphi [-]
procedure TForm1.SendData;
var
  ToSend: TBytes;
  LDevice: TBluetoothDevice;
begin
  if (FSocket = nil) or (ItemIndex <> ComboboxPaired.ItemIndex) then
  begin
  ShowMessage('Socket = Nil o bien el índice ha cambiado'); // Linea añadida por mi
    if ComboboxPaired.ItemIndex > -1 then
    begin
      LDevice := FPairedDevices[ComboboxPaired.ItemIndex] as TBluetoothDevice;
      DisplayR.Lines.Add(GetServiceName(ServiceGUI));
      DisplayR.GoToTextEnd;
      FSocket := LDevice.CreateClientSocket(StringToGUID(ServiceGUI), False);
      if FSocket <> nil then
      begin
        ShowMessage('Socket no es Nil'); // Linea añadida por mi
        ItemIndex := ComboboxPaired.ItemIndex;
        FSocket.Connect;  // EL ERROR ESTA AQUÍ AL CONECTAR (¡?)
        if not (FSocket.Connected) then ShowMessage('Socket NO CONECTADO'); // Linea añadida por mi
        if (FSocket.Connected) then ShowMessage('Socket HE CONECTADO'); // Linea añadida por mi
        ToSend := TEncoding.UTF8.GetBytes(Edit1.Text);
        FSocket.SendData(ToSend);
        DisplayR.Lines.Add('Text Sent');
        DisplayR.GoToTextEnd;
      end
      else
        ShowMessage('Out of time -15s-');
    end
    else
      ShowMessage('No paired device selected');
  end
  else
  begin
    ShowMessage('Socket <> Nil o bien el índice NO ha cambiado'); // Linea añadida por mi
    ToSend := TEncoding.UTF8.GetBytes(Edit1.Text);
    FSocket.SendData(ToSend);
    DisplayR.Lines.Add('Text Sent');
    DisplayR.GoToTextEnd;
  end;
end;

El código es el original de Embarcadero, yo solamente he añadido los mensajes para descubrir el punto del error.

El resultado ha sido:
Dos mensajes.
El primero: "Socket = Nil o bien el índice ha cambiado".
El segundo: "Socket no es Nil".
El Tercer mensaje, sería si ha conectado o no.
PUES EL ERROR SALTA ANTES DE EMITIR EL tercer mensaje: éste no aparece.

Lo más "gracioso" es que detecta la impresora y al pulsar el "ComboBoDevices" aparece en la lista detectada y lo puedes seleccionar. Y LA SELECCIONA.

Pero cuando cambias al tab "SERVICE DEMO" y pulsas el boton "Send Texto-> Thermal Printer"
entonces aparecen los dos mensajes mencionados y a continuación el mensaje de error en el Memo1.

No se si el problema está en que no crea un GUID adecuado para la impresora, o si le asignas una impresora bluetooth el socket NO SE CREA.

NO LE ENVIO UN CÓDIGO DE ESCAPE A LA IMPRESORA, PORQUE LA APP, HE COMPROBADO QUE NO LLEGA HASTA AHÍ.

Espero una respuesta al problema, y si no la recibo, tendré que cancelar el proyecto. Pues todo él se basa en la posibilidad de imprimir BlueTooth.

Un gran saludo para todos y especialmente a los que han conseguido leer hasta aquí.

Mis disculpas por el ROLLAZO. Pero como dice Neftalí "Más tiempo dedicado a la pregunta=Mejores respuestas."

Gracias por anticipado a los que puedan ayudarme.

Saludos para todos. Gracias por mantener este foro de consulta durante tantos años.

wramirez 15-09-2016 15:36:28

Impresora Bluetooth
 
Saludos a Todos
Ese Mismo problema me pasa a mi he intentado varios código pero siempre me el mismo error en el socket , por favor si alguien sabe de esto que nos ayude a resolverlo Gracias..

jhonalone 15-09-2016 21:26:14

Hola wramirez.

Tengo que darte una buena noticia. ESTOY EN EL BUEN CAMINO.

Si te esperas unos 15 días para que confirme mis expectativas, espero tenerlo resuelto. Ya te subiré el código cuando compruebe que funciona 100x100.

Un saludo.

Neftali [Germán.Estévez] 16-09-2016 09:59:27

Cita:

Empezado por jhonalone (Mensaje 508663)
...Pero como dice Neftalí "Más tiempo dedicado a la pregunta=Mejores respuestas."

:eek::eek::eek:
Pensé que nadie leía nunca ese mensaje... ;)

Lo primero que se me ocurre es si tienes bien configurados todos los permisos. Sería lo primero por lo que se denegaría la conexión.

Por otro lado aquí tenéis alguien que está intentando hacer algo similar. Revisad el código a ver si os sirve de ayuda:
http://stackoverflow.com/questions/2...rtable-printer

Echadle un vistazo también a este componente:
http://hyperbasesuite.blogspot.com.e...-conexion.html

A ver si vamos aclarando algo...

jhonalone 16-09-2016 18:04:32

1 Archivos Adjunto(s)
Gracias, Neftalí.
Precisamente he estado trabajando sobre el link de StackOverflow.

He conseguido conectar con la impresora y enviarle texto. Lástima que haya tenido que devolver la impresora, pues parecía muy completa. Sólo un problema la pongo: no escribe la "Ñ,ñ" ni las vocales acentuadas. He probado todos los juegos de caracteres que venían en el "Programmer Manual" y todos los que venían en el test de la impresora. Una pena de servicio técnico y, además de venir los manuales sólo en inglés y chino, no te permitían imprimir los ".pdf". La marca, por si le interesa a alguien, es "Excelvan E300".

Basado en este link he conseguido enviar texto.

Dejo aquí el ".zip" con el programa de prueba por si interesa a alguien. Lo digo por ti wramirez

Evidentemente, los códigos de Escape habrá que modificarlos de acuerdo con el manual de cada impresora. (aunque la mayoría suelen ser iguales tanto los que siguen el sistema Epson como los de IBM, que suelen ser los más comunes)

Espero que le sirva a alguien.
Saludos a todos.

jhonalone 16-09-2016 18:54:41

Bueno.

Se me olvidaba deciros, que al compilar da un mensaje de error que no sé por qué, pero que no afecta al funcionamiento de la apk. Dice "Error: Field Form1.Impresora does not have a corresponding component. Remove the declaration?"
No hace falta que os diga que debéis responder "No"

Además, podéis quitar el componente "BlueToothLE1", ya que lo puse para hacer unas pruebas, pero funciona exactamente igual sin él.

Saludos de nuevo.

Neftali [Germán.Estévez] 16-09-2016 22:18:58

Gracias por la explicación y el ejemplo.
^\||/^\||/^\||/

AgustinOrtu 17-09-2016 06:12:23

Cita:

Empezado por jhonalone (Mensaje 508848)
Bueno.

Se me olvidaba deciros, que al compilar da un mensaje de error que no sé por qué, pero que no afecta al funcionamiento de la apk. Dice "Error: Field Form1.Impresora does not have a corresponding component. Remove the declaration?"
No hace falta que os diga que debéis responder "No"

Además, podéis quitar el componente "BlueToothLE1", ya que lo puse para hacer unas pruebas, pero funciona exactamente igual sin él.

Saludos de nuevo.

No debería suceder lo que describes. Eso significa que hay algún problema de sincronización entre el .pas y el .dfm (no he descargado el proyecto)

Por lo general pasa si se editan a mano algunos archivos y se eliminan referencias; también puede pasar el algún copia-pega o deshacer que falla. Lo que podés hacer para solucionarlo es, seleccionar el componente impresora, hacerle un cortar (control + x) y pegarlo: al insertar el componente nuevamente, Delphi va a volver a generar las referencias necesarias.

Te lo digo porque es como que el form no conoce al componente, entonces si tenés configurada algunas propiedades y/o eventos en diseño te podés llegar a encontrar con problemas raros en tiempo de ejecución

Si lo que propongo arriba no lo soluciona yo reconstruiría el proyecto entero, antes de que se haga más grande

jhonalone 17-09-2016 13:22:21

Gracias, Agustín, por tu interés.

No me había preocupado por el tema, porque no me daba error en tiempo de ejecución. Y porque este proyecto era sólo para conectar con la impresora por Bluetooth.
Pero ahora he intentado resolverlo. No ha funcionado corta/pega.
Pero he visto que ¡SOY UN ANIMAL...! Tenía declarada la variable "Impresora : TBluetoothDevice;" ¡por encima de la directiva private!.

Bueno, a lo que vamos.
¡He conseguido escribir en la impresora las Ñs y los acentos.!.
Resulta que los códigos de Escape para manipular la impresora deben ir codificados en ASCII, el juego de caracteres debe ser WPC1252(Latin-1) y el texto enviado a la impresora debe ir codificado en Unicode. Al menos en mi impresora...

Dejo las modificaciones en el código del proyecto por si interesan a alguien.
Código Delphi [-]
if FSocket.Connected
     then Begin
          Texto := #27 + #64;
          BytesEnviados := TEncoding.ASCII.GetBytes(Texto);
          FSocket.SendData(BytesEnviados);
          Texto := #27 + 't' + #16; // Selecciona juego de caracteres WPC1252(Latin-1)
          BytesEnviados := TEncoding.ASCII.GetBytes(Texto);
          FSocket.SendData(BytesEnviados);
          Texto := #27 + '!' +#0; //  Tamaño normal de la fuente
          BytesEnviados := TEncoding.ASCII.GetBytes(Texto);
          FSocket.SendData(BytesEnviados);
          Texto := #27 + 'Hola mundo con ñ y Ñ,  hola España CAÑÍ' + #10; // Envia el escrito y alimenta una línea
          // Texto := #27 +Edit1.Text + #10; // Envia el escrito y alimenta una línea
          BytesEnviados := TEncoding.Unicode.GetBytes(Texto);
          FSocket.SendData(BytesEnviados);

          Sleep(200);
          End;

Saludos a todos.

wramirez 17-09-2016 22:14:04

Gracias Hermano.. Quiera Dios y Pueda Resolver eso, porque llevo 1 mes en eso buscando esa solución y nadie ha podido resolvoerlo

jhonalone 18-09-2016 12:28:03

Vale,wramirez.
Pruébalo y me cuentas. Si tienes alguna duda, pregunta en el foro mejor que en privado.
Como habrás leído, a mi me funciona perfectamente.
Saludos.

Rocio90 22-09-2016 14:17:22

Muy bueno muchas gracias

wramirez 22-09-2016 15:51:08

Saludos a Todos:
Resulta que el código que envió jhonalone , solo me funciona en table o windows no tengo idea porque cuando instalo el apk en un samsum s5 sigue dándome el error de socket java.ioexeption, pero desde windows o una table con androide imprimo bien aunque después de la primera impresión da un error socket java.ioexeption y luego vuelvo y le doy e imprime de nuevo. que puedo hacer para que me funciones en un mobil.. lo he probado en varios mobil con diferentes versiones pero no he tenido resultado.
Gracias..

jhonalone 23-09-2016 16:06:40

Hola a todos.
wramirez dijo:
Cita:

Resulta que el código que envió jhonalone , solo me funciona en table o windows no tengo idea porque cuando instalo el apk en un samsum s5 sigue dándome el error de socket java.ioexeption, pero desde windows o una table con androide imprimo bien aunque después de la primera impresión da un error socket java.ioexeption y luego vuelvo y le doy e imprime de nuevo. que puedo hacer para que me funciones en un mobil.. lo he probado en varios mobil con diferentes versiones pero no he tenido resultado.
Dos cuestiones a tener en cuenta:

1.- Respecto al error de Socket.
Lo más probable es que tengas pareados en el teléfono más de un dispositivo además de la impresora.

2.- Respecto a la escritura en sí:
Cada impresora es un mundo y cada dispositivo otro. Con el mismo juego de caracteres
Código Delphi [-]
Texto := #27 + 't' + #16; // Selecciona juego de caracteres WPC1252(Latin-1)
y con el mismo
Código Delphi [-]
TEncoding.Unicode/ASCII/UTF8.GetBytes(Texto)
¡¡¡NO TE VA A ESCRIBIR IGUAL EN TODAS LAS IMPRESORAS.!!! Casi seguro.
Tendrás que adaptar el juego de caracteres y el TEncoding para cada impresora.

Saludos.

jhonalone 23-09-2016 19:22:31

Hola a todos.

¡Ah! wramirez, se me olvidó decirte que te dará este error si tienes la impresora conectada por Bluetooth a otro dispositivo.

No tengo la suerte de tener un móvil Samsung S5 así que lo más que he podido probar es en S4 y a mí me ha funcionado.

Saludos.

eliezerfox 16-05-2018 03:37:19

Resolvido java.io.IOException: read failed, socket might closed or time out
 
1 Archivos Adjunto(s)
Olá a todos.
não vou fica aqui falando sobre o mesmo assunto. " java.io.IOException: read failed, socket might closed or time out, read ret:-1 "
só estou postando o que consegui pra retribuir com todos do fórum pois foi dessa forma em fórum como esse que chequei aqui como desenvolvedor em delphi.

em anexo exemplo em delphi berlin para windows,android.
foi testado em três impressoras top (china) de R$199.00 de marca diferentes.

rjtostado 16-01-2021 22:09:54

Muchas gracias!! me salvaste la vida :D

Neftali [Germán.Estévez] 18-01-2021 13:30:54

Cita:

Empezado por eliezerfox (Mensaje 526294)
...
não vou fica aqui falando sobre o mesmo assunto. " java.io.IOException: read failed, socket might closed or time out, read ret:-1 "
só estou postando o que consegui pra retribuir com todos do fórum pois foi dessa forma em fórum como esse que chequei aqui como desenvolvedor em delphi.


Lo primero agradecer la respuesta y el ejemplo (aunque se a antiguo).
Lo segundo (y no he podido evitarlo) esto me ha hecho daño a la vista... :D:D:D





kuan-yiu 18-01-2021 13:56:15

Creo que está escrito en portugués, no en castellano.

Neftali [Germán.Estévez] 18-01-2021 14:07:31

Cita:

Empezado por kuan-yiu (Mensaje 539716)
Creo que está escrito en portugués, no en castellano.


Pues creo que tienes razón...



La franja horaria es GMT +2. Ahora son las 12:09:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi