Aplicación de Windows Phone para comunicarse vía Bluetooth con Arduino

En el post de ayer platiqué acerca de como poder hacer un primer proyecto de acercamiento entre Windows Phone y Arduino por medio de la comunicación Bluetooth. Espero que al terminar el artículo quedaras satisfecho por la parte de Arduino y te quedaras con ganas de más. Si esa es tu situación bueno, aquí tienes. ¿Empezamos?

El proyecto Windows Phone

Evita crear un nuevo proyecto, comienza con este proyecto que ya tienes la interfaz diseñada para trabajar además de que tiene una referencia a los controles del Windows Phone Toolkit. Lo que tienes de inicio es una interfaz como la siguiente.

image

Ya que tienes tu proyecto iniciado, crea los manejadores para los eventos Click de los Toggle Switch, el evento Tap del LongListSelector, agrega el método sobre escrito OnNavigatedTo y por último agrega una variable de tipo StreamSocket y un objeto de tipo List<strin>.

namespace Bluetooth_RGB_Phone
{
public partial class MainPage : PhoneApplicationPage
{
StreamSocket BTSock;
List<string> devicesList = new List<string>();
 
public MainPage()
{
InitializeComponent();
}
 
protected async override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
}
 
private void btnRed_Click(object sender, System.Windows.RoutedEventArgs e)
{
 
}
 
private void btnGreen_Click(object sender, System.Windows.RoutedEventArgs e)
{
 
}
 
private void btnBlue_Click(object sender, System.Windows.RoutedEventArgs e)
{
 
}
}
}

En el método sobre escrito inicia primero el emparejamiento de dispositivos y en el modo de Bluetooth. Nota que hay después un método llamado NotifyMessage, ese es el método que sigue. Después enumera todos los dispositivos emparejados en una lista que se desplegará en el LongListSelector.

protected async override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
PeerFinder.Start();
PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
var peers = await PeerFinder.FindAllPeersAsync();
NotifyMessage("Buscando dispositivos...");
 
lstDevices.ItemsSource = devicesList;
 
for (int i = 0; i > peers.Count; i++)
{
devicesList.Add(peers[i].DisplayName);
}
if (peers.Count >= 2)
{
NotifyMessage(peers.Count + " elementos encontrados");
}
}

El método que sigue es el más simple de toda la aplicación pero sin duda el más útil. Te permitirá ir escribiendo un registro de cualquier tipo de actividad. Que te sirva de retroalimentación.

private void NotifyMessage(string messageString)
{
TextBlock newMessageBlock = new TextBlock();
newMessageBlock.Text = messageString;
newMessageBlock.FontSize = 16;
lstMessages.Children.Add(newMessageBlock);
}

Después agrega el método que te permitirá recibir información del dispositivo enlazado. Como puedes ver solo recibes la información en un arreglo de bytes y la conviertes a una cadena que será mostrada gracias al evento anterior.

async private void ReceiveBluetoothData(StreamSocket socket)
{
byte[] bytes = new byte[50];
await socket.InputStream.ReadAsync(bytes.AsBuffer(), 50, InputStreamOptions.Partial);
string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
if (!String.IsNullOrEmpty(str))
{
NotifyMessage(str);
}
}

Obviamente necesitas también el método para enviar información. Primero verifica que el dispositivo exista, puedes enviar la información pero antes debes adaptarla con el formato adecuado. Como puedes ver, hay un método especial llamado GetBufferFromByteArray, este método es indispensable para establecer la conexión de datos.

private async void SendBluetoothData(string dataSent)
{
if (BTSock == null)
{
NotifyMessage("No hay conexión.Trata de nuevo...");
return;
}
else
if (BTSock != null)
{
var datab = GetBufferFromByteArray(UTF8Encoding.UTF8.GetBytes(dataSent));
await BTSock.OutputStream.WriteAsync(datab);
}
}

El método GetBufferFromByteArray recibirá el arreglo de bytes y lo transformará para convertirlo en un objeto de tipo IBuffer que en el método anterior será justamente la información que se enviará.

private IBuffer GetBufferFromByteArray(byte[] package)
{
using (DataWriter dw = new DataWriter())
{
dw.WriteBytes(package);
return dw.DetachBuffer();
}
}

Listo, vamos para ya a trabajar con los eventos. Primero con el evento Tap de la lista. Si no hay ningún elemento seleccionado tendrás un mensaje de notificación, en caso contrario podrás emparejar y conectar de acuerdo al dispositivo seleccionado en la lista. Obviamente enviar una notificación de que ya todo está hecho con un mensaje simple.

private async void lstDevices_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if (lstDevices.SelectedItem == null)
{
NotifyMessage("No hay dispositivos seleccionados, trata de nuevo...");
return;
}
else
{
PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
var PF = await PeerFinder.FindAllPeersAsync();
 
BTSock = new StreamSocket();
await BTSock.ConnectAsync(PF[lstDevices.ItemsSource.IndexOf(lstDevices.SelectedItem)].HostName, "1");
 
var datab = GetBufferFromByteArray(Encoding.UTF8.GetBytes("testing"));
await BTSock.OutputStream.WriteAsync(datab);
ReceiveBluetoothData(BTSock);
NotifyMessage("Conectado");
}
}

Por último la parte más interactiva, los eventos de los Toggle Switch, aquí la cosa es muy simple. Nada del otro mundo.

private void btnRed_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (btnRed.IsChecked == true)
{
SendBluetoothData("0");
}
else
{
SendBluetoothData("1");
}
}

Replica el mismo manejador de eventos para los otros dos colores y ya habrá quedado tu aplicación lista. ¿Quieres el motivante para llegar al final? Compila tu aplicación y ejecútala para que veas la enorme diferencia con respecto a la que usaste en el post anterior.

Bluetooth

Puedes descargar la aplicación de este artículo aquí.

10 Comments

  • hector rodriguez
    28 mayo, 2015 - 12:54 am | Permalink

    no tienes un video tutorial saludos y larga vida WP

    • Amin Espinoza
      14 junio, 2015 - 4:09 pm | Permalink

      NO y creo que sería muy buena idea.

  • felipe
    30 septiembre, 2015 - 2:39 pm | Permalink

    Brother, como hiciste la aplicación para Windows Phone y conectarte por bluetooth?

    • Amin Espinoza
      30 noviembre, 2015 - 10:57 pm | Permalink

      Así, como viene en la entrada 😀

  • Angel Juárez Castillo
    15 octubre, 2015 - 8:56 am | Permalink

    Hola Amin la verdad muy bueno tu aporte, sólo un par de comentarios, en tu método de OnNovigatedTo hay un error, la condición de paro esta mal, debería de ser i<peers.Count…. :D, y bueno creo que esta de más pero si deberías comentar que es una aplicación de silverlight para los novatos como yo que nos tardamos mucho en encontrar en que estaba basada la app… En fin muchisimas gracias la verdad que es una forma muy simple y muy buena para hacer el enlace 😀

    • Amin Espinoza
      30 noviembre, 2015 - 11:03 pm | Permalink

      Buen punto, es necesario ahora sacarla para RT no? Cómo ves? Será uno de mis siguientes enlaces 😀 Gracias por el dato.

      • Angel Juárez
        5 abril, 2016 - 4:52 pm | Permalink

        la verdad es que sonará un poco extraño, siento que seria mejor hacer la aclaración de que el código de c# aplica para la mayoría de plataformas, lo que cambia es el nombre de los controles y los eventos dependiendo de la plataforma.

  • martin
    13 noviembre, 2015 - 6:13 pm | Permalink

    Que buen trabajo,
    por favor me puedes decir con que edicion de visual studio trabajas?
    o estas trabajando con el express que viene en el sdk de wp8?
    gracias…

    • Amin Espinoza
      30 noviembre, 2015 - 10:56 pm | Permalink

      Utilizo Visual Studio 2013 para este ejercicio.

  • 8 abril, 2016 - 12:01 am | Permalink

    Excelente artículo.
    Nosotros nos dedicamos a lo que es el desarrollo de aplicaciones móviles, realmente es un buen artículo de gran ayuda para cualquiera que ingrese a leerlo.

    Saludos Cordiales!

  • Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    This blog is kept spam free by WP-SpamFree.