Utilizzare le API di connettività con .NET Compact Framework Marco Frontini [email protected] www.softandroll.it Fabio Santini [email protected] www.fsantini.net http://blogs.msdn.com/fabiosantini Agenda • • • • • • • • • • Utility P/Invoke per le API di connettività La classe MessageWindows API per la gestione degli SMS e delle chiamate Comunicazioni IrDA Intercettare un SMS Bluetooth in Windows Mobile 2003 con lo Smart Device Framework 1.3 Connection Manager Nuove api del CF 2.0 per la gestione degli SMS, Phone , Bluetooth Notification Broker Utility utili • • • • • vxUtil – Network/Internet vxIpConfig – con release/renew vxSnmp – read/update value SNMP vxSniffer – Network monitor PocketHost – http://www.handango.com/PlatformProductDetail.js p?siteId=1&jid=F735FE44921F5D6A184C7CC75BXB F2AX&platformId=2&productType=2&catalog=0&am p;sectionId=0&productId=54305 Chiamare codice unmanaged P/Invoke (C#) • Utilizzare platform invoke (P/Invoke) per chiamare codice unmanaged • dichiarare la dll esterna tramite l’attributo DllImport • segnare il metodo come “static extern” • chiamare il metodo normalmente • possono essere chiamate solo DLL non COM Namespace DllImport rendere l’API disponibile using System.Runtime.InteropServices; public class DoStuff { [DllImport("coredll.dll")] public static extern int SetCursor(int cursorHandle); public void Warp(int handle) { SetCursor(handle); } chiamata } Gestione degli errori • DllImport può rendere gli errori Win32 disponibili • Impostare SetError a True per mappare gli errori Win32 • chiamare Marshal.GetLastWin32Error using System.Runtime.InteropServices; mappare gli errori public class DoStuff { [DllImport("coredll.dll", SetLastError = True)] public static extern int SetCursor(int cursorHandle); public void Warp(int handle) { SetCursor(handle); if (Marshal.GetLastWin32Error() != 0) // handle error } chiamata Controllo errore } Supporto al marshalling di .NET CF • CF supporta solo i tipi base • marshalling by-value molto limitato • deve essere un 32 bits (4 bytes) o meno • deve essere un integral • marshalling by-reference richiesto per molti tipi • richiede un puntatore nel metodo Win32 • CF automaticamente ‘blocca’ i parametri • si assicura che il garbage collector non liberi quella memoria • classi e strutture presentano differenti problematiche • spesso è richiesto un marshalling manuale Marshalling CF Type C# Type VB Type Win32 Type ByVal ByRef Boolean bool Boolean BYTE Yes Yes (*) Int16 short Short SHORT Yes Yes (*) Int32 int Integer INT32 Yes Yes (*) Int64 long Long INT64 Yes Yes (*) Byte byte Byte BYTE Yes Yes (*) Char char Char WCHAR Yes Yes (*) Single float Single FLOAT No Yes (*) Double double Double DOUBLE No Yes (*) String string String WCHAR * Yes No StringBuilder StringBuilder StringBuilder WCHAR * Yes No User Defined Value Type struct Structure struct or class No Yes (*) class Class Class struct or class Yes (*) No Array of Value Type T[ ] T( ) T*/T[ ] Yes No Lavorare con i messaggi Windows • La maggior parte dell API richiede l’uso di un window handle • I window handles (HWND) sono al centro dell’architettura di Windows • L’implementazione dei controlli del CF previene l’uso di messaggi personalizzati • nessun accesso al sistema interno di gestione dei messaggi • nessun accesso a HWND • nessuna personalizzazione del comportamento • e’ necessaria una classe speciale per gestire i messaggi • Microsoft.WindowsCE.Forms.MessageWindow MessageWindow • MessageWindow incapsula le funzionalità dei messaggi di windows • La proprietà Hwnd è il window handle • si può fare l’override della WndProc per processare i messaggi • riceve i messaggi in una struttura • chiama la WndProc base per ottenere il comportamento di default • metodi statici usati per send/post • MessageWindow.SendMessage • MessageWindow.PostMessage MessageWindow class personalizzata public class MyMessageWin : MessageWindow { const int WM_USER = 1024; public const int WM_DOWORK + 1; protected override void WndProc(ref Message m) { base.WndProc (ref m); if (m.Msg == WM_DOWORK) { // m.WParam & m.LParam } } } Usare la MessageWindow class crea un istanza public void DoWork() { MyMessageWin _theWin = new MyMessageWin(); IntPtr longVal = new IntPtr(100); Si utilizzano sempre gli IntPtr Message m = Message.Create(_theWin.Hwnd, _theWin.WM_DOWORK, IntPtr.Zero, longVal); invio del messaggio MessageWindow.SendMessage(ref m); } handle message values MessageWindows Irda • Comunicazione tra dispositivi, stampanti (specialmente nei centri commerciali ) e ActiveSync • Discovering dei dispositivi nel raggio d’azione Demo IrDA Short Message Service (SMS) • Usato per messaggi corti • Capacità di concatenare messaggi • API • Text – SMS API (sms.h) per inviare • Text – Inbox Rule per intercettare i messaggi • Dopo un esempio con Fabio (CF 2.0) SMS API Send Text Message • Low level API under all other SMS services SMS_HANDLE hsms = NULL; hr = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &hsms, 0); SMS_ADDRESS smsaAddress; smsaAddress.smsatAddressType = SMSAT_INTERNATIONAL; wcscpy(smsaAddress.ptsAddress, pszName); TEXT_PROVIDER_SPECIFIC_DATA tpsData; tpsData.psMessageClass = PS_MESSAGE_CLASS1; psData.psReplaceOption = PSRO_NONE; hr = SmsSend(hsms, NULL, &smsaAddress, NULL, (BYTE*) pszMsg, wcslen(pszMsg) * sizeof(WCHAR), (BYTE*) &tpsData, sizeof(tpsData), SMSDE_OPTIMAL, SMS_OPTION_DELIVERY_NONE, &smsmidMessageID) hr = SmsClose(hsms); Classe Managed per SMS e Phone Inbox Rule Client Ricezione di SMS Inbox Inbox Application Application SMS Transport Rule 1 DLL Rule 1 DLL Rule 2 DLL Your Rule DLL Inbox Rule Client La nostra DLL Recupera il Body del Messaggio Si E’ il messaggio che vogliamo? L’applicazi one è in esecuzione ? No No Lo lascia andare verso la Inbox Esegue l’applicazione Si Passa il body all’applicazione utilizzando vari sistemi Intercettare i messaggi SMS +14250010001 !!!! Bluetooth • Bluetooth • • • • • Corto raggio (100 metri max) Massimo 16 dispositivi 1 Mbps Peer to peer Autenticazione e Cripting Le API Bluetooth • Le API dei dispositivi • BthSetMode() • BthGetMode() • API per la gestione delle porte COM • Utilizzare Winsock • Utilizzare le interfaccie grafiche standard Le API Bluetooth • int BthSetMode( DWORD dwMode ) • Imposta la modalità Bluetooth • int BthGetMode( DWORD* pdwMode ) • Recupera la modalità corrente del Bluetooth • Modalità • BTH_POWER_OFF • BTH_CONNECTABLE • BTH_DISCOVERABLE Connection Manager • Connessione “intelligente” • Network based vs. Connection based • Ogni CSP ha un suo criterio di connessione • costo, larghezza di banda, latenza, tempo di connessione, etc. • Posso essere aggiunti altri CSP • Configurazioni predefinite • Impostate dai carrie o dalle aziende Planner Connection Manager Voice RAS Proxy PPTP GPRS etc Connection Service Providers Connection Manager • Il Connection Manager sostituisce le RAS API • Gestisce l’intero processo di connessione • Le connessioni sono dichiarate a seconda della destinazione (Internet o Corporate Network) • Il Connection manager gestisce connessioni che prevedono più “salti” • Esempio di connessione ad una rete corporate: il connection manager attiva la connessione GPRS verso internet e in seguito attiva la connessione PPTP verso l’azienda. • Connection manager può utilizzare l’opzione “desktop pass through” attraverso Active Sync. Connection Manager UI del Connection Manager Applicazione XML Provisioning Document URL Mapper Planner Configuration Manager Connection Manager Engine Voice RAS Proxy PPTP GPRS etc Connection Manager • ConnMgrMapURL() • Determina la destinazione corretta a seconda dell’URL che viene utilizzato • E’ importante usare questa API per stabilire se la connessione è internet o intranet • ConnMgrEstablishConnection() • Utilizzata per stabilire la connessione • Gestisce gli handle durante tutta la connessione • ConnMgrEstablishConnectionSync() Connection Manager • ConnMgrReleaseConnection() • Chiude la connessione • ConnMgrConnectionStatus() • Determina lo stato della connessione • Notifica cambiamenti attraverso eventi o messaggi windows • Controllare lo stato per determinare una eventuale disconnessione Connection Manager Phone.Talk Dim phone As New Phone phone.Talk( “055-4400494” ) • Proprietà e eventi recuperabili tramite State & Notification Broker E-Mail e SMS SmsMessage msg = new SmsMessage(); msg.To.Add( new Recipient(“3495555555")); msg.Body = “Ciao Nello !"; msg.Send(); Contact != Recipient Contact myCustomer; // ... EmailMessage msg = new EmailMessage(); msg.To.Add( myCustomer ); // Non Compila msg.To.Add( new Recipient( myCustomer.Email2Address ) ); // OK SMS/Email: interazione con l’utente • Compose Form • Visualizzazione Inbox • Sincronizzare Intercept SMS MessageInterceptor sms; void Form_Load( ... ) { sms = new MessageInterceptor(); //... Proprietà opzionali sms.MessageReceived += new EventHandler(sms_MessageReceived); } void sms_MessageReceived(...) { //... Arrivato messaggio !!! } Che ne faccio del messaggio ? MessageInterceptor sms; void Form_Load( ... ) { sms = new MessageInterceptor(); sms.InterceptionAction = InterceptionAction.NotifyAndDelete; sms.MessageReceived += new EventHandler(sms_MessageReceived); } void sms_MessageReceived(...) { //... Handle incoming message } Bluetooth in Windows Mobile 5.0 • • Utilizza la UI per fare il “pairing” Un dispositivo pubblica il servizio • • Un dispositivo cerca i servizi • • GetPairedDevices() E si connette tramite il GIUD • • New BluetoothService( GUID ) BluetoothDevice.Connect( GUID ) A quel punto si ottiene un NetworkStream da utilizzare per trasferire i dati Nuove classi Windows Mobile 5.0 SMS e Phone Gestione dello stato Microsoft.WindowsMobile.Status • Nuovo State and Notification Broker • Accesso allo stato di sistema e delle applicazioni • Supporta la notifica delle modifiche dello stato • Recupera e aggiorna i dettagli sui vari stati • Condivide lo stato tra più applicazioni • Oggi esiste ma è un casino • Sono voci di registro che cambiano costantemente Stati predefiniti • Più di 140 stati predefiniti • Appuntamenti • aggiunta, modifica, conflitti, etc. • Hardware • Camera, tastiera, cradle, headset, car kit • Messaggi • Email, SMS, MMS, voice, ActiveSync • Phone • Profili, chiamate, segnale, GPRS, log La classe SystemState • SystemState gestisce gli stati predefiniti • RegistryState supporta stati custom Condizioni sugli stati • Può restringere la notifica applicando delle condizioni • Confronto tra I valori di uno stato • Di default usa AnyChange Tipi di notifica • Notifica temporanea • L’applicazione viene notificata quando è in esecuzione • Viene chiamato un event handler • Si perde dopo un reset • Notifica persistente • L’applicazione viene eseguita se non è già in esecuzione • Usa i parametri a riga di comando • Rimane dopo un soft reset Notification Broker © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY. Content created by 3 Leaf Solutions