Bluetooth Arduino + Xamarin.Android
Arduino + Xamarin.Android
Que tal estos últimos dias he estado trabajando un poco con la placa Arduino debido a la escasa información que hay principalmente para el desarrollo de aplicación para Xamarin que interactuen con el bluetooth sobre Arduino les comparto esto que espero les sea de utilidad.
Para empezar les pasare el diagrama que utilizaremos en el Arduino que es muy sencillo:
Una vez esto continuamos con el Sketch:
int led=13, msg=0;
void setup()
{
pinMode(led,OUTPUT);
Serial1.begin(9600);
}
void loop()
{
while(Serial1.available()>0)
{
msg=Serial1.read();
if(msg=='e')
{
digitalWrite(led,HIGH);
Serial1.write('H');
delay(1000);
digitalWrite(led,LOW);
Serial1.write('E');
delay(1000);
digitalWrite(led,HIGH);
Serial1.write('L');
delay(1000);
digitalWrite(led,LOW);
Serial1.write('L');
delay(1000);
digitalWrite(led,HIGH);
Serial1.write('O');
delay(1000);
digitalWrite(led,LOW);
delay(500);
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
Serial1.write(' ');
Serial1.write("OK");
}
}
}
A continuación seguimos con nuestra aplicación en Xamarin.Android antes que nada tendremos que registrar los permisos de uso de bluetooth en nuestro AndroidManifest.xml:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
Seguimos con nuestra interfaz grafica:
<linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
<togglebutton android:id="@+id/toggleButton1" android:layout_height="wrap_content" android:layout_width="match_parent" />
<textview android:gravity="center_horizontal" android:id="@+id/textView1" android:layout_height="match_parent" android:layout_width="match_parent" android:text="..." android:textappearance="?android:attr/textAppearanceLarge" />
</linearlayout>
Ahora continuamos con nuestro código principal:
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.IO;
using Java.Util;
using Android.Bluetooth;
using System.Threading.Tasks;
namespace Tablet
{
[Activity (Label = "Tablet", MainLauncher = true)]
public class MainActivity : Activity
{
//Creamos las variables necesarios para trabajar
//Widgets
ToggleButton tgConnect;
TextView Result;
//String a enviar
private Java.Lang.String dataToSend;
//Variables para el manejo del bluetooth Adaptador y Socket
private BluetoothAdapter mBluetoothAdapter = null;
private BluetoothSocket btSocket = null;
//Streams de lectura I/O
private Stream outStream = null;
private Stream inStream = null;
//MAC Address del dispositivo Bluetooth
private static string address = "00:13:01:07:01:59";
//Id Unico de comunicacion
private static UUID MY_UUID = UUID.FromString("00001101-0000-1000-8000-00805F9B34FB");
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.Main);
//Asignacion de widgets
tgConnect = FindViewById<ToggleButton>(Resource.Id.toggleButton1);
Result = FindViewById<TextView>(Resource.Id.textView1);
//Asignacion de evento del toggle button
tgConnect.CheckedChange += tgConnect_HandleCheckedChange;
//Verificamos la disponibilidad del sensor Bluetooth en el dispositivo
CheckBt();
}
//Metodo de verificacion del sensor Bluetooth
private void CheckBt() {
//asignamos el sensor bluetooth con el que vamos a trabajar
mBluetoothAdapter = BluetoothAdapter.DefaultAdapter;
//Verificamos que este habilitado
if (!mBluetoothAdapter.Enable()) {
Toast.MakeText(this, "Bluetooth Desactivado",
ToastLength.Short).Show();
}
//verificamos que no sea nulo el sensor
if (mBluetoothAdapter == null) {
Toast.MakeText(this,
"Bluetooth No Existe o esta Ocupado", ToastLength.Short)
.Show();
}
}
//Evento de cambio de estado del toggle button
void tgConnect_HandleCheckedChange (object sender, CompoundButton.CheckedChangeEventArgs e)
{
if (e.IsChecked) {
//si se activa el toggle button se incial el metodo de conexion
Connect();
} else {
//en caso de desactivar el toggle button se desconecta del arduino
if (btSocket.IsConnected) {
try {
btSocket.Close();
} catch (System.Exception ex) {
Console.WriteLine (ex.Message);
}
}
}
}
//Evento de conexion al Bluetooth
public void Connect() {
//Iniciamos la conexion con el arduino
BluetoothDevice device = mBluetoothAdapter.GetRemoteDevice(address);
System.Console.WriteLine("Conexion en curso" + device);
//Indicamos al adaptador que ya no sea visible
mBluetoothAdapter.CancelDiscovery();
try {
//Inicamos el socket de comunicacion con el arduino
btSocket = device.CreateRfcommSocketToServiceRecord(MY_UUID);
//Conectamos el socket
btSocket.Connect();
System.Console.WriteLine("Conexion Correcta");
} catch (System.Exception e) {
//en caso de generarnos error cerramos el socket
Console.WriteLine (e.Message);
try {
btSocket.Close();
} catch (System.Exception) {
System.Console.WriteLine("Imposible Conectar");
}
System.Console.WriteLine("Socket Creado");
}
//Una vez conectados al bluetooth mandamos llamar el metodo que generara el hilo
//que recibira los datos del arduino
beginListenForData();
//NOTA envio la letra e ya que el sketch esta configurado para funcionar cuando
//recibe esta letra.
dataToSend = new Java.Lang.String("e");
writeData(dataToSend);
}
//Evento para inicializar el hilo que escuchara las peticiones del bluetooth
public void beginListenForData() {
//Extraemos el stream de entrada
try {
inStream = btSocket.InputStream;
} catch (System.IO.IOException ex) {
Console.WriteLine (ex.Message);
}
//Creamos un hilo que estara corriendo en background el cual verificara si hay algun dato
//por parte del arduino
Task.Factory.StartNew (() => {
//declaramos el buffer donde guardaremos la lectura
byte[] buffer = new byte[1024];
//declaramos el numero de bytes recibidos
int bytes;
while (true) {
try {
//leemos el buffer de entrada y asignamos la cantidad de bytes entrantes
bytes = inStream.Read(buffer, 0, buffer.Length);
//Verificamos que los bytes contengan informacion
if(bytes>0)
{
//Corremos en la interfaz principal
RunOnUiThread(()=>{
//Convertimos el valor de la informacion llegada a string
string valor = System.Text.Encoding.ASCII.GetString (buffer);
//Agregamos a nuestro label la informacion llegada
Result.Text = Result.Text+"\n"+valor;
});
}
} catch (Java.IO.IOException) {
//En caso de error limpiamos nuestra label y cortamos el hilo de comunicacion
RunOnUiThread(()=>{
Result.Text = string.Empty;
});
break;
}
}
});
}
//Metodo de envio de datos la bluetooth
private void writeData(Java.Lang.String data) {
//Extraemos el stream de salida
try {
outStream = btSocket.OutputStream;
} catch (System.Exception e) {
System.Console.WriteLine("Error al enviar"+e.Message);
}
//creamos el string que enviaremos
Java.Lang.String message = data;
//lo convertimos en bytes
byte[] msgBuffer = message.GetBytes();
try {
//Escribimos en el buffer el arreglo que acabamos de generar
outStream.Write(msgBuffer, 0, msgBuffer.Length);
} catch (System.Exception e) {
System.Console.WriteLine("Error al enviar"+e.Message);
}
}
}
}
Pueden acceder al ejemplo completo desde mi github:
Espero que les sea de utilidad esta información les dejo un video de la aplicación funcionando


Comments
Post a Comment