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.