RSS

Archivo de la categoría: Artículo

WebCasts Windows Mobile 6.5

MSDEV ha publicado 8 Webcast de alto interés sobre desarrollo de aplicaciones en Windows Mobile 6.5. Os los recomiendo ya que tienen muy buena calidad (en todos los sentidos) y os ayudarán tanto a empezar a desarrollar sobre WM6.5 como a descubrir pequeños trucos que hasta ahora no conocíais.

  1. Getting Started with Application Development for Windows Mobile 6.5
  2. Using SQL Server Compact Edition with Windows Mobile 6.5
  3. Accessing Local Files with Windows Mobile 6.5
  4. Building a GPS-aware Application with Windows Mobile 6.5
  5. Building a Windows Mobile Application with Bing
  6. Basic Messaging with Windows Mobile 6.5
  7. Windows Mobile 6.5 Security Fundamentals
  8. Introducing the Gesture APIs in Windows Mobile 6.5
Anuncios
 
Deja un comentario

Publicado por en 28 enero, 2010 en Artículo, Desarrollo

 

Errores "DESCONOCIDOS" (o no tanto…) en la replicación de SQL Server

[Dynamics Mobile discontinuado Ver más aquí]

En ocasiones, sobre todo cuando comenzamos a trabajar con Dynamics Mobile (O con la replicación por mezcla en general) nos podemos encontrar con la desagradable sorpresa de que tras tener todo configurado a la hora de sincronizar la base de datos el dispositivo nos comienza a soltar mensajes del tipo Error desconocido (28634) y no nos muestra ninguna información adicional… pues bien ese número indica precisamente que el error no es tan desconocido.

Podemos encontrar en msdn la descripción para todos esos errores. El enlace http://msdn.microsoft.com/en-us/library/ms171849.aspx os llevará directamente a ese lugar.

Aquí os dejo un ejemplo de la clasificación de errores por su rango asociado:

Engine errors

25000-25499

Replication Transport errors

28000-28499

Client Agent errors

28500-28999

Server Agent errors

29000-29499

Message Protocol errors

29500-29999

Query Processor errors

25500-26499

OLEDB errors

0x80040E00L-0x00040EDDL

 
 

Sincronización de bases de datos con ADO.net Sync Services en VS 2008

Joaquin Raya nos envía un artículo muy interesante, una guía para utilizar Microsoft ADO.net Sync Services.

En este documento se muestra el procedimiento a seguir para sincronizar tablas con Microsoft ADO.net Sync Services. Para acelerar este proceso abusaremos de todos los diseñadores, wizards y sistemas automatizados de los que nos provee Microsoft. El código de la aplicación de pruebas es totalmente trivial, se deja como tarea para el usuario introducir escenarios más complejos.

Sync

Para una visión general del Sync Framework, proveedores de sincronización, arquitectura y etc, consultar MSDN en:

http://msdn.microsoft.com/en-us/sync/default.aspx

Para ver la guía podéis hacerlo aquí:

[PDF] >Sincronización con Sync Services [972 KB (996.178 bytes)]

Para descargar el ejemplo aquí.

 
Deja un comentario

Publicado por en 7 abril, 2009 en Artículo, Desarrollo

 

Centinela Bluetooth para Windows Mobile, jugando con RegistryState

Se acabó el darte cuenta al llegar al trabajo que dejaste la mochila con el portátil en casa… y es que cansado ya de salir corriendo de casa y darme cuenta "demasiado tarde" de que no llevo el portátil encima se me ocurrió inspirado en la nueva idea de Nokia (bueno no tan nueva todos conocemos los busca llaves) que están desarrollando un sistema para localizar objetos con el móvil, el desarrollar algo similar para Windows Mobile y claro, sin tener que gastarme ni un euro que esta la cosa muy mal para hacer derroches.

image_thumb_1

El objetivo ha sido crear una aplicación capaz de avisarme en la PDA si me separo de mi manos libres Bluetooth, además el aviso debe saltar aunque la aplicación NO este corriendo en ese momento y aunque la PDA NO esté encendida… Con lo que dejando el manos libres en la mochila si me alejo saltara la alarma.

Así que manos a la obra, para hacerlo tan solo he necesitado en lo que a hardware se refiere mi PDA HTC P3300 con Windows Mobile 5.0 y el manos libres Bluetooth, para todo lo demás RegistryState de Microsoft.WindowsMobile.Status y algunas llamadas a Pinvoke.

Mediante RegistryState podemos detectar cuando se produce algún cambio en cualquier clave del registro de nuestro dispositivo, y además nos genera el evento correspondiente y nos provee de los métodos necesarios para recuperar los valores que deseemos, basándonos en esto, la clave del registro HKEY_LOCAL_MACHINE\System\State\Hardware\Bluetooth se actualiza con los cambios de estado del Bluetooth de nuestro dispositivo por lo que empezaremos por ahí.

image_thumb_2

En nuestra aplicación para poder capturar dichos cambios tan solo necesitamos crear lo siguiente:

//Como detectar los cambios producidos en el registro

(…)

    const string registryKey = @"HKEY_LOCAL_MACHINE\System\State\Hardware";
    const string registryValueName = @"Bluetooth";

    Microsoft.WindowsMobile.Status.RegistryState rg;    
    rg = new RegistryState(registryKey, registryValueName);                       
    rg.Changed += new ChangeEventHandler(rg_Changed); 
(…)

void rg_Changed(object sender, ChangeEventArgs args)
{  

}

De este modo cada vez que se produzca un cambio en esta clave (Activemos o desactivemos el Bluetooth, conectemos o desconectemos un dispositivo) se ejecutara en nuestro caso la función rg_Changed.

Así que con esto ya tenemos la primera parte resuelta, en caso de tener la PDA emparejada con el manos libres, si nos dejamos el manos libres en la mochila y nos alejamos se perderá la conexión y se producirá un cambio en el estado ejecutándose el método rg_Changed, y ahí podemos poner que vibre la PDA o que suene la flauta si hace falta, pero que ocurre si nuestra aplicación NO se está ejecutando en ese momento… pues obviamente que no funcionara, pero también lo podemos resolver con cuatro líneas de código gracias al método EnableApplicationLauncher que nos permite asociar una aplicación a un evento del sistema. Es decir que si ocurre un cambio, como puede ser el del estado del Bluetooth, que ejecute la aplicación que especificaremos por código.

Para ello agregaremos

//Como hacer que se ejecute una aplicación al detectar un cambio en el estado del dispositivo

const string appId = "DetectorBT";
const string applicationFileName = @"\Archivos de programa\DetectorBT\DetectorBT.exe";
rg.EnableApplicationLauncher(appId, applicationFileName);

Así aun cuando cerremos la aplicación si nuestra PDA está encendida si se ejecuta cualquier cambio en la clave Bluetooth nuestra aplicación se ejecutara y ya tenemos otro punto solucionado… pero ahora viene "lo gordo", está claro que si nos acordamos de encender la PDA para ver que no se nos olvida nada nos acordaremos del portatil y esta claro que a las 7 de la mañana no te vas a acordar de encender la PDA por lo que debemos implementar "algo" que active la PDA para que veamos el aviso.

El como encender la pda lo podemos resolver con dos llamadas a nativo PowerPolicyNotify y SetSystemPowerState como se muestra a continuación

//Como encender la PDA mediante código

[DllImport("coredll.dll", CharSet = CharSet.Unicode)]
private static extern bool PowerPolicyNotify(int dwMessage, int dwData);

[DllImport("coredll.dll", SetLastError = true)]
static extern int SetSystemPowerState(string psState, int StateFlags, int Options);

/// <summary>
/// Despierta el dispositivo
/// </summary>
public void WakeUpPDA()
{
    PowerPolicyNotify((int)PPN_Message.PPN_UNATTENDEDMODE, 1);
    int iReturnResult = SetSystemPowerState(null, (int)PowerState.POWER_STATE_ON, (int)PowerRequirement.POWER_FORCE);
}

Así que de este modo si llamamos a WakeUpPDA cuando por ejemplo perdamos el control del manos libres y el estado vuelva a encendido y en espera (valor 9) despertamos la PDA y veremos el aviso que hayamos creado.

Con todo esto os dejo la aplicación de ejemplo Centinela Bluetooth para que alguno se anime a mejorarla, está claro que lo genial sería que fuese capaz de calcular la distancia a la que se encuentra pero en 2 horas no me ha dado tiempo a mucho mas.

Una de las opciones que estaba barajando era la de intentar estimar a que distancia se encuentra el dispositivo pero dadas las características del protocolo bluetooth y del tipo de dispositivo que estoy utilizando (uno de tipo 3 con alcance hasta 100 metros) no ha sido posible.

Todo esto está desarrollado para Windows Mobile 5.0 de ahí que utilice RegistryState en lugar de SystemSate para poder utilizar esta aplicación como ejemplo.

Saludos!!!

José Antonio Gallego

Ups, casi se me olvida aquí os dejo la solución con el ejemplo para Visual Studio 2008 y Windows Mobile 5.0 (MobileNUG.DetectorBT);

 
Deja un comentario

Publicado por en 15 enero, 2009 en Artículo, Desarrollo

 

Personalizando un control Listview

Como la mayoría de los desarrolladores el sentido del diseño lo tuve aparcado durante algún tiempo, pero a medida que te involucras en los desarrollos, y sobre todo cuando estas cerca del cliente de das cuenta que una buena funcionalidad no lo es todo, el cliente/usuario final, no tiene porque comprender la complejidad de un desarrollo y posiblemente no sepa valorarla, en cambio una interfaz de usuario atractiva cambia las cosas, algunas de las principales novedades respecto a tecnología móvil en estos últimos tiempos ha ido principalmente en esa dirección, creando nuevos medios de interacción con el usuario, como pueden ser los acelerometros, o interfaces de usuario atractivas como el Touch flow de htc… pero eso lo estoy dejando para un post posterior.

Este fin de semana rastreando por la msdn e recopilado unos cuantos métodos para crear un control Listview personalizado para Compact Framework.

Curiosamente todas las funcionalidades que vamos a utilizar para la creación de este control YA están contenidas en el mismo de forma nativa, pero por algún motivo que aún no he descubierto, estas propiedades no están accesibles en el control desde código manejado, por lo que únicamente tendremos que enviar los mensajes necesarios para activar las funcionalidades que deseemos y obtener un resultado como el de la imagen… (insisto… no soy diseñador jeje)

image_thumb_1

Para poder crear nuestro propio control listView crearemos un control personalizado que herede del control ListView y a continuación declararemos la funciones que harán las llamadas a nativo, para esto tan solo necesitamos la invocación a SendMessage (Manejado , Nativo)

Una vez agregada la llamada declararemos las propiedades que extenderán nuestro control Gradient, GridLines, BackgroundImage y DoubleBuffering éstas funciones hacen relación con las constantes LVS_EX_GRADIENT, LVS_EX_GRIDLINES, LVM_SETBKIMAGE y LVS_EX_DOUBLEBUFFER respectivamente. Si queréis ver todas las posibilidades visitar este enlace.

Como no soy muy dado a andarme por las ramas aquí os dejo un ejemplo con el código fuente del control y la aplicación de ejemplo, lo único destacar lo siguiente, he buscado los ejemplos para mostrar como utilizar la funcionalidad bien mediante p/invoke o bien mediante MessageWindow.SendMessage desde el espacio de nombres Microsoft.WindowsCE.Forms.

MobileNug.Controles.ListviewEx.zip

Un saludo a todos y espero que os sea útil, por su puesto si lo ampliáis seria fantástico que lo compartáis. Esto mismo se puede hacer con otros controles. Así que adelante.

 
Deja un comentario

Publicado por en 3 enero, 2009 en Artículo, Desarrollo

 

Implementando un Hard-Reset por código en Windows Mobile 6.x

Un tema bastante peliagudo en los tiempos que corren es el de la seguridad de los datos que almacenamos en nuestras aplicaciones, sobre todo cuando hablamos de aplicaciones de gestión empresarial, en las cuales almacenamos datos confidenciales de nuestros clientes, como facturación, deudas, compras habituales…

Si bien es cierto que si en nuestra empresa contamos con un servidor Exchange podemos forzar el borrado remoto, también es cierto que hasta que no nos demos cuenta de que el dispositivo ha "cambiado" de dueño no podremos dar dicha orden.

Aquí os dejo un ejemplo muy simple de como implementar el hard-reset del dispositivo para Windows Mobile 6.x utilizando el sistema de aprovisionamiento OMA Client.

Este sistema nos permite configurar nuestros dispositivos, desde agregar enlaces a la lista de favoritos del Explorer, hasta el ejecutar el borrado mediante Hard-Reset de nuestro dispositivo, esto último es lo que ha propiciado la redacción de este post.

Para ello es tan sencillo como componer el documento XML correspondiente.

<wap-provisioningdoc>
  <characteristic type="RemoteWipe">
      <parm name="doWipe" value="1"/>
  </characteristic>
</wap-provisioningdoc>

En este documento vemos que vamos a ejecutar la característica RemoteWipe y como parámetro le especificamos la acción doWipe.

Como ejecutamos esto desde nuestra aplicación, muy sencillo, para ello utilizaremos el método ProcessConfiguration esta clase se encuentra dentro del ensamblado Microsoft.WindowsMobile.Configuration por lo que deberemos agregar este nombre de espacio como referencia a nuestro proyecto.

Éste método tiene dos parámetros, veamos la sintaxis:

XmlDocument ProcessConfiguration (XmlDocument configDoc,bool metadata)

Donde configDoc será el documento XML con el que se aprovisionará nuestro dispositivo, y con el parámetro de metadata especificamos si vamos a recoger la respuesta, este último parámetro es muy útil si queremos controlar los errores que se puedan producir o por si el archivo de aprovisionamiento debe generar una salida, como puede ser por haber realizado algún tipo de consulta.

Una vez visto esto vamos a por el ejemplo:

public bool doWipe()
{
string WipeCSP = @"<wap-provisioningdoc>
                    <characteristic type=’RemoteWipe’>
                    <parm name=’doWipe’ value=’1’/>
                    </characteristic>
                   </wap-provisioningdoc>";

//Documento en el que almacenaremos la respuesta
System.Xml.XmlDocument xmlDocRes;

//Documento donde cargaremos el xml de aprovisionamiento

XmlDocument configDoc = new XmlDocument();
configDoc.LoadXml(WipeCSP);

//Llamada al configuration manager
xmlDocRes = ConfigurationManager.ProcessConfiguration(configDoc, true);

//TODO: aquí iría el procesamiento del documento de retorno
return true;
}

Ojo que esto solo es valido para dispositivos con Windows Mobile 6.0 o superior no funciona en Windows Mobile 5.0 ni en Windows Mobile 2003.

Otro tema importante es que, muy bien, ya he flaseado la PDA pero que pasa con mi tarjeta de almacenamiento… y es que muchas veces los datos guardados en la tarjeta de memoria de nuestro dispositivo es mucho más importante que el contenido de la propia PDA, bien porque la aplicación guarde los datos en la tarjeta de memoria (bien porque hayamos hechos fotos comprometedoras que no queremos que nadie vea jeje) a partir de Windows Mobile 6.1 también es posible forzar el cifrado de la tarjeta SD utilizando el mismo sistema que hemos implementado para realizar el reset de la pda, tan solo hemos de utilizar el siguiente xml de aprovisionamiento y listo.

<wap-provisioningdoc>
<characteristic type="DeviceEncryption">
   <parm name="Enable" value="1" />
</characteristic>
</wap-provisioningdoc>

Con esto y un bizcocho aquí os dejo un listado de enlaces para los que estéis interesados en investigar un poquito más en el tema del aprovisionamiento de los dispositivos móviles.

Understanding Provisioning (MSDN)

Options for Delivering Provisioning XML Files to Windows Mobile-Based Devices

Ejecutando archivos de aprovisionamiento desde nativo c++

Como final, desearos a todos una felices fiestas, ya que a muchos no nos ha tocado la lotería, nos seguiremos viendo por aquí.

 
Deja un comentario

Publicado por en 24 diciembre, 2008 en Artículo, Desarrollo

 

Servicios en Windows Mobile bajo codigo manejado

Recientemente me encontrado con un proyecto en Codeplex para la utlización de servicios bajo Windows Mobile de Peter Nowak llamado Managed Services for Windows Mobile. Se trata de una librería bajo código administrado que permite la creación de Servicios de forma aproximada a como lo hace Windows Desktop.

servicemanager1

Entre sus características destaca:

  • Para utilizar esta libreria no se requiere de acceso a P/Invoke.

  • Está desarrollada en .NET CF 2.0.

  • Ejecuta servicios automáticamente al iniciar el sistema

  • Contiene un administrador bastante sencillo de utilizar.

servicemanager3

Por las pruebas que he realizado en un emulador tiene, aparentemente -está en versión Alpha-, buena pinta. Desde el mismo site de Codeplex viene con un ejemplo de servicio, documentación, código fuente y el Service Manager utility, con lo que ejecutarlo o crear tu propio servicio no es demasiado complicado, otra cosa es entender realmente como funciona internamente.

ManagedServiceClassDiagram

Por lo visto, está basado en un post del blog de Pavel Bánský, en el que explica cómo desarrollar servicios para Windows Mobile bajo código administrado. Todo parte de la idea de ejecución in-process de una DLL bajo \Windows\Services.exe, sin embargo la forma más habitual para hacerlo es mediante código nativo. Pavel muestra como encapsular las llamadas a WinCE y Peter se basa en el resultado para crear una librería íntegra para la creación de servicios bajo código administrado.

Si quereis profundizar más sobre el tema mirad en Services.exe Application Development for Windows Mobile-based Devices.

Fuente: www.desarrollobile.net

 
Deja un comentario

Publicado por en 2 diciembre, 2008 en Artículo, Desarrollo