www.thinkmobile.it • Blog • Forum • Comunità per scambiarsi idee • Tecnologiche e non • • • • ASP.NET Mobile Controls .NET Compact Framework SQL CE / SQL 2005 Mobile Sviluppo nativo in C++ Scambio Informazioni Roberto Brunetti [email protected] http://blogs.devleap.com/rob http://thinkmobile.it/blogs/rob Socket • Namespace System.Net.Sockets • Identico al Desktop • Sincrone / Asincrone • Vari Protocolli • GGP-ICMP-IDP-IGMP-IP-IPV6-IPX-ND-PUP-RAW-SPXSPXII-TCP-UDP • Paradigma Send / Receive • Supporto Async • BeginSend / BeginReceive • BeginAccept / EndAccept HttpWebRequest Dim Req as HttpWebRequest Req = CType(WebRequest.Create (http://xxx.com/Pippo.xml, HttpWebRequest) Dim Resp as HttpResponse Resp = Req.GetResponse() Scenari • Applicazione stand-alone • Scambio dati con ActiveSync (Cradle, Server) • Magazzino Wi-Fi • Accesso diretto al database ?!? • Agente esterno che prende ordini • Serve store locale di informazioni • DataSet salvato in locale, SQL CE • Meccanismo di replica dati • SQLCE nativo, MSMQ, Web Service • Vogliamo avere comunicazioni Server Client • HTTPD su Windows CE (solo ASP) • Socket • MSMQ Scelte accesso ai dati Smart client .NET Compact Framework 1. XML Web Service XML Web Service 2. Accesso SQL Server 4. ADO.NET Dati Locali SQL Server CE SQL Server 3. Sincronizzazione Windows CE (http) Windows Server Scelte Accesso ai Dati • 1. XML Web services • Riutilizzo Web service (desktop, mobile web ecc.) • Incapsulamento Business Logic • Non solo dati... Operazioni/Calcoli etc • 2. Direct SQL Server • Più semplice per applicazioni sempre on-line • Business Logic sul client (Client / Server) • 3. SQL Server CE Synch • Utilizzo di dati locali • Sincronizzazione auto/granulare dei dati • Applicazioni Off-line • 4. Local data access • Utilizzo di store locale per applicazioni Off-line • Utilizzo ADO .NET, SQL Server CE, XML Web Service .NET • Documento .ASMX pubblicato sul Web • Namespace System.Web.Services • Direttiva: <%@ WebService Language=“???” Class=“???” %> • Associare alla classe dei WebMethod: [WebMethod()] public String LeggiDato() { … } public boolean SalvaDati() { … } • Si basano sulla serializzazione XML (System.Xml.Serialization) e sul motore di ASP.NET .NET CF e WS • Identico al .NET Framework • Da VS.NET • Add Web Reference verso il file WSDL • Assegnare un nome • Utilizzo tradizionale Dim x as New XXXXX.Servizio() X.Metodo() Sync via Web Service Windows Forms ASP.NET ADO.NET WS Client Database Local Data .NET Framework .NET Compact Framework • Pro • • • • HTTP Caching con WriteXml Sincronizz. sul Server Nessun bridge • Contro • • Logica di sincronizzazione da gestire Peso del trasferimento dei dati XML Cosa scambiare • DataSet • Supporto nativo in 1.0 e 2.0 • Typed DataSet • Supporto in 2.0 • DataTable • Serializzabile in .NET CF 2.0 • GetChanges • Implementato nella 2.0 • Per la 1.0 http://blogs.devleap.com/rob/archive/2004/11/10/2003.aspx • Classi custom • Più aperto verso altre piattaforme • Più lavoro da fare • XML • 2.0 Serializzazione, XPath, XmlSchema Due consigli • Se scambiamo dati • Passare solo quello che serve • Dummy Call • La risoluzione dei nomi è lentina • La prima richiesta può impiegare del tempo • Invocazione asincrona • 1.0 BeginMetodo • 2.0 MetodoAsync • Creare componente separato • Che conosce i dettagli delle chiamate • Oggi WS domani SOA (WSE2/WSE3) WS: Stato dell’arte • XML Signature • XML Encryption • WSA • WS-I: Consorzio per trovare standard veri • .NET 2.0 allineato a WS-BasicProfile 1.0 • WS-Security • WS-Trust • WS-SecureConversation • WSE 2 SP3 per l’ambiente Desktop • OpenNETCF 1.3 • Indigo • Ci sarà per Windows Mobile ADO.NET verso SQL Server • Reference System.Data.SqlClient • V 3.0.3600 - Richiede Setup sul Device • Utilizzo classico • Stored Procedure • Viste • Novità di SQL 2005 • Broker – SQLCLR – Campi XML • Ancora una volta • Da componente separato per sfruttare caratteristiche del DB e poter sostituire i componenti SQL CE / Sql 2005 Mobile eVB 3.0 ADO CE v3.0 Active X Objects eVC 3.0 OLEDB CE SQL Server 2000 Windows CE Edition OLEDB Client Agent: Replication QP/Cursor Engine/ES OLEDB IIS HTTP Server Agent: Replication and Remote Data Access Storage Engine / Repl Tracking CLIENT Approccio orientato ai dati SERVER MSMQ on Windows CE “Realtà” Distribuita • Più macchine, più reti • Molte apps non sono 100% online • Molte “reti” non sono 100% disponibili • Scenari di malfunzionamento “moltiplicati” • I danni possono essere dispendiosi • Scenari Home Office, Mobile (e disconnected) Carichi di lavoro in base a priorità • Accessi concorrenti MSMQ dal 1997 • Servizio di comunicazione • Asyncronous Comunication • Velocità diverse (App:App, Machine:Machine) • Offline • Message Delivery garantito • Routing di messaggi • Priority-based Architettura Machine 1 Application 1 Application 2 MSMQ API Open Rec’v Send Close Queue manager ‘A’ ‘B’ Msg queues ‘C’ Sys Sys I messaggi sono mantenuti in code Le code sono gestite da gestori di code Le apps accedono a MSMQ via semplici API o oggetti COM System • MSMQ rende possibile lo scambio di messaggi fra programmi MSMQ: Configurazione • MSMQ Server • • • • • Queue manager Routing service Directory service MSMQ Explorer Applicazione Client locale • MSMQ-dependent client • Nessun queue manager • Richiede un MSMQ Server • MSMQ-independent client • Queue manager MSMQ Servers • Store di messaggi Instrada messaggi Supporta applicazioni locali Supporta accesso da client remoti Fornisce MSMQ Explorer Topologie di rete Routing Gestione Application 1 Application 2 MSMQ Server API Open Rec’v Send Close Client proxy server Information server Queue manager Routing server ‘A’ ‘B’ ‘C’ Sys Sys MSMQ-Independent Client • Invia e riceve messaggi Application 1 Memorizza messaggi Opera anche off-line Non supporta dependent client Non può agire da MSMQ router Obbligatorio per i portatili disconnessi Application 2 MSMQ Workstation API Open Rec’v Send Close Queue manager ‘A’ ‘B’ ‘C’ Sys Sys Scenario App -> Server App A Internet App B • • App A sul device invia messaggi a code public o private su un server App B sul server scoda • • Volendo transazionalmente Levo il messaggio solo se TX su DB a buon fine Scenario Device - Device LAN only App A App B • • • App B crea una coda privata locale App A invia messaggi alla coda dell’altro device App B legge i messaggi dalla coda locale • N.B: MSMQCE può scrivere ma non leggere da code remote MSMQ on Windows CE 3.0 • Indipendent Client • Non necessita di infrastruttura • Può lavorare come client tradizionale • Singola Coda • Sending/Receiving • Sul device o su un altro device raggiungibile • Se non raggiunbile si può passare da un server • Delivery • Express • Recoverable • Transaction Single-Message • Ordinamento • Delivery Exactly Once MSMQ on Windows CE 3.0 • • • • Message Prioritization Message Label Journaling Supportato Network Tracking • Instant Reconnection • Regitry per configurazione • Accesso by Computer Name • Necessario DNS o WINS: lookup e reverse lookup • Unique name dei vari device • NETREGD: utility per registrare CE in WINS • Da CE 4.2 accesso via http alle code Demo App to App Application A Messages MSMQ Messages Application B • Solo Codice DLMobility/MSMQ20/EstatesManagement20 • Send • Receive • ReceiveAsync • Tornare sul desktop • Stesse righe di codice • Visualizzazione code da Computer Manager • O MSMQ Explorer • Stesse demo Recoverable • Message.Recoverable Message m = new Message(); m.Body = orderObject1; m.Recoverable = true; // guaranteed delivery • True • Il delivery è assicurato (salva il messaggio su “disco”) • Durante tutta la strada • Più lento e consuma più risorse • Sopravvive a reboot • False (Default) • Delivery non garantito • Veloce e leggero • Possibile perdita dei messaggi Transaction • I messaggi recoverable sono garantiti ma • Possono essere spediti più di una volta • Possono essere spediti in ordine “sparso” • Messaggi transazionali • Exactly-Once / In-Order • Supporto solo per Single Internal Transaction • Nessun supporto per MTS/COM+ • Occorre creare code transazionali • E usare i parametri seguenti MessageQueue mq = new MessageQueue(@".\Private$\TranQ", true); Message m = new Message(); m.Body = orderObject1; mq.Send(m, MessageQueueTransactionType.Single); Timeout Proprietà Significato Message.TimeToReachQueue Message.TimeToBeReceived Tempo per raggiungere la coda e per essere letto Assicurarsi la sincronia dei clock o casini !!! Message.AdministrationQueue Coda associabile al messaggio. Riceverà messaggi sull’avvenuta spedizione/ricezione/lettura Message.AcknowledgementType Tipo di Ack richiesto NegativeReceive, PositiveReceive, FullReceive Message.UseDeadLetterQueue Usa coda di sistema machine\Deadletter$ false – messaggi non spediti persi true – copia dei messaggi non spediti nella Dead Letter Queue Jounaling Si può decidere di tenere una copia di ogni messaggio nella coda di sistema Admin Queue // Creo Coda amministrativa MessageQueue.Create(@".\private$\AdminQueue"); // Messaggio Message myMessage = new Message(“Ciao Ciao"); myMessage.AdministrationQueue = new MessageQueue(@"PPCDEVICE\private$\AdminQueue"); myMessage.AcknowledgeType = AcknowledgeTypes.FullReceive; myMessage.TimeToBeReceived = new TimeSpan(0,0,5); // Invio normale MessageQueue myQueue = new MessageQueue(@“SERVER\private$\myQueue"); myQueue.Send(myMessage); // Recupero il MessageID per interrogare coda admin string messageId = myMessage.Id; • N.B Il messaggio non arriva o viene cancellato se non letto entro il timeout (Timeout 5 secondi) Passo successivo • Ho bisogno di una risposta dall’applicazione che processa i messaggi • Imposto ReponseQueue sul messaggio per indicare dove voglio la risposta • Il ricevente legge msg.ResponseQueue per inviare le risposte • Leggo la coda indicata come ReponseQueue per vedere le risposte Abbiamo ancora tempo ? • Installazione (Platform SDK) • C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Support\Msmq • Copiare i file sotto \Windows • Per il processore corretto come sempre • N.B. Emulatore • X86 VS.NET 2003 e Platform SDK • ARM VS 2005 • • • • Dare un Nome al Device VisAdm.exe -> Shortcuts -> Install VisAdm.exe -> Shortcuts -> Register Soft Reset Starting MSMQ On The Device • Alcuni device hanno già tutto • Per gli altri • msmqadm.exe - msmqadmext.dll - msmqd.dll msmqrt.dll - visadm.exe • Si trovano in Windows Mobile 2003 SDKs • C:\Program Files\Windows CE Tools\ wce420\{device}\Support\msmq\armv4 • Usare \armv4 (non \x86) per Emulatori di VS 2005 ! • Per Windows Mobile 5.0 • MSMQ CAB file Starting MSMQ • File Explorer \windows\visadm.exe • Install • Register • Verify • Start • Status Installazione da codice • Runtime file nel progetto • Build Action a Content • Copy to Output Directory a Copy if Newer • Codice per copiarli sotto \Windows • CreateProcess per chiamare msmqadm.exe per installare e far partire il servizio MQ: la soluzione a tutto ? • Molte realtà necessitano di diverse tecniche di comunicazione • Può essere un overhead significativo • Quando il mittente necessita di info dal destinatario • Single server o piccola LAN • Installazione e programmazione • Non offre un “all-or-nothing” distribuito • Per definizione comunicazioni Asincrone • Non offre supporto per i dati • Non ha un DB, non è un DB • Affiancabile a SQL CE o SQL Server Comparazione HTTP Support Handling Network Availability Security Facilità Deployment Server config MSMQ ¹ Web services ³ Sockets ² ³ SQL Mobile RDA ³ 1. MSMQ HTTP non supportato da Windows Mobile 3.0 2. System.Net.HttpWebRequest\WebResponse usano le Socket 3. Web services, Sockets e SQL Mobile richiedono codice per capire lo stato della connessione