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.
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.
Puedes descargar la aplicación de este artículo aquí.
no tienes un video tutorial saludos y larga vida WP
NO y creo que sería muy buena idea.
Brother, como hiciste la aplicación para Windows Phone y conectarte por bluetooth?
Así, como viene en la entrada 😀
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 😀
Buen punto, es necesario ahora sacarla para RT no? Cómo ves? Será uno de mis siguientes enlaces 😀 Gracias por el dato.
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.
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…
Utilizo Visual Studio 2013 para este ejercicio.
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!