Developer's Diary

4 octubre, 2010

Tips – Activar radio GPRS Windows Mobile

En Windows Mobile, en ocasiones nos podemos encontrar con el inconveniente de que si queremos usar nuestra conexión de internet móvil, para conexiones de socket, como puede ser una base de datos o una comunicación muy primitiva. El sistema operativo no activa la línea de internet y eso en nuestra aplicación implica que se produzca una excepción.

Esto no ocurre con otras conexiones a internet, como puede ser la consumición de un web service o el solicitar algo mediante una httprequest.

Para evitar esas excepciones podeis usar la siguiente clase o libreria para conexiones mediante GPRS.  Esta desarrollada en Vb.Net, en mis años mozos antes de empezar a programar en C#.

Código:

Imports System.Runtime.InteropServices
Imports System.Threading
Public Class GPRSConnection

Private Const S_OK As Integer = 0

Private Const CONNMGR_PARAM_GUIDDESTNET As UInteger = 1

Private Const CONNMGR_FLAG_PROXY_HTTP As UInteger = 1

Private Const CONNMGR_PRIORITY_USERINTERACTIVE As UInteger = 32768

Private Const INFINITE As UInteger = 4294967295

Private Const CONNMGR_STATUS_CONNECTED As UInteger = 16

Private Shared ht As Hashtable = New Hashtable

Sub New()
Dim mre As ManualResetEvent = New ManualResetEvent(False)
mre.Handle = ConnMgrApiReadyEvent
mre.WaitOne()
CloseHandle(mre.Handle)
End Sub

Private Overloads Function Setup(ByVal url As Uri) As Boolean
Return Setup(url.ToString)
End Function

Private Overloads Function Setup(ByVal urlStr As String) As Boolean
Dim ci As ConnectionInfo = New ConnectionInfo
Dim phConnection As IntPtr = IntPtr.Zero
Dim status As UInteger = 0
If (Not (ht(urlStr)) Is Nothing) Then
Return True
End If
If (ConnMgrMapURL(urlStr, ci.guidDestNet, IntPtr.Zero) <> S_OK) Then
Return False
End If
ci.cbSize = CType(Marshal.SizeOf(ci), UInteger)
ci.dwParams = CONNMGR_PARAM_GUIDDESTNET
ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP
ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE
ci.bExclusive = 0
ci.bDisabled = 0
ci.hWnd = IntPtr.Zero
ci.uMsg = 0
ci.lParam = 0
Dim dummy1 As Integer = ConnMgrEstablishConnectionSync(ci, phConnection, INFINITE, status)

Dim dummy2 As Integer = status
If ((ConnMgrEstablishConnectionSync(ci, phConnection, INFINITE, status) <> S_OK) And (status <> CONNMGR_STATUS_CONNECTED)) Then
Return False
End If
ht(urlStr) = phConnection
Return True
End Function

Private Overloads Shared Function Release(ByVal url As Uri) As Boolean
Return Release(url.ToString)
End Function

Private Overloads Shared Function Release(ByVal urlStr As String) As Boolean
Return Release(urlStr, True)
End Function

Private Overloads Shared Function Release(ByVal urlStr As String, ByVal removeNode As Boolean) As Boolean
Dim res As Boolean = True
Dim ph As IntPtr = IntPtr.Zero
If (ht(urlStr) Is Nothing) Then
Return True
End If
ph = CType(ht(urlStr), IntPtr)
If (ConnMgrReleaseConnection(ph, 1) <> S_OK) Then
res = False
End If
CloseHandle(ph)
If removeNode Then
ht.Remove(urlStr)
End If
Return res
End Function

Private Shared Sub ReleaseAll()
For Each de As DictionaryEntry In ht
Release(CType(de.Key, String), False)
Next
ht.Clear()
End Sub

Private Declare Function ConnMgrMapURL Lib “cellcore.dll” (ByVal pwszURL As String, ByRef pguid As Guid, ByVal pdwIndex As IntPtr) As Integer

Private Declare Function ConnMgrEstablishConnectionSync Lib “cellcore.dll” (ByRef ci As ConnectionInfo, ByRef phConnection As IntPtr, ByVal dwTimeout As UInteger, ByRef pdwStatus As UInteger) As Integer

Private Declare Function ConnMgrApiReadyEvent Lib “cellcore.dll” () As IntPtr

Private Declare Function ConnMgrReleaseConnection Lib “cellcore.dll” (ByVal hConnection As IntPtr, ByVal bCache As Integer) As Integer

Private Declare Function CloseHandle Lib “coredll.dll” (ByVal hObject As IntPtr) As Integer

Private Structure ConnectionInfo

Public cbSize As UInteger

Public dwParams As UInteger

Public dwFlags As UInteger

Public dwPriority As UInteger

Public bExclusive As Integer

Public bDisabled As Integer

Public guidDestNet As Guid

Public hWnd As IntPtr

Public uMsg As UInteger

Public lParam As UInteger

Public ulMaxCost As UInteger

Public ulMinRcvBw As UInteger

Public ulMaxConnLatency As UInteger
End Structure

Public Function AbrirGPRS() As Boolean
Return Setup(“http://www.google.es/&#8221;)

End Function
Public Function CerrarGPRS() As Boolean
Try
ReleaseAll()
Return True
Catch ex As Exception
Return False
End Try
End Function
End Class

Perdón por las tabulaciones del código, estas no se han respetado para nada.

Para usar la clase solo es necesario instanciarla y llamar a la función AbrirGPRS, esta realiza una petición a http://www.google.es/, podemos cambiar esta petición por una ip u otra página web. En caso de que nos devuelva true, indicará que tenemos servicio GRPS, en caso de que nos devuelva false. No podremos hacer uso de ella. Indicar, que no solo se encarga de comprobar si tenemos la posibilidad de conectarnos mediante internet móvil en ese momento, si no que también se encarga de activar por nosotros la red, para desactivarla solo nos haría falta llamar a la segunda función pública, CerrarGPRS que nos permitirá liberar nuestra conexión y cerrarla como si lo hubiesemos hecho desde el móvil.

Hasta aquí nuestro tip de Windows Mobile

Saludos

Anuncios

5 comentarios »

  1. Q’ ondas… buenisimo tu codigo man, andaba buscando la forma de como poder controlar la conexion GPRS desde mobil, pero, nunk encontraba una forma segura, ya probe tu codigo y creo q es perfecto, aunq al hacer la desconexion, no me funciona, siempre me aparece la conexion abierta…. no se si me podrias ayudar …”mas todabia”… con la desconexion del mobil…Gracias de ante mano XD

    Comentario por Mike — 27 octubre, 2010 @ 10:18 PM

    • Muchas gracias. ¿No te cierra la conexión? ¿Te aparece algún error o algo?
      Dime en que versión de Windows Mobile lo estás haciendo.

      Comentario por 3nk1 — 28 octubre, 2010 @ 6:14 AM

  2. tendras este código en c#?
    He estado batallando varios dias sin poder encender el gprs en wm…
    Gracias x compartir este post 🙂

    Comentario por Christian — 26 marzo, 2011 @ 9:32 PM

    • No hay problema, pincha en este link y verás el código. Te lo he convertido con una herramienta que pasa de VB a C# y viceversa.

      Mira pincha en este link. http://codr.cc/8DCD73D98E

      Como te he dicho, lo he convertido con una herramienta que convierte de Vb a C#. Puede que haya alguna incongruencia.

      Si te surge alguna otra duda, realiza un comentario.

      Comentario por 3nk1 — 27 marzo, 2011 @ 1:26 AM

  3. Eres un monstruo no sabes la ayuda que me has dado
    Un gran saludo desde Panamá

    Comentario por Joehit — 17 octubre, 2015 @ 5:29 PM


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: