Ir al contenido


Foto

Componente de puerto serial Delphi XE5 en Android


  • Por favor identifícate para responder
23 respuestas en este tema

#1 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 27 mayo 2014 - 02:53

En este momento estamos trabajando con bluetooth para android como puerto Serial, es bastante fácil controlar dispositivos con Bluetooth, hemos diseñado tanto el hardware como el software.

Les comparto el componente y un ejemplo para la transmisión de datos vía bluetooth como puerto serial.


TBLUEPORT COMPONENT

El TBluePort es un componente que permite la conexión de manera sencilla desde Android a dispositivos Bluetooth en configuración de puerto serial.  Encapsula el API de Android utilizando la librería Androidapi.JNI.BluetoothAdapter publicada por  RedTitan Technology 2013, http://www.delphigea...0/10162/go.aspx

Propiedades
IsEnabled: Campo Booleano que permite determinar si el dispositivo Bluetooth está activo en el sistema, es una propiedad de solo lectura.
Ej.  If BluePort1.IsEnabled then…

PortList: Campo de tipo TStringList, retorna una lista de los dispositivos Bluetooth disponibles, en formato nombre=MAC,  cada elemento de esta lista se puede utilizar como información para asignar el puerto.


delphi
  1. Ej.
  2. procedure TForm4.FormCreate(Sender: TObject);
  3. begin
  4.   If BluePort1.IsEnabled then
  5.       ListBox1.Items.text := BluePort1.PortList.text;
  6. end;



Active: Permite conectar o desconectar del puerto previamente seleccionado.
Ej.  BluePort1.Active := True;
Ej.  If BluePort1.Active then…

Port: Especifica el nombre del puerto y la dirección MAC correspondiente al dispositivo bluetooth, el campo es de tipo texto y debe tener la forma  nombrepuerto=MACAddress, en su defecto puede contener solamente la MAC.
Ej.  BluePort1.Port := ‘BOLUTEC=00:15:FF:F3:PE:38’

SleepTime: Corresponde al tiempo en milisegundos que espera la multitarea de lectura antes de revisar el Puerto nuevamente.




Eventos:
OnAfterClose: Este evento responde a la acción de desconectar el puerto asignando False a la propiedad Active,  no reconoce la desconexión del puerto por perdida de la conectividad con el dispositivo bluetooth asociado.
Ej.


delphi
  1. procedure TForm4.BluePort1AfterClose(Sender: TObject);
  2. begin
  3.   Toast('se ha desconectado de ' + BluePort1.Port + ')');
  4.   BtnConnect.Enabled := Not BluePort1.Active;
  5.   BtnDisconnect.Enabled := BluePort1.Active;
  6. end;


OnAferOpen: El evento se dispara al realizar la conexión y únicamente si la conexión fue exitosa, en este caso la propiedad Active ya se encuentra en True.
Ej.


delphi
  1. procedure TForm4.BluePort1AfterOpen(Sender: TObject);
  2. begin
  3.   Toast('se ha conectado a ' + BluePort1.Port + ')');
  4.   BtnConnect.Enabled := Not BluePort1.Active;
  5.   BtnDisconnect.Enabled := BluePort1.Active;
  6.  
  7. end;



OnBeforeClose: Evento que responde a la orden de desconectarse,  cambiando la propiedad Active a False.
Ej.


delphi
  1. procedure TForm4.BluePort1BeforeClose(Sender: TObject);
  2. begin
  3.   Toast('se está desconectado de ' + BluePort1.Port + ')');
  4. end;



OnBeforeOpen: Evento que responde a la orden de conectarse, cambiando la propiedad Active a True.
Ej.


delphi
  1. procedure TForm4.BluePort1BeforeOpen(Sender: TObject);
  2. begin
  3.   Toast('Conectando a ' + BluePort1.Port + ')');
  4. end;



OnDataRx: Existe una multitarea que revisa el stream de entrada del puerto en Android, en caso de encontrarse información, la almacena en un Array of Bytes de tipo TBytes o TArray<System.Byte>.
Ej.



delphi
  1. procedure TForm4.BluePort1DataRx(Data: TArray<System.Byte>; len: Integer);
  2. Var
  3.   S: String;
  4.   I: Integer;
  5. Begin
  6.   //Convierte el array en un string
  7.  
  8.   S := '';
  9.   For I := 0 to len - 1 do
  10.   begin
  11.       S := S + Chr(Data[I]);
  12.   end;
  13.  
  14.   //Actualiza los componentes visuales.
  15.  
  16.   tThread.Queue(Nil,
  17.       procedure
  18.       begin
  19.         Try
  20.             Memo1.Lines.BeginUpdate;
  21.             Memo1.Lines.text := Memo1.Lines.text + S;
  22.         Finally
  23.             Memo1.Lines.EndUpdate
  24.         End;
  25.       end);
  26.  
  27. end;



OnDataTx: El evento se ejecuta justo antes de enviar la información al puerto.

Ej.


delphi
  1. procedure TForm4.BluePort1DataTx(Data: TArray<System.Byte>; len: Integer);
  2. Var
  3.   S: String;
  4.   I: Integer;
  5. begin
  6.   S := '';
  7.   For I := 0 to len - 1 do
  8.   begin
  9.       S := S + Chr(Data[I]);
  10.   end;
  11.  
  12.   tThread.Queue(Nil,
  13.       procedure
  14.       begin
  15.         Try
  16.             Memo1.Lines.BeginUpdate;
  17.             Memo1.Lines.text := Memo1.Lines.text + S;
  18.         Finally
  19.             Memo1.Lines.EndUpdate
  20.         End;
  21.       end);
  22. end;



Métodos

Procedure Write(Value: String): Permite enviar al Puerto un string,  el componente convierte cada carácter en un byte, asignándolo a una posición de un byte en el buffer de envío, por lo tanto no es necesario declarar el string de ningún tipo particular.
Ej. Blueport1.Write(‘Este es el texto a envíar’);

Procedure Write(Value: Integer):  Permite enviar un entero o byte por el Puerto serial bluetooth.
Ej. BluePort1.Write(65);

Procedure Write(Value: TBytes): Permite enviar un array de bytes al Puerto.
Ej.

delphi
  1. BluePort1.Write(TBytes.Create($A, $45, $FF, $10));



Procedure Write(Stream: TStream):  Permite enviar el contenido de un stream directamente al puerto


delphi
  1. procedure TForm4.BtnEnviarClick(Sender: TObject);
  2. Var
  3.   St : TMemoryStream;
  4. begin
  5.   St := TMemoryStream.Create;
  6.   St.LoadFromFile(FileName);
  7.   St.Position := 0;
  8.   BluePort1.Write(St);             
  9. end;







Espero sus comentarios y mejoras al mismo.

saludos.
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 27 mayo 2014 - 03:09

Gracias por compartir la información
  • 0

#3 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 mensajes
  • LocationEspaña

Escrito 27 mayo 2014 - 11:23

Gracias por el aporte

(y)
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 mayo 2014 - 06:51

Gracias Gustavo, muy buen aporte.  (y)
  • 0

#5 Jhonny

Jhonny

    Member

  • Miembros
  • PipPip
  • 29 mensajes

Escrito 28 mayo 2014 - 09:44

¡Genial aporte!, me pregunto si es posible generar una "conexión a un dispositivo que ya está siendo usado", es decir, algo así como cuando uno conecta al celular un audífono Bluetooth y recibe una llamada... digamos que el usuario quiera grabar todas las llamadas recibidas al dichoso audífono, pero no las demás o que para alguna eventual aplicabilidad necesitemos saber que botones presiona en el audífono mientras habla.

¿Es posible hacerlo?
  • 0

#6 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 28 mayo 2014 - 03:44

Buena pregunta Jhonny, trataré de buscar información al respecto.

Saludos.
  • 0

#7 FerPatto

FerPatto

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 26 septiembre 2014 - 01:03

Un gran aporte.... felicidades...
utilizo el componente para imprimir un reporte en una impresora portatil
imprime todo bien excepto cuando se imprime el codigo de barras del reporte q esta en una bmp puedes darme una mano para poder solucionar ese punto????
  • 0

#8 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 27 septiembre 2014 - 04:08

Hola

Has intentado hacer la impresión desde Windows con un componente de puerto serial normal como el comport?  si no te funciona desde allí es porque la impresora está esperando algunos comandos que le indiquen que va a recibir un bitmap y no un texto.

Podrías mostrar algo del código con el cual estas imprimiendo.

Saludos.
  • 0

#9 FerPatto

FerPatto

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 28 septiembre 2014 - 08:18

Muchas gracias por la respuesta, lo que hago es lo siguiente

1ro. Utilizo una impresora portatil SP-RMT9 China
2do utilizo el componente BluePort1 (antes utilizaba la libreria Android.JNI...)
3ro. mi codigo fuente al enviar a imprimir es el siguiente.


delphi
  1. //esta parte funciona perfectamente envio el texto del comprobante...
  2.   St := TMemoryStream.Create;
  3.   St.LoadFromFile('/sdcard/Download/comprobante.txt');
  4.   St.Position := 0;
  5.   BluePort1.Write(St);
  6.   St.Free;
  7. //a continuacion simplemente cambie el archivo a enviar el codigo lo genera el app para cada movimiento
  8.   St := TMemoryStream.Create;
  9.   St.LoadFromFile('/sdcard/Download/cdbrr.bmp');
  10.   St.Position := 0;
  11.   BluePort1.Write(St);
  12.   St.Free;
  13. //la impresora recibe la orden ... imprime 5 caracteres basura y saca un buen tanto de papel en blanco.....




  • 0

#10 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 01 octubre 2014 - 06:09

Hola

Si, allí se ve el problema, estas imprimiendo un texto igual que imprimir un gráfico y no puede ser así, la impresora no sabe como imprimir un gráfico, a menos que se lo indiques de alguna manera.

No se como funciona la impresora que mencionas, pero debes buscar el manual y ver como se imprimen gráficos en ella,  en Windows es fácil, ya que existen los Drivers, pero aquí estas bajando de nivel y todo lo tienes que indicar tu.

Debe existir una secuencia de comandos que le indiquen a la impresora que vas con un bitmap.  tendrías que buscar el manual técnico de la impresora o preguntarle directamente a los fabricantes.

Saludos.
  • 0

#11 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 10 octubre 2014 - 04:27

hola, esta muy interesante el componente, sinembargo he probado la demos que biene y me lanza el siguiente mensaje:

No fue posible conectarse al servicio! java.io.IOException: read failed, socket might closed or timeout, read ret: -1.


que podra ser?....
Saludos!
  • 0

#12 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 11 octubre 2014 - 02:57

Hola, eso no me ha pasado hasta ahora, ese tipo de error, pero es algo común no tener activo el BlueTooth, así que te recomiendo que revises si está activo y si no existe alguna otra aplicación utilizándolo.  (recomendación: reinicia el dispositivo y verifica que esté activo el bluetooth).

retroalimentanos por favor si encuentras la solución

Saludos.
  • 0

#13 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 13 octubre 2014 - 02:00

Hola, eso no me ha pasado hasta ahora, ese tipo de error, pero es algo común no tener activo el BlueTooth, así que te recomiendo que revises si está activo y si no existe alguna otra aplicación utilizándolo.  (recomendación: reinicia el dispositivo y verifica que esté activo el bluetooth).

retroalimentanos por favor si encuentras la solución

Saludos.


Hola , despues de reiniciar el telefono ahora me salta este error al seleccionar un dispositivo.

No fue posible conectarse al servicio! Java.io.IOException: Service discovery failed.

No se porque me lo da, el bluetooth esta encendido.

Saludos!


  • 0

#14 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 13 octubre 2014 - 05:10

Hola, definitivamente el Bluetooth no está encendido o el api del dispositivo no es compatible con el componente.  (eso creo), alguien nos puede ayudar con esto? 

Que pena no poder ayudarte más, te recomiendo que pruebes en otro dispositivo, a ver si es la versión del Sistema operativo o del hardware que no es compatible.

Saludos.
  • 0

#15 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 16 octubre 2014 - 10:56

Hola, definitivamente el Bluetooth no está encendido o el api del dispositivo no es compatible con el componente.  (eso creo), alguien nos puede ayudar con esto? 

Que pena no poder ayudarte más, te recomiendo que pruebes en otro dispositivo, a ver si es la versión del Sistema operativo o del hardware que no es compatible.

Saludos.


¿Podria afertar la api del android?, por cierto lo he probado en el delphi xe6, ¿Podria haber alguna incompatibilidad ?
pd: la unit toast no esta incluida , en la demo es utilizada y tube que buscar una por alli.

Saludos!
  • 0

#16 jgarcias2

jgarcias2

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 29 marzo 2015 - 11:03

Hola, 

 

donde esta el componente para descargar y probarlo ??

 

Gracias y saludos


  • 0

#17 anubis

anubis

    Advanced Member

  • Miembros
  • PipPipPip
  • 53 mensajes
  • LocationMéxico

Escrito 29 marzo 2015 - 07:14

Hola, 

 

donde esta el componente para descargar y probarlo ??

 

Gracias y saludos

 

En el primer mensaje está el enlace al componente ¿No?

 

un saludo


  • 0

#18 jgarcias2

jgarcias2

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 31 marzo 2015 - 04:10

Ok, gracias, si pero no funciona el link. Ya me lo ha pasado genriquez. El problema que trato de solucionar ahora es el siguiente :

 

[DCC Error] Android.JNI.Toast.pas(79): E2003 Undeclared identifier: 'SharedActivityContext'
[DCC Error] Android.JNI.Toast.pas(79): E2003 Undeclared identifier: 'StrToJCharSequence'
 
Y la verdad es que no se que hacer ya ..., os ha pasado a alguien esto ?
 
Postdata: estoy con delphi xe7, no se si será por eso ...
 
Gracias por su ayuda a genriquez 

  • 0

#19 jgarcias2

jgarcias2

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 01 abril 2015 - 01:47

Queria compartir con vosotros que ya he encontrado la solucion, como estoy usando la version xe 7, a partir de la version xe6 se tiene que poner 

 

 Androidapi.Helpers

 

en uses, por que es la libreria donde se declaran las variables que me fallaban.

 

Saludos


  • 1

#20 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 01 abril 2015 - 03:38

gracias por compartir la solución


  • 0




IP.Board spam blocked by CleanTalk.