Taller de Programación de Dispositivos Móviles José Miguel Rubio L. Oficina 3-20 http://www.inf.ucv.cl/~jrubio [email protected] .NET CF Windows Mobile y .NET CF Windows Mobile = Windows CE + programas + extensiones Modular como Windows CE, código a disposición de los ensambladores/operadoras Dirigido a: Pocket PC, PPC Phone Edition Smartphone (SP) Portable Media Center (PMC) .NET CF Windows Mobile y .NET CF Dispositivos SO Mejor Desarrollo Capacidad Plataforma Futura Plataforma Windows Mobile 2000 2002 2003 WinCE 3.0 WinCE 3.0 WinCE 4.2 WinCE 4.2 WinCE 5.0 eVC 3 (C++) eVB 3 (VB) eVC 3 (C++) eVB 3 (VB) eVC 3 (C++) eVC 4 (C++) VS.NET 2003 eVC 3 (C++) eVC 4 (C++) VS.NET 2003 Visual Studio (C#, VB.NET) (C#, VB.NET) 2003 Second Edition 2005 (C#, VB.NET, C++) MFC MFC, ATL ATL 4.2, .NET CF .NET CF SP2 .NET CF 2.0 Win32, POOM Active Sync Connection Mgr MAPI OBEX Telephony Enhanced Emulator Configuration Mgr, Bluetooth, SMS VGA (PPC) QVGA (SP) Square Landscape MFC 8.0, ATL 8.0 Broad managed code support Notifications Broker, Location, Camera, Watson, D3DM .NET CF Windows Mobile y .NET CF Visual Studio 2005 Managed Native MFC ATL Server side .NET Compact Framework 2.0 Win32 ASP .NET Mobile Controls Software Platform (APIs) Device Management Communication Presentation Data Access Remote API Configuration* Bluetooth Not. Broker Pocket Watson Connection Manager TAPI* SMS* MAPI* POOM* Home Screen User Interface/Shell HTML Control DOM Multimedia SQL Mobile ADO CE XML CE DB OLE DB GAPI Camera D3DM Windows Mobile Windows CE CE DB ActiveSync SQL Mobile Pocket Outlook Pocket Internet Explorer Windows Media Player Drivers Device Hardware Processor Memory Display USB or Serial Radio GSM/GPRS CDMA/1xRTT WiFi Bluetooth * = Managed wrappers .NET CF Contenidos Introducción a .NET Introducción a Compact Framework Sintaxis de C# Operaciones básicas con C# Propiedades y DataBinding Acceso a Bases de Datos Invocación de Web Services .NET CF Introducción (I) ¿Qué es .NET? Un conjunto de tecnologías que Microsoft ha creado y posibilitan crear programas y comunicarlos entre sí con independencia del lenguaje de programación y la plataforma de ejecución. ¿Para qué tipo de máquina? CUALQUIERA que soporte .NET Se crea un programa y éste puede ejecutarse en cualquier máquina con .NET instalado. Puede comunicarse con otros programas independientemente de la plataforma y lenguaje .NET CF Introducción (II) Además, el programa puede haber sido hecho en cualquiera de los lenguajes del conjunto .NET, que es muy amplio C++ J++ C# Visual Basic.NET Pascal, COBOL, Delphi, Python, ....... El conjunto cada día crece más “Escribe en el lenguaje que quieras y ejecútalo en la máquina que quieras” .NET CF Introducción (III) Para conseguir esto se han creado una serie de elementos básicos Common Language Runtime (CLR) Base Class Library (BCL) Y unos elementos que se ejecutan sobre ellos (Windows Forms, Web Services, ...) .NET CF Arquitectura (I) ASP.NET Servicios Web Windows Forms .NET Framework Base Classes Common Language Runtime .NET CF Arquitectura (II) Common Language Runtime Elemento que se encarga de la ejecución. El corazón de la ejecución de una aplicación en .NET Se encarga de ejecutar las aplicaciones, crear el entorno de ejecución en la máquina, etc... El concepto es similar al que usa JAVA: El código fuente es convertido a código intermedio ‘standard’ (MSIL) El CLR traduce este código intermedio al código máquina de la arquitectura concreta, directamente, para que el procesador ejecute las instrucciones. .NET CF Arquitectura (III) Common Language Runtime (CLR) Ventaja en .NET CUALQUIER lenguaje .NET se traduce al código intermedio. Da igual en qué lenguaje se cree la aplicación, al final se tendrá el mismo código intermedio a ejecutar. El CLR ejecutará lo mismo provenga del lenguaje de programación que provenga Posibilidad INTEGRACIÓN MULTILENGUAJE: Llamar a métodos o heredar de clases escritas en otros lenguajes. Todo converge al final a MSIL .NET CF Arquitectura (IV) Compilar Código Fuente Código Intermedio CLR n ó i Código Máquina cuc e Ej Base Class Library (BCL) Conjunto de librerías que usan los lenguajes de programación .NET Es un conjunto de clases que ofrece la funcionalidad básica: Desde vectores y arrays a sockets y librerías de Base de Datos Por supuesto, cualquier usuario puede aumentar la librería creando nuevas clases que pueden o no heredar de éstas .NET CF Arquitectura (V) Elementos que residen encima de CLR y BCL Windows Forms: Aplicaiones de formularios ASP.NET: Generación que evoluciona de los ASP’s comunes. Creación de páginas web dinámicas Web Services: invocación remota a servicios de todo tipo a través de la web .NET CF Usar .NET en dispositivos móviles Aprovechando esta propiedad de .NET, se pueden crear aplicaciones para móviles fácilmente ¿Y si existiera un CLR especial para dispositivos móviles? Podríamos programar normalmente, compilar, crear el lenguaje intermedio (MSIL) y el CLR se encargaría de ejecutarlo en el procesador de estos dispositivos Para eso se ha creado .NET Compact Framework .NET CF .NET Compact Framework (I) La idea es poder programar estos dispositivos sin necesidad de ser especialista en ellos Se programarían tal y como programamos aplicaciones de un PC de sobremesa, el CLR se encargaría del resto Problema Un procesador de un dispositivo de este tipo es mucho menos potente que el de un PC de sobremesa Es necesario un CLR reducido, menos potente que el CLR ordinario .NET CF .NET Compact Framework (II) ¿Consecuencia de esto? Al tener menos potencia las clases que requieran mayor proceso o que por alguna otra razón no se puedan implementar en estos dispositivos se eliminan Queda un subconjunto de las clases de sobremesa Sin embargo, se ha conseguido que el conjunto funcional de clases en Compact Framework aún siga siendo muy amplio El objetivo es que el programador acostumbrado al CLR normal no se vea ‘con las manos cortadas’ Además, las características básicas propias de .NET siguen intactas .NET CF ¿Cómo programar en .NET CF? Para empezar a usar CF usaremos el lenguaje de programación C# Como herramienta de desarrollo usaremos Visual Studio .NET 2003 Visual Studio tiene varias plantillas de proyectos, dependiendo del tipo. Usaremos la específica de dispositivos móviles. Visual Studio Ofrece funciones útiles como emulador de PocketPC, el despliegue automático de la aplicación a un dispositivo real, etc .NET CF ¿Cómo programar en CF? Con Visual Studio se puede ejecutar la aplicación en un dispositivo móvil real, mientras se hace debug en el mismo PC Hay otras herramientas alternativas de desarrollo Desarrollo en C# : SharpDevelop (Open Source) http://www.icsharpcode.net/opensource/sd/ Etc... .NET CF El lenguaje C# (I) C# es muy parecido a Java Pequeñas diferencias de sintaxis, algunos elementos nuevos y diferentes librerías Por ser parte de .Net Lenguaje autocontenido no necesita ficheros extra demás del fuente (ficheros de cabecera, etc..) guarda toda la información necesaria él mismo Recolector de basura no necesita que el programador se encargue de gestionar la memoria .NET CF El lenguaje C# (II) ¡En C# CUALQUIER cosa hereda de object! Hasta los tipos básicos como int se pueden tratar como objetos, a diferencia de Java Se pueden redefinir operadores, como en C++ y a diferencia de Java No es necesario usar punteros, pero para el que quiera hacerlo (o necesite migrar una aplicación hecha por ejemplo en C++) existe la opción Código Inseguro (unsafe) Las clases de la librería base se encuentran divididas en grupos. En Java se llaman paquetes, en C# se llaman NameSpaces (espacios de nombres) .NET CF Namespaces Crear un Namespace: namespace Jugueteria { class Juguete { ... } } Usar un Namespace (en Java se hace con ‘import’) using Jugueteria; .NET CF Principales Namespaces System Los tipos más frecuentemente usados (tipos básicos y tablas, fechas...) System.Collections Colecciones de datos más comunes (pilas, colas, listas ...) System.Data Manipulación de Bases de Datos System.IO Manipulación de ficheros System.Net Comunicaciones en red System.Threading Manipulación de Threads System.Windows.Forms Formularios System.Web.UI.WebControls Controles Web .NET CF Más sintaxis (I) En C# la clase string (con minúscula) se puede comparar con el operador == y hasta los tipos básicos como int tienen método ToString() El acceso a consola es con System.Console.WriteLine(“Hola Mundo!”); System.Console.ReadLine(); Herencia public class Trabajador: Persona Constantes public const int NO_VALIDO = -1; .NET CF Más sintaxis (II) Instrucción nueva foreach recorre automáticamente una colección de datos (array, lista, etc...). Como un for que pasa por todos los elementos de la colección. Suponiendo que la variable trabajadores es una lista de instancias de la clase Trabajador: foreach (Trabajador t in trabajadores) { Console.WriteLine( t.ToString() ); } La instrucción recorre la colección trabajadores, extrae cada uno de los elementos de ella, que son de tipo Trabajador, los coloca en la variable t y aplica las instrucciones del bucle .NET CF Un ‘Hola Mundo’ para PocketPC Visual Studio 2003 Nuevo Proyecto C# y Smart Device Application Primer control de formulario TextBox Evento Form_Load private void FormHola_Load(object sender, System.EventArgs e) { this.textHola.Text = "¡¡Hola Mundo!!"; } .NET CF Controles clásicos de formulario (I) Form, Label, TextBox Atributo Text CheckBox, RadioButton Atributos Text y Checked ListBox, ComboBox Atributos Items (indizado) y SelectedIndex Atributos SelectedItem y SelectedValue Command Evento OnClick .NET CF Controles clásicos de formulario (II) Panel Atributo Controls Timer Atributo Interval, evento Tick MainMenu Menú principal del formulario InputPanel Teclado en pantalla En dispositivos móviles suele ser la única posibilidad de entrada de texto Para que aparezca es necesario un MainMenu .NET CF Listas en C# Para almacenar listas de elementos la clase más usada es ArrayList Similar al Vector en Java Namespace System.Collections Crear ArrayList a = new ArrayList(); Añadir a.Add( object ); Acceder a un elemento (usar casting) string elemento = (string)a[0]; Eliminar a.RemoveAt( int índice ); .NET CF a.Remove( object ); Propiedades (I) La forma propia del lenguaje para acceder a los atributos. En Java son los métodos get/set Añadir una propiedad a un atributo class juguete { private string nombre; public string Nombre { get {return nombre;} set {nombre = value;} } } La palabra ‘value’ representa el valor que se le quiere dar a la propiedad .NET CF Propiedades (II) A diferencia de Java, a la hora de acceder a las propiedades, en C# no es necesario escribir los métodos get/set Juguete j = new Juguete(); j.Nombre = “Tambor”; //set, value = “Tambor” string nombreJuguete = j.Nombre //get De esta manera se consigue controlar el acceso a los atributos y sus valores (controlar valores no válidos, propiedades de sólo lectura sin set..) .NET CF Controles ligados a datos: DataBound (I) En lugar de recorrer una colección de datos y manualmente rellenar items de un control de formulario, podemos hacer esto de forma automática Los controles tienen un campo DataSource que les sirve para ligarse a los datos Este campo puede ser cualquier tipo de colección: arrays, ArrayLists... O incluso una colección de datos que proviene directamente de una base de Datos Nos ahorramos leer los registros de una consulta SQL uno por uno y rellenar .NET CF Controles ligados a datos: DataBound (II) DataBound simple string[] nombres = new string[] {“Tambor”, “Bratz”, “Action Man”}; ListBox lista = new ListBox(); ... lista.DataSource = nombres; Lista resultado en el formulario .NET CF DataBound (III) La colección no tiene por qué ser de tipos básicos, puede ser de clases complejas Si el control es en forma de tabla, cada propiedad de la clase será una columna. Si el control sólo puede manejar una propiedad (ListBox) hemos de indicarle qué propiedad utilizar Atributo DisplayMember string, le damos el nombre de la propiedad a visualizar Atributo ValueMember igual que DisplayMember, pero se aplica al atributo ‘value’, si existe, asociado a cada item .NET CF Acceso a Bases de Datos Con Compact Framework se puede acceder a una Base de Datos remota o bien tener una pequeña BD en el dispositivo Se sigue el modelo ADO.NET, evolución de ADO Crear una BD usando el driver ‘SQL Server CE’ implica las siguientes clases SqlCeEngine Crear la BD SqlCeConnection Conexión a la BD SqlCeCommand Comandos SQL de creación de tablas, etc.. Namespace System.Data.SqlServerCe .NET CF SqlCeEngine Crea la Base de Datos dentro del dispositivo, en forma de un archivo con extensión *.sdf en la ruta que se le especifique Crear un engine: Especificar el archivo de la BD SqlCeEngine engine = new SqlCeEngine( “Data Source = \\ruta\\Jugueteria.sdf”); Crear la BD: crea el archivo y monta la BD engine.CreateDatabase(); Si el archivo existe ya, puede haber problemas NameSpace System.IO File.Exists (“NombreArchivo”); File.Delete (“NombreArchivo”); .NET CF SqlCeConnection Se conecta a una BD existente y mantiene una sesión con ella, para enviar comandos, consultas, etc Crear una conexión SqlCeConnection con = new SqlCeConnection( “Data Source = Jugueteria.sdf” ); Abrir la conexión con.Open(); Cerrar la conexión con.Close(); .NET CF SqlCeCommand Manda comandos y consultas a una BD con una conexión abierta Crear un SqlCeCommand: a partir de una conexión abierta SqlCeCommand comm = con.CreateCommand(); Mandar un comando Propiedad CommandText Sentencia SQL Método ExecuteNonQuery() ejecución del comando contra la Base de Datos .NET CF Excepciones Las excepciones se tratan igual que en Java (try / catch / finally) La diferencia es que en el catch sólo es obligatorio poner el tipo de excepción, no es necesario declarar la variable, y no es necesario capturar toda excepción con try / catch. Se propagan automáticamente catch ( SqlCeException ){} catch ( SqlCeException SqlEx ){} Los mensajes de error lo normal es que se muestren en ventanas de mensajes: MessageBox.Show (“Texto”, “Título”); .NET CF Consultas a una BD Siguiendo el modelo ADO.NET, para realizar una consulta se ven implicadas las siguientes clases SqlCeConnection SqlCeCommand Método ExecuteReader() SqlCeDataReader .NET CF SqlCeDataReader El método ExecuteReader() devolverá un objeto de esta clase como resultado, el método de lectura es similar a Java Read() Avanza al siguiente registro. Devuelve false si no hay más registros, true en caso contrario. Es necesario invocar Read() antes de la primera lectura GetString( int columna ) Lee el valor (string) de la columna que se le indique. Hay variantes GetInt32( int ) GetSqlMoney( int ) ... .NET CF DataSet Otro tipo de lectura de BD Estructura de datos compleja que recoge toda la consulta hecha contra la BD Puede colocarse como ‘DataSource’ para ligar el control a los datos de la BD (DataBound) Para rellenar un DataSet usaremos una clase llamada SqlCeDataAdapter SqlCeDataAdapter dataAdapter = new SqlCeDataAdapter(“Consulta SQL", conexión_BD); DataSet dataSet = new DataSet(); dataAdapter.Fill(dataSet); El DataSource más común es dataSet.Tables[0] .NET CF Web Services (I) Un Web Service es un servicio residente en local o en otra máquina y que puede ser invocado en forma de método de forma remota Una forma más de invocación remota Para hacer la invocación, pasar los parámetros y recoger el resultado se utiliza una comunicación basada en XML (standard) La invocación se hace por Web (puerto 80) No es cortada por FireWalls Montones de Web Services Gratuitos http://www.xmethods.net http://www.capescience.com/webservices http://www.webservicex.net/WS/wscatlist.aspx .NET CF Web Services (II) .NET CF puede invocar Web Services Desde Visual Studio 2003 se pueden localizar Web Services muy fácilmente ProyectoSolution ExplorerReferencesAñadir Referencia Web Introducir la url donde se encuentra el servicio y añadir referencia Incluir el NameSpace nuevo que se ha creado (using) El NameSpace del proyecto es Ejercicio y el Web Service está en www.deusto.es using Ejercicio.es.deusto.www; Aparecen clases en ese NameSpace para invocar el servicio Se usan normalmente, pero son objetos remotos .NET CF Referencias en la Web .NET CF Development Center http://msdn.microsoft.com/smartclient/under standing/netcf/ OpenNetCf - http://www.opennetcf.org MSMobiles - http://msmobiles.com/ .NET CF