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
Scarica

SMS - Microsoft