1ª aportación
Según parece ser, en B4A es necesario empezar por habilitar las librerías siguientes:
- Core (marcada por defecto)
- Serial (que no está marcada por defecto)
- RandomAccesFile (que no esta marcada por defecto, esta libreria la usamos para el streaming)
(para los mas novatos, en la parte de abajo a la derecha de B4A hay 4 pestañas, una dice LIB, y allí solo tenemos que marcarlas y se cargan solas)
Es necesario que el dispositivo cuente con Android 2.0 o superior y con API nivel 5 o superior.
Para la pantalla, necesitamos crear los siguientes controles:
- Caja de texto (txtLog) que recogerá los datos recibidos desde el bluetooth.
- Caja de texto (txtSend) que será donde pongamos los datos que queremos enviar.
- Boton (btnSend) Que se encargará de enviar los datos de la caja de texto txtSend.
- Etiqueta LABEL (label1) que nos comunicará que hacer en cada momento.
Despues de haber creado esta pantalla (activity) a la que llamaremos "1", grabamos y hacemos que genere los miembros (generate members) del boton. No serán necesaria más acciones por el momento.
Cerramos el diseñador (da igual si lo hacemos desde el emulador o mediante el puente a nuestro movil BRIDGE, etc....)
Ahora vamos a ver la parte del codigo.
Lo primero que haremos será declarar las Variables:
Sub Process_Globals
Dim Serial1 As Serial
Dim TextReader1 As TextReader
Dim TextWriter1 As TextWriter
Dim Timer1 As Timer
Dim connected As Boolean
End Sub
Sub Globals
Dim btnSend As Button
Dim txtLog As EditText
Dim txtSend As EditText
End Sub
El
Process_Globals para las variables que servirán para toda la aplicacion (es decir para todas las pantallas o activities) nos permitirá mejorar y adaptar este codigo en caso que queramos crear mas pantallas. En este proceso declaramos las variables que nos permitiran trabajar con el puerto serial, los "lectores" y "escritores" que nos permitirar trabajar con streaming (streaming en caso necesario), la variable del temporizador TIMER para que podamos preguntar si hay datos cada cierto tiempo y un FLAG (bandera) que nos dirá si estamos o no conectados.
El
Globalsnos dará las variables que solo nos serviran para esta pantalla o activity. Aqui definimos las variables de los objetos que tenemos en pantalla, como las cajas de texto o el boton.
Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
Serial1.Initialize("Serial1")
Timer1.Initialize("Timer1", 200)
End If
Activity.LoadLayout("1")
Activity.AddMenuItem("Conectar", "mnuConnect")
Activity.AddMenuItem("Desconetar", "mnuDisconnect")
End Sub
Esta rutina se carga al iniciar la pantalla (activity). Tienes la opcion de preguntar si es la primera vez que se abre (FirstTime <TRUE O FALSE> ya que es boolean). Lo primero que hacemos es preguntar si es la primera vez que cargamos esa actividad, y en caso afirmativo inicializamos el puerto y el temporizador a 200 (2 segundos) que sera el tiempo en que el programa pasara por la rutina de ese temporizador. Sea o no la primera vez, le decimos a la pantalla que cargue la plantilla (LoadLayout) y que agrege dos Items (objetos) al menu de la pantalla. Estos objetos se verán cuando pulsemos la opción menú de nuestro telefono movil, es decir, no sale en la pantalla (activity) principal si no son llamados desde este botón.
Sub Activity_Resume
If Serial1.IsEnabled = False Then
Msgbox("Active el BlueTooth.", "")
Else
Serial1.Listen
End If
End Sub
La rutina Activity_Resume (en este caso no se refiere a resumen sino a continuar) se carga una vez se ha cargado la pantalla (activity) y lo que hace es comprobar si nuestro puerto está disponible o no. Si no lo está te dice que actives el bluetooth y si lo está se pone a "escuchar" el puerto.
Sub mnuConnect_Click
Dim PairedDevices As Map
PairedDevices = Serial1.GetPairedDevices
Dim l As List
l.Initialize
For i = 0 To PairedDevices.Size - 1
l.Add(PairedDevices.GetKeyAt(i))
Next
Dim res As Int
res = InputList(l, "Seleccione un dispositivo", -1)
If res <> DialogResponse.CANCEL Then
Serial1.Connect(PairedDevices.Get(l.Get(res)))
End If
End Sub
Esta rutina se carga cuando pulsamos el boton Conectar del menu (si, ese que habia que darle al menu del telefono para que aparezca). Aqui hay varias cosas interesantes.
Lo primero que hace es crear un MAP (mapa) con los dispositivos que estan asociados a nuestro telefono, es decir, antes de iniciar una conexión, es necesario que con las opciones del movil "PAREEMOS" o "EMPAREJAMOS" estos dispositivos para que salgan en esta lista. Es cierto que podríamos usar RATIO, etc... para buscar nuevos, pero para este ejemplo lo emparejaremos antes. GetPairedDevices lo que hace es preguntar a nuestro dispositivos los "nombre" (ya se que no es el nombre en si) de los dispositivos previamente emparejados.
Dim l As List
l.Initialize
For i = 0 To PairedDevices.Size - 1
l.Add(PairedDevices.GetKeyAt(i))
Next
Estas lineas crean una lista que añade los dispositivos que hay vigentes.
Dim res As Int
res = InputList(l, "Seleccione un dispositivo", -1)
If res <> DialogResponse.CANCEL Then
Serial1.Connect(PairedDevices.Get(l.Get(res)))
End If
Y estas lineas lo que hacen es mostrarnos una caja de dialogo con los dispositivos encontrados para que seleccionemos uno de ellos. En caso de no ser cancelada CONECTA con el dispositivo seleccionado.
Sub Serial1_Connected (Success As Boolean)
If Success Then
ToastMessageShow("Conectado", False)
TextReader1.Initialize(Serial1.InputStream)
TextWriter1.Initialize(Serial1.OutputStream)
Timer1.Enabled = True
connected = True
Else
connected = False
Timer1.Enabled = False
Msgbox(LastException.Message, "Error de conexion.")
End If
End Sub
En el momento de conectar, salta esta rutina, a la cual se le puede preguntar si ha tenido exito (success) o no. En caso de no tener exito, desactiva el temporizador, pone la variable flag a falso y muestra el mensaje de error. En caso de conexión lanza un mensaje de conectado e inicializa los "lectores" y "escritores" de datos, uno como entrante y otro como saliente. Habilita el temporizador y pone la variable flag a verdadero.
Sub mnuDisconnect_Click
Serial1.Disconnect
connected = False
End Sub
Esta rutina se activa cuando se hace clic en Desconectar del boton del menú. Desconecta el puerto serie y la variable flag se pone a falso.
Sub btnSend_Click
If connected Then
TextWriter1.WriteLine(txtSend.Text)
TextWriter1.Flush
txtSend.Text = ""
End If
End Sub
Esta rutina se lanza al hacer clic en el boton enviar. Pregunta si la variable flag es verdadera y escribe en el "escritor" del streaming, "levanta" el "escritor" para que cumpla con su cometido y borra la caja de texto para dejarla libre.
Sub Timer1_Tick
If connected Then
If TextReader1.Ready Then
txtLog.Text = txtLog.Text & TextReader1.ReadLine & CRLF
txtLog.SelectionStart = txtLog.Text.Length
End If
End If
End Sub
Esta es la rutina del timer, la cual se lanza (en nuestro caso--> mirar mas arriba) cada 2 segundos. Si esta conectado según nuestra variable flag, y si la "lector" del streaming esta disponible, escribe el contenido en la caja de texto y se posiciona al final del mismo despues del retorno de carro.
Este es todo el codigo, no hay mas.........