Chiudere la connessione GPRS in Windows Mobile e CE

Durante lo sviluppo di un’applicazione per Smart Device si può avere la necessità d’interagire programmaticamente con la connessione GPRS. Un collega ha trattato questo argomento nel suo blog personale, mostrando un esempio di applicazione Managed che interagisce con le ConnMgr APIs (un set di APIs a disposizione degli ISVs) al fine di conseguire questo obiettivo.

All’interno delle ConnMgr APIs esiste una funzione per rilasciare la connessione GPRS: ConnMgrReleaseConnection . Capita spesso che alcuni sviluppatori si chiedano come mai anche dopo l’invocazione di tale API,  la connessione GPRS non venga chiusa definitivamente, ovvero rimanga visibile nella taskbar una piccola icona (G,H,E in accordo con la rete disponibile).

Prima di mostrare come chiudere definitivamente la connessione GPRS, è opportuno fare chiarezza sulla funzione mostrata in precedenza: ConnMgrReleaseConnection. Quest’ultima ha il compito di informare il Connection Planner, il quale è parte del Connection Manager, che l’applicazione in esecuzione non ha più l’intenzione di interagire con la connessione GPRS.Il Connection Manager, ricevuta tale notifica, deciderà se chiudere o meno la connessione GPRS in relazione alle impostazioni del dispositivo, come è possibile leggere nella documentazione qui:

You should always remember that the value that your application passes to the ConnMgrReleaseConnection function's cache parameter is simply a request. The Connection Manager may choose to ignore that request

Finita tale considerazione è giunto il momento di analizzare la chiusura forzata della connessione GPRS, distinguendo le due piattaforme:

Windows CE

Essendo il Connection Manager un componente di Windows Mobile, su Windows CE generalmente gli ISVs utilizzano un set diverso di APIs per gestire da codice la connessione GRPS:RAS APIs. In documentazione esiste un ottimo link che spiega come aprire e chiudere una connessione GPRS.

Windows Mobile

Premettendo che un ISV di applicazioni Windows Mobile dovrebbe interfacciarsi solo con le funzioni del Connection Manager, volevo innanzitutto discutere del fatto che esistono sul web delle soluzioni non supportare che modificano le impostazioni scelte dall’OEM. Tali soluzioni non impatteranno solo la vostra applicazione, bensì tutte le applicazioni CM-Aware, cioè tutti quei software che fanno accesso alla rete passando dal Connection Manager. Chi potrà assicuravi che il comportamento di tali applicazioni rimarrà invariato?

Per tornare al mondo “supportato” vi illustrerò di seguito come conseguire il nostro obiettivo, tramite la richiesta al Connection Manager di una connessione di tipo Exclusive. In questa modalità, nel momento in cui il vostro applicativo richiederà il rilascio della connessione GPRS, il Connection Manager chiuderà definitivamente la connessione fisica.

Ecco un esempio di codice C#, al quale vanno aggiunte le dovute invocazioni di p-Invoke:

 public static bool Connect(string urlStr)
{
    ConnectionInfo ci = new ConnectionInfo();        
    uint status = 0;

    if (ConnMgrMapURL(urlStr, ref ci.guidDestNet, IntPtr.Zero) != S_OK)
        return false;

    ci.cbSize = (uint)Marshal.SizeOf(ci);
    ci.dwParams = CONNMGR_PARAM_GUIDDESTNET;
    ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
    ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
    ci.bExclusive = 1; // Setta una connessione di tipo esclusiva
    ci.bDisabled = 0;
    ci.hWnd = IntPtr.Zero;
    ci.uMsg = 0;
    ci.lParam = 0;

    if (ConnMgrEstablishConnectionSync(ref ci, ref phConnection, TIME, ref status) != S_OK & status != CONNMGR_STATUS_CONNECTED)
        return false;
    return true;
}

public static bool closeConnection()
{
    // passando 0 come secondo parametro richiedo la chiusura immediata
    if (ConnMgrReleaseConnection(phConnection, 0) == S_OK)
        return true;
    return false;
}

Il codice di cui sopra esegue il comportamento voluto a meno che non si verifichi una delle seguenti condizioni:

  • Non ci sia un’altra applicazione che abbia richiesto l’utilizzo della connessione GPRS. Se il Connection Manager gestisce una connessione GPRS per la vostra applicazione, ed un’altra applicazione fa uso della connessione GPRS contemporaneamente, è ovvio che la chiusura della connessione da parte della vostra applicazione non implicherà la chiusura della connessione GPRS nel dispositivo.
  • Non sia stata impostata l’opzione GPRS connection always on.

 

Carmelo Pulvirenti

Support Engineer

Windows Mobile & Embedded Developer Support