martes, 27 de mayo de 2014

TBlueport, componente de conexión Android Bluetooth en Delphi XE5

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.delphigear.cn/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.
Ej.
procedure TForm4.FormCreate(Sender: TObject);
begin
   If BluePort1.IsEnabled then
      ListBox1.Items.text := BluePort1.PortList.text;
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.
procedure TForm4.BluePort1AfterClose(Sender: TObject);
begin
   Toast('se ha desconectado de ' + BluePort1.Port + ')');
   BtnConnect.Enabled := Not BluePort1.Active;
   BtnDisconnect.Enabled := BluePort1.Active;
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.
procedure TForm4.BluePort1AfterOpen(Sender: TObject);
begin
   Toast('se ha conectado a ' + BluePort1.Port + ')');
   BtnConnect.Enabled := Not BluePort1.Active;
   BtnDisconnect.Enabled := BluePort1.Active;

end;

OnBeforeClose:  Evento que responde a la orden de desconectarse,  cambiando la propiedad Active a False.
Ej.
procedure TForm4.BluePort1BeforeClose(Sender: TObject);
begin
   Toast('se está desconectado de ' + BluePort1.Port + ')');
end;

OnBeforeOpen: Evento que responde a la orden de conectarse, cambiando la propiedad Active a True.
Ej.
procedure TForm4.BluePort1BeforeOpen(Sender: TObject);
begin
   Toast('Conectando a ' + BluePort1.Port + ')');
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.

procedure TForm4.BluePort1DataRx(Data: TArray<System.Byte>; len: Integer);
Var
   S: String;
   I: Integer;
Begin
   //Convierte el array en un string

   S := '';
   For I := 0 to len - 1 do
   begin
      S := S + Chr(Data[I]);
   end;

   //Actualiza los componentes visuales.

   tThread.Queue(Nil,
      procedure
      begin
         Try
            Memo1.Lines.BeginUpdate;
            Memo1.Lines.text := Memo1.Lines.text + S;
         Finally
            Memo1.Lines.EndUpdate
         End;
      end);

end;

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

Ej.
procedure TForm4.BluePort1DataTx(Data: TArray<System.Byte>; len: Integer);
Var
   S: String;
   I: Integer;
begin
   S := '';
   For I := 0 to len - 1 do
   begin
      S := S + Chr(Data[I]);
   end;

   tThread.Queue(Nil,
      procedure
      begin
         Try
            Memo1.Lines.BeginUpdate;
            Memo1.Lines.text := Memo1.Lines.text + S;
         Finally
            Memo1.Lines.EndUpdate
         End;
      end);
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. BluePort1.Write(TBytes.Create($A, $45, $FF, $10));

Procedure Write(Stream: TStream):  Permite enviar el contenido de un stream directamente al puerto
procedure TForm4.BtnEnviarClick(Sender: TObject);
Var
  St : TMemoryStream;
begin
   St := TMemoryStream.Create;
   St.LoadFromFile(FileName);
   St.Position := 0;
   BluePort1.Write(St);             
end;

Pueden descargar el componente desde

Espero sus comentarios y mejoras del componente.

Si realizan proyectos de este tipo, favor enviar videos del uso del Bluetooth o documentos.

Gracias.




5 comentarios:

  1. No me funciona el componente TBluePort. ¿Alguna sugerencia?

    ResponderEliminar
  2. Hola, podrías ser más específico con la pregunta.

    te invito a www.delphiaccess.com un foro donde podremos comentar este caso.

    Saludos.

    ResponderEliminar
  3. Estuve revisando, y es necesario que el puerto con el dispositivo con el que se va a conectar esté abierto, de lo contrario marcaría un error. Caso particular, agregué un puerto seríal al PC conectado al Bluetooth, al intentar conectar marca error ya que aunque el puerto existe, no está abierto, así que abrí una consola y abrí el puerto para recibir texto, en este caso el dispositivo se conectó bien.

    Quizá ese sea tu caso, de todas maneras, te recomiendo que si tienes más información de lo que estás haciendo, nos la comentes en este blog o en DelphiAccess.

    Saludos.

    ResponderEliminar
  4. Me parece excelente un componente que comunique de android a una pc por bluetooth, ¿Funciona de android a android?. ¡Saludos¡ desde Hermosillo, Sonora, México (ciudad, estado, país).

    ResponderEliminar
  5. Saludos trate de bajar TBLUEPORT pero al parecer el Link no esta disponible, Si tienes un nuevo link por favor ponerlo aqui

    ResponderEliminar