Utilizzare le API di Utilizzare le API di connettività con .NET connettività con .NET Compact FrameworkCompact Framework
Marco FrontiniMarco [email protected]@softandroll.itwww.softandroll.itwww.softandroll.it
Fabio SantiniFabio [email protected]@microsoft.comwww.fsantini.netwww.fsantini.nethttp://blogs.msdn.com/fabiosantinihttp://blogs.msdn.com/fabiosantini
AgendaAgenda
• UtilityUtility • P/Invoke per le API di connettivitàP/Invoke per le API di connettività• La classe MessageWindows La classe MessageWindows • API per la gestione degli SMS e delle chiamateAPI per la gestione degli SMS e delle chiamate• Comunicazioni IrDAComunicazioni IrDA• Intercettare un SMSIntercettare un SMS• Bluetooth in Windows Mobile 2003 con lo Smart Device Bluetooth in Windows Mobile 2003 con lo Smart Device
Framework 1.3Framework 1.3 • Connection ManagerConnection Manager• Nuove api del CF 2.0 per la gestione degli SMS, Phone , Nuove api del CF 2.0 per la gestione degli SMS, Phone ,
BluetoothBluetooth• Notification BrokerNotification Broker
Utility utili Utility utili
• vxUtil – Network/InternetvxUtil – Network/Internet• vxIpConfig – con release/renewvxIpConfig – con release/renew• vxSnmp – read/update value SNMPvxSnmp – read/update value SNMP• vxSniffer – Network monitorvxSniffer – Network monitor• PocketHost – PocketHost –
http://www.handango.com/PlatformProductDetail.jshttp://www.handango.com/PlatformProductDetail.jsp?p?siteId=1&jid=F735FE44921F5D6A184C7CC75BXBF2siteId=1&jid=F735FE44921F5D6A184C7CC75BXBF2AX&platformId=2&productType=2&catalog=0&AX&platformId=2&productType=2&catalog=0&sectionId=0&productId=54305sectionId=0&productId=54305
Chiamare codice unmanagedChiamare codice unmanaged P/Invoke (C#) P/Invoke (C#)
• Utilizzare Utilizzare platform invokeplatform invoke (P/Invoke) per chiamare codice (P/Invoke) per chiamare codice unmanagedunmanaged• dichiarare la dll esterna tramite l’attributo dichiarare la dll esterna tramite l’attributo DllImportDllImport• segnare il metodo come “static extern”segnare il metodo come “static extern”• chiamare il metodo normalmentechiamare il metodo normalmente• possono essere chiamate solo DLL non COMpossono essere chiamate solo DLL non COM
using System.Runtime.InteropServices;
public class DoStuff{ [DllImport("coredll.dll")] public static extern int SetCursor(int cursorHandle);
public void Warp(int handle) { SetCursor(handle); }}
NamespaceDllImport
rendere l’APIdisponibile
chiamata
Gestione degli erroriGestione degli errori• DllImportDllImport può rendere gli errori Win32 disponibili può rendere gli errori Win32 disponibili
• Impostare Impostare SetErrorSetError a True per mappare gli errori Win32 a True per mappare gli errori Win32• chiamare chiamare Marshal.GetLastWin32ErrorMarshal.GetLastWin32Error
using System.Runtime.InteropServices;
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
mappare glierrori
Controlloerrore
Supporto al marshalling di .NET Supporto al marshalling di .NET CFCF
• CF supporta solo i tipi baseCF supporta solo i tipi base• marshalling by-value molto limitatomarshalling by-value molto limitato
• deve essere un 32 bits (4 bytes) o menodeve essere un 32 bits (4 bytes) o meno• deve essere un integral deve essere un integral
• marshalling by-reference richiesto per molti tipimarshalling by-reference richiesto per molti tipi• richiede un puntatore nel metodo Win32richiede un puntatore nel metodo Win32• CF automaticamente ‘blocca’ i parametriCF automaticamente ‘blocca’ i parametri
• si assicura che il garbage collector non liberi quella memoriasi assicura che il garbage collector non liberi quella memoria
• classi e strutture presentano differenti problematicheclassi e strutture presentano differenti problematiche• spesso è richiesto un marshalling manualespesso è richiesto un marshalling manuale
MarshallingMarshallingCF TypeCF Type C# TypeC# Type VB TypeVB Type Win32 TypeWin32 Type ByValByVal ByRefByRef
BooleanBoolean boolbool BooleanBoolean BYTEBYTE YesYes Yes (*)Yes (*)
Int16Int16 shortshort ShortShort SHORTSHORT YesYes Yes (*)Yes (*)
Int32Int32 intint IntegerInteger INT32INT32 YesYes Yes (*)Yes (*)
Int64Int64 longlong LongLong INT64INT64 YesYes Yes (*)Yes (*)
ByteByte bytebyte ByteByte BYTEBYTE YesYes Yes (*)Yes (*)
CharChar charchar CharChar WCHARWCHAR YesYes Yes (*)Yes (*)
SingleSingle floatfloat SingleSingle FLOATFLOAT NoNo Yes (*)Yes (*)
DoubleDouble doubledouble DoubleDouble DOUBLEDOUBLE NoNo Yes (*)Yes (*)
StringString stringstring StringString WCHAR *WCHAR * YesYes NoNo
StringBuilderStringBuilder StringBuilderStringBuilder StringBuilderStringBuilder WCHAR *WCHAR * YesYes NoNo
User Defined User Defined Value TypeValue Type structstruct StructureStructure struct or classstruct or class NoNo Yes (*)Yes (*)
classclass ClassClass ClassClass struct or classstruct or class Yes (*)Yes (*) NoNo
Array of Value Array of Value TypeType T[ ]T[ ] T( )T( ) T*/T[ ]T*/T[ ] YesYes NoNo
Lavorare con i messaggi WindowsLavorare con i messaggi Windows
• La maggior parte dell API richiede l’uso di un La maggior parte dell API richiede l’uso di un window handlewindow handle• I window handles (HWND) sono al centro I window handles (HWND) sono al centro
dell’architettura di Windowsdell’architettura di Windows• L’implementazione dei controlli del CF previene l’uso L’implementazione dei controlli del CF previene l’uso
di messaggi personalizzati di messaggi personalizzati • nessun accesso al sistema interno di gestione dei messagginessun accesso al sistema interno di gestione dei messaggi• nessun accesso a HWNDnessun accesso a HWND• nessuna personalizzazione del comportamentonessuna personalizzazione del comportamento
• e’ necessaria una classe speciale per gestire i e’ necessaria una classe speciale per gestire i messaggimessaggi
• Microsoft.WindowsCE.Forms.MessageWindowMicrosoft.WindowsCE.Forms.MessageWindow
MessageWindowMessageWindow
• MessageWindow incapsula le funzionalità dei MessageWindow incapsula le funzionalità dei messaggi di windowsmessaggi di windows• La proprietà Hwnd è il window handleLa proprietà Hwnd è il window handle• si può fare l’override della WndProc per processare i si può fare l’override della WndProc per processare i
messaggimessaggi• riceve i messaggi in una strutturariceve i messaggi in una struttura• chiama la WndProc base per ottenere il comportamento di chiama la WndProc base per ottenere il comportamento di
defaultdefault
• metodi statici usati per send/postmetodi statici usati per send/post• MessageWindow.SendMessageMessageWindow.SendMessage• MessageWindow.PostMessageMessageWindow.PostMessage
MessageWindow class MessageWindow class personalizzatapersonalizzata
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 classUsare la MessageWindow class
public void DoWork(){ MyMessageWin _theWin = new MyMessageWin();
IntPtr longVal = new IntPtr(100);
Message m = Message.Create(_theWin.Hwnd, _theWin.WM_DOWORK, IntPtr.Zero, longVal);
MessageWindow.SendMessage(ref m); }
crea un istanza
handleSi utilizzano sempre gli
IntPtr
message
values
invio del messaggio
MessageWindowsMessageWindowsMessageWindowsMessageWindows
IrdaIrda
• Comunicazione tra dispositivi, stampanti Comunicazione tra dispositivi, stampanti (specialmente nei centri commerciali (specialmente nei centri commerciali ) e ) e ActiveSyncActiveSync
• Discovering dei dispositivi nel raggio d’azioneDiscovering dei dispositivi nel raggio d’azione
Demo IrDADemo IrDADemo IrDADemo IrDA
Short Message Service (SMS)Short Message Service (SMS)
• Usato per messaggi cortiUsato per messaggi corti• Capacità di concatenare messaggiCapacità di concatenare messaggi
• APIAPI• Text – SMS API (sms.h) per inviareText – SMS API (sms.h) per inviare• Text – Inbox Rule per intercettare i messaggiText – Inbox Rule per intercettare i messaggi
• Dopo un esempio con Fabio (CF 2.0)Dopo un esempio con Fabio (CF 2.0)
SMS APISMS APISend Text MessageSend Text Message
• Low level API under all other SMS servicesLow level API under all other SMS services
SMS_HANDLE hsms = NULL;SMS_HANDLE hsms = NULL;hr = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &hsms, 0);hr = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &hsms, 0);
SMS_ADDRESS smsaAddress;SMS_ADDRESS smsaAddress;smsaAddress.smsatAddressType = SMSAT_INTERNATIONAL;smsaAddress.smsatAddressType = SMSAT_INTERNATIONAL;wcscpy(smsaAddress.ptsAddress, pszName); wcscpy(smsaAddress.ptsAddress, pszName);
TEXT_PROVIDER_SPECIFIC_DATA tpsData;TEXT_PROVIDER_SPECIFIC_DATA tpsData;tpsData.psMessageClass = PS_MESSAGE_CLASS1;tpsData.psMessageClass = PS_MESSAGE_CLASS1;psData.psReplaceOption = PSRO_NONE;psData.psReplaceOption = PSRO_NONE;
hr = hr = SmsSendSmsSend(hsms, NULL, &smsaAddress, NULL,(hsms, NULL, &smsaAddress, NULL,(BYTE*) pszMsg, wcslen(pszMsg) * sizeof(WCHAR),(BYTE*) pszMsg, wcslen(pszMsg) * sizeof(WCHAR),(BYTE*) &tpsData, sizeof(tpsData), (BYTE*) &tpsData, sizeof(tpsData), SMSDE_OPTIMAL, SMS_OPTION_DELIVERY_NONE,SMSDE_OPTIMAL, SMS_OPTION_DELIVERY_NONE,&smsmidMessageID)&smsmidMessageID)
hr = SmsClose(hsms);hr = SmsClose(hsms);
Classe Managed per SMS e PhoneClasse Managed per SMS e PhoneClasse Managed per SMS e PhoneClasse Managed per SMS e Phone
InboxInboxApplicationApplication
Rule 1 DLLRule 1 DLL
InboxInboxApplicationApplication
Rule 1 DLLRule 1 DLL
InboxInboxApplicationApplication
Rule 1 DLLRule 1 DLL
Rule 2 DLLRule 2 DLL
SMSSMSTransportTransport
Inbox Rule ClientInbox Rule Client Ricezione di SMSRicezione di SMS
Your RuleYour RuleDLLDLL
La nostra DLLLa nostra DLLRecupera il Recupera il
Body del Body del MessaggioMessaggio
E’ il messaggioE’ il messaggioche vogliamo?che vogliamo?
L’applicaziL’applicazione è in one è in
esecuzioneesecuzione??
Esegue Esegue l’applicazionel’applicazione
Passa il body Passa il body all’applicazione all’applicazione utilizzando vari utilizzando vari
sistemisistemi
SiSi SiSi
NoNo
Lo lascia Lo lascia andare verso la andare verso la
InboxInbox
NoNo
Inbox Rule ClientInbox Rule Client
Intercettare i messaggi SMSIntercettare i messaggi SMS +14250010001 !!!!+14250010001 !!!!
Intercettare i messaggi SMSIntercettare i messaggi SMS +14250010001 !!!!+14250010001 !!!!
BluetoothBluetooth
• BluetoothBluetooth• Corto raggio (100 metri max)Corto raggio (100 metri max)• Massimo 16 dispositiviMassimo 16 dispositivi• 1 Mbps1 Mbps• Peer to peerPeer to peer• Autenticazione e CriptingAutenticazione e Cripting
Le API BluetoothLe API Bluetooth
• Le API dei dispositiviLe API dei dispositivi• BthSetMode()BthSetMode()• BthGetMode()BthGetMode()
• API per la gestione delle porte COMAPI per la gestione delle porte COM• Utilizzare WinsockUtilizzare Winsock• Utilizzare le interfaccie grafiche standardUtilizzare le interfaccie grafiche standard
Le API BluetoothLe API Bluetooth
• int BthSetMode( DWORD dwMode )int BthSetMode( DWORD dwMode )• Imposta la modalità BluetoothImposta la modalità Bluetooth
• int BthGetMode( DWORD* pdwMode )int BthGetMode( DWORD* pdwMode )• Recupera la modalità corrente del BluetoothRecupera la modalità corrente del Bluetooth
• ModalitàModalità• BTH_POWER_OFFBTH_POWER_OFF• BTH_CONNECTABLEBTH_CONNECTABLE• BTH_DISCOVERABLEBTH_DISCOVERABLE
Connection ManagerConnection Manager
Connection Manager
Voice
• Connessione “intelligente” Connessione “intelligente” • Network based vs. Connection basedNetwork based vs. Connection based
• Ogni CSP ha un suo criterio di connessioneOgni CSP ha un suo criterio di connessione• costo, larghezza di banda, latenza, tempo di connessione, etc.costo, larghezza di banda, latenza, tempo di connessione, etc.• Posso essere aggiunti altri CSPPosso essere aggiunti altri CSP
• Configurazioni predefiniteConfigurazioni predefinite• Impostate dai carrie o dalle aziendeImpostate dai carrie o dalle aziende
RAS Proxy PPTP GPRS etc
Planner
ConnectionServiceProviders
Connection ManagerConnection Manager
• Il Connection Manager sostituisce le RAS APIIl Connection Manager sostituisce le RAS API• Gestisce l’intero processo di connessioneGestisce l’intero processo di connessione• Le connessioni sono dichiarate a seconda della Le connessioni sono dichiarate a seconda della
destinazione (Internet o Corporate Network)destinazione (Internet o Corporate Network)• Il Connection manager gestisce connessioni che Il Connection manager gestisce connessioni che
prevedono più “salti”prevedono più “salti”• Esempio di connessione ad una rete corporate: il connection Esempio di connessione ad una rete corporate: il connection
manager attiva la connessione GPRS verso internet e in seguito manager attiva la connessione GPRS verso internet e in seguito attiva la connessione PPTP verso l’azienda.attiva la connessione PPTP verso l’azienda.
• Connection manager può utilizzare l’opzione “desktop pass Connection manager può utilizzare l’opzione “desktop pass through” attraverso Active Sync.through” attraverso Active Sync.
Connection Manager
Connection Manager EngineConnection Manager Engine
VoiceVoice RASRAS ProxyProxy PPTPPPTP GPRSGPRS etcetc
PlannerPlanner ConfigurationConfigurationManagerManager
UI del Connection ManagerUI del Connection Manager
XMLXMLProvisioningProvisioningDocumentDocument
URLURLMapperMapper
ApplicazioneApplicazione
Connection ManagerConnection Manager
• ConnMgrMapURL()ConnMgrMapURL()• Determina la destinazione corretta a seconda dell’URL Determina la destinazione corretta a seconda dell’URL
che viene utilizzatoche viene utilizzato• E’ importante usare questa API per stabilire se la E’ importante usare questa API per stabilire se la
connessione è internet o intranetconnessione è internet o intranet
• ConnMgrEstablishConnection()ConnMgrEstablishConnection()• Utilizzata per stabilire la connessioneUtilizzata per stabilire la connessione• Gestisce gli handle durante tutta la connessioneGestisce gli handle durante tutta la connessione• ConnMgrEstablishConnectionSync()ConnMgrEstablishConnectionSync()
Connection ManagerConnection Manager
• ConnMgrReleaseConnection()ConnMgrReleaseConnection()• Chiude la connessioneChiude la connessione
• ConnMgrConnectionStatus()ConnMgrConnectionStatus()• Determina lo stato della connessioneDetermina lo stato della connessione• Notifica cambiamenti attraverso eventi o messaggi Notifica cambiamenti attraverso eventi o messaggi
windowswindows• Controllare lo stato per determinare una eventuale Controllare lo stato per determinare una eventuale
disconnessionedisconnessione
Connection ManagerConnection ManagerConnection ManagerConnection Manager
Phone.TalkPhone.Talk
• Proprietà e eventi recuperabili tramiteProprietà e eventi recuperabili tramiteState & Notification BrokerState & Notification Broker
Dim phone As New Phonephone.Talk( “055-4400494” )
E-Mail e SMSE-Mail e SMS
SmsMessage msg = new SmsMessage();
msg.To.Add( new Recipient(“3495555555"));
msg.Body = “Ciao Nello !";
msg.Send();
Contact != RecipientContact != RecipientContact myCustomer;// ...EmailMessage msg = new EmailMessage();msg.To.Add( myCustomer ); // Non Compilamsg.To.Add( new Recipient( myCustomer.Email2Address ) ); // OK
SMS/Email: interazione con SMS/Email: interazione con l’utentel’utente
• Compose FormCompose Form• Visualizzazione InboxVisualizzazione Inbox• SincronizzareSincronizzare
Intercept SMSIntercept 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 ?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 Bluetooth in Windows Mobile 5.05.0
• Utilizza la UI per fare il “pairing”Utilizza la UI per fare il “pairing”• Un dispositivo pubblica il servizioUn dispositivo pubblica il servizio
• New BluetoothService( GUID )New BluetoothService( GUID )
• Un dispositivo cerca i serviziUn dispositivo cerca i servizi• GetPairedDevices()GetPairedDevices()
• E si connette tramite il GIUDE si connette tramite il GIUD• BluetoothDevice.Connect( GUID )BluetoothDevice.Connect( GUID )
• A quel punto si ottiene un NetworkStream da utilizzare A quel punto si ottiene un NetworkStream da utilizzare per trasferire i datiper trasferire i dati
Nuove classi Windows Mobile 5.0Nuove classi Windows Mobile 5.0SMS e PhoneSMS e Phone
Nuove classi Windows Mobile 5.0Nuove classi Windows Mobile 5.0SMS e PhoneSMS e Phone
Gestione dello statoGestione dello statoMicrosoft.WindowsMobile.StatusMicrosoft.WindowsMobile.Status
• Nuovo State and Notification BrokerNuovo State and Notification Broker• Accesso allo stato di sistema e delle Accesso allo stato di sistema e delle
applicazioniapplicazioni• Supporta la notifica delle modifiche dello Supporta la notifica delle modifiche dello
statostato• Recupera e aggiorna i dettagli sui vari statiRecupera e aggiorna i dettagli sui vari stati• Condivide lo stato tra più applicazioniCondivide lo stato tra più applicazioni
• Oggi esiste ma è un casino Oggi esiste ma è un casino • Sono voci di registro che cambiano Sono voci di registro che cambiano
costantementecostantemente
Stati predefinitiStati predefiniti
• Più di 140 stati predefinitiPiù di 140 stati predefiniti• AppuntamentiAppuntamenti
• aggiunta, modifica, conflitti, etc. aggiunta, modifica, conflitti, etc.
• HardwareHardware• Camera, tastiera, cradle, headset, car kitCamera, tastiera, cradle, headset, car kit
• MessaggiMessaggi• Email, SMS, MMS, voice, ActiveSyncEmail, SMS, MMS, voice, ActiveSync
• PhonePhone• Profili, chiamate, segnale, GPRS, logProfili, chiamate, segnale, GPRS, log
La classe SystemStateLa classe SystemState
• SystemState gestisce gli stati predefinitiSystemState gestisce gli stati predefiniti• RegistryState supporta stati customRegistryState supporta stati custom
Condizioni sugli statiCondizioni sugli stati
• Può restringere la notifica applicando delle Può restringere la notifica applicando delle condizionicondizioni• Confronto tra I valori di uno statoConfronto tra I valori di uno stato• Di default usa AnyChangeDi default usa AnyChange
Tipi di notificaTipi di notifica
• Notifica temporaneaNotifica temporanea• L’applicazione viene notificata quando è in esecuzioneL’applicazione viene notificata quando è in esecuzione• Viene chiamato un event handlerViene chiamato un event handler• Si perde dopo un resetSi perde dopo un reset
• Notifica persistenteNotifica persistente• L’applicazione viene eseguita se non è già in esecuzioneL’applicazione viene eseguita se non è già in esecuzione• Usa i parametri a riga di comandoUsa i parametri a riga di comando• Rimane dopo un soft resetRimane dopo un soft reset
Notification BrokerNotification BrokerNotification BrokerNotification Broker
© 2004 Microsoft Corporation. All rights reserved.© 2004 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.Content created by 3 Leaf SolutionsContent created by 3 Leaf Solutions