Rastreador GPS-Aplicacion Cliente en Vb.Net

Bien, tal y como habia mencionado en la anterior entrada, vamos a elaborar una aplicacion de escritorio que se encargará de ir haciendole el seguimiento al dispositivo movil a traves de las coordenadas que este envia al servidor y las vamos a ir ubicando en un mapa. Nuestra Aplicacion ademas permitira buscar direcciones diferentes a las que envia el GPS y navegar por cualquier lugar en el mapa. Dicho programa a elaborar tendra el siguiente aspecto:

Bien, Para comenzar a desarrollar primero debemos descargar el framework o conjunto de librerias que nos ofrece GMaps, el cual sera nuestra herramienta que nos conectara con los proveedores de mapas disponibles para realizar la ubicacion.

Dicho paquete de librerias junto con una aplicacion DEMO la podemos descargar desde la siguiente direccion:Descargar GMaps.Net, al abrir la pagina descargamos el archivo llamado: GMap.NET.WindowsForms.zip o si prefieren el link directo de la descarga presiona:Descarga Directa de GMap.Net.

Una Vez descargado el archivo, lo descomprimimos y copiamos las siguientes DLL a nuestro proyecto en vb.net:

Ahora las pegamos en la carpeta debug del proyecto en vb.net:

Ahora, podemos proceder a agregar el control al conjunto de herramientas de vb y posteriormente la referencia; para agregar el control presionamos clic derecho sobre cualquier elemento del cuador de herramientas de la parte derecha de la ventana y en el menu contextual que aparece seleccionamos la opcion elegir elementos tal y como se ve en la imagen:

Luego, en la nueva ventana que aparece estando en la pestaña Componentes de .Net Framework presionamos el boton examinar y en la nueva ventana que se crea, accedemos a la carpeta debug del proyecto y seleccionamos la referencia: GMap.NET.WindowsForms.dll tal y como se observa en la interfaz:

despues de seleccionarla presionamos el boton abrir y posteriormente el boton aceptar, listo con esto ya esta agregado el control.

A continuacion, nos dirigimos al cuadro de herramientas y buscamos el control que acabamos de agregar:

y procedemos a a arrastrar el elemento GmapControl al formulario:

Bien, despues de esto vamos a agregar la otra referencia que nos falta, para ello nos dirigimos al explorador de soluciones y presionamos clic derecho sobre la opcion Agregar referencia

y en la nueva ventana que aparece nos dirigimos a la pestaña examinar, luego accedemos a la carpeta debug del proyecto (a traves de los directorios) y seleccionamos la referencia llamada: GMap.NET.Core.dll, por ultimo presionamos el boton aceptar

Bien, ya tenemos todo listo, ahora si podemos comenzar a desarrollar…. Pero antes elaboremos el siguiente diseño al formulario agregando otros controles (como se ve en la imagen):

Entonces agregaremos:

* 5 Botones

* 6 TextBox

* 2 Combobox

* 1 Picturebox

* 1 Panel

* Varios Groupbox

* 1 TrackBar: para controlar el zoom

* 1 GMapControl1 para visualizar el mapa

* 3 timer.

Listo, ahora comencemos a programar; agreguemos los siguientes imports al formulario:


Imports GMap.NET.WindowsForms

Imports GMap.NET

Imports GMap.NET.MapProviders

Imports GMap.NET.WindowsForms.Markers

Imports System.Threading

Ahora vamos a definir las siguientes variables como globales


Dim modo As String 'modo de conexion

Dim latitudm, longitudm As String

Dim pres_boton_inicio, pres_boton_coordenadas, pres_boton_buscar, pres_boton_ws As Boolean

Dim indicador_termino, contador, contador_rws As Integer

Dim tipo_mapa As GMapProvider

' Creamos una variable del tipo Thread

Private proceso_ubi As Thread

el evento load del formulario debera tener el siguiente codigo:


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'verificar_conexion_internet()

indicador_termino = 0

contador = 0

contador_rws = 0

Me.Timer_refresco.Enabled = False

Me.Timer_refresco_ws_contador.Enabled = False

Me.Timer1.Enabled = True

Me.TextBox_zoom.Text = 10

Me.Panel_mensaje.Visible = False

CheckForIllegalCrossThreadCalls = False 'desactiva error por subproceso

Me.Combo_modo_conexion.Text = "ServerOnly"

Me.Combo_servidor_mapa.Text = "Google Hibrid Map"

modo = AccessMode.ServerOnly

tipo_mapa = GMapProviders.GoogleHybridMap

Me.Button_desactivaws.Enabled = False

pres_boton_inicio = False

pres_boton_coordenadas = False

pres_boton_buscar = False

pres_boton_ws = False

End Sub

Luego al combobox Modo de Conexion le agregamos los siguientes items como se ve en la imagen:

y creamos un procedimiento llamado establecer_modo_conexion() asi:


Sub establecer_modo_conexion()

If (Me.Combo_modo_conexion.Text = "ServerOnly") Then

modo = AccessMode.ServerOnly

End If

If (Me.Combo_modo_conexion.Text = "CacheOnly") Then

modo = AccessMode.CacheOnly

End If

If (Me.Combo_modo_conexion.Text = "ServerAndCache") Then

modo = AccessMode.ServerAndCache

End If

End Sub

Luego al combobox servidor de mapas le agregamos los siguientes items tal y como se ve en la interfaz:

y creamos un procedimiento para determinar la seleccion de cada uno de los servidores asi:


Sub establecer_servidor_mapa()

If (Me.Combo_servidor_mapa.Text = "Google Map") Then

tipo_mapa = GMapProviders.GoogleMap

End If

If (Me.Combo_servidor_mapa.Text = "Google Satellite") Then

tipo_mapa = GMapProviders.GoogleSatelliteMap

End If

If (Me.Combo_servidor_mapa.Text = "Google Terrain") Then

tipo_mapa = GMapProviders.GoogleTerrainMap

End If

If (Me.Combo_servidor_mapa.Text = "Google Hibrid Map") Then

tipo_mapa = GMapProviders.GoogleHybridMap

End If

If (Me.Combo_servidor_mapa.Text = "Google China Map") Then

tipo_mapa = GMapProviders.GoogleChinaMap

End If

If (Me.Combo_servidor_mapa.Text = "Ovi Map") Then

tipo_mapa = GMapProviders.OviMap

End If

If (Me.Combo_servidor_mapa.Text = "Ovi Satellite") Then

tipo_mapa = GMapProviders.OviSatelliteMap

End If

If (Me.Combo_servidor_mapa.Text = "Ovi Terrain") Then

tipo_mapa = GMapProviders.OviTerrainMap

End If

If (Me.Combo_servidor_mapa.Text = "Ovi Hibrid Map") Then

tipo_mapa = GMapProviders.OviHybridMap

End If

If (Me.Combo_servidor_mapa.Text = "Open Street Map") Then

tipo_mapa = GMapProviders.OpenStreetMap

End If

If (Me.Combo_servidor_mapa.Text = "Bing Map") Then

tipo_mapa = GMapProviders.BingMap

End If

If (Me.Combo_servidor_mapa.Text = "Bing Satellite") Then

tipo_mapa = GMapProviders.BingSatelliteMap

End If

If (Me.Combo_servidor_mapa.Text = "Bing Hibrid Map") Then

tipo_mapa = GMapProviders.BingHybridMap

End If

If (Me.Combo_servidor_mapa.Text = "Yahoo Map") Then

tipo_mapa = GMapProviders.YahooMap

End If

If (Me.Combo_servidor_mapa.Text = "Yahoo Satellite") Then

tipo_mapa = GMapProviders.YahooSatelliteMap

End If

If (Me.Combo_servidor_mapa.Text = "Yahoo Hibrid Map") Then

tipo_mapa = GMapProviders.YahooHybridMap

End If

End Sub

Luego elaboramos una funcion o procedimiento donde invocamos las 2 anteriores subrutinas, es decir, establecer_modo_conexion() y establecer_servidor_mapa(); dicha funcion la llamaremos configuracion y nos quedara asi:


Sub configuracion()

GMapControl1.Manager.Mode = modo

GMapControl1.MapProvider = tipo_mapa

GMapControl1.MinZoom = 1

GMapControl1.MaxZoom = 19

GMapControl1.Zoom = Me.TrackBar_zoom.Value

GMapControl1.Dock = DockStyle.Fill

GMapControl1.MarkersEnabled = True

GMapProvider.Language = LanguageType.Spanish

End Sub

Cabe aclararse que al trackbar se le coloco un valor inicial de 10 que es el valor de zoom asignado al control gmap

Ahora crearemos otro procedimiento desde el cual manipularemos el zoom con la rueda del mouse y el desplazamiento del mapa al ir haciendo clic y moviendo el mouse a traves del control gmap, entre otras funciones, llamaremos este procedimiento avanzadas():


Sub avanzadas()

Cursor.Current = Cursors.WaitCursor

Dim current = New PointLatLng(GMapControl1.Position.Lat, GMapControl1.Position.Lng)

Dim currentMark = New GMapMarkerGoogleGreen(current)

Dim overlay = New GMapOverlay(GMapControl1, "current")

overlay.Markers.Add(currentMark)

GMapControl1.Overlays.Add(overlay)

Cursor.Current = Cursors.[Default]

'--------------

ResumeLayout(True)

Dim objects = New GMapOverlay(Me.GMapControl1, "objects")

Me.GMapControl1.Overlays.Add(objects)

Dim rect As New GMapMarkerGoogleRed(GMapControl1.Position)

rect.Size = New System.Drawing.Size(0, 0)

rect.ToolTipText = "Tu Ubicacion"

rect.ToolTipMode = MarkerTooltipMode.Always

overlay.Markers.Add(rect)

GMapControl1.DragButton = MouseButtons.Left

End Sub

A continuacion, vamos a crear otros procedimientos o funciones a traves de los cuales realizaremos la ubicacion de algun lugar o coordenada en el mapa, para ubicar el punto inicial utilizaremos una coordenada de latitud y longitud fija y elaboraremos la funcion de la siguiente manera:


Sub ubicar1()

configuracion()

latitudm = 7.11443487566174

longitudm = -73.1169319152832

'MsgBox(latitudm & " " & longitudm)

posicionar()

avanzadas()

contador = 0

indicador_termino = 1

End Sub

Luego vamos con la funcion de ubicar cuando realicemos busqueda por coordenadas, dicho procedimiento lo llamaremos ubicar2()


Sub ubicar2()

configuracion()

latitudm = Me.Text_latitud.Text.Replace(".", ",")

longitudm = Me.Text_longitud.Text.Replace(".", ",")

'MsgBox(latitudm & " " & longitudm)

posicionar()

avanzadas()

contador = 0

indicador_termino = 1

End Sub

Ahora vamos con ubicar3(), encargada de ubicar cuando realicemos una busqueda por lugar:


Sub ubicar3()

configuracion()

posicionar()

avanzadas()

contador = 0

indicador_termino = 1

End Sub

Por ultimo, crearemos un procedimiento llamado posicionar() que es el que basicamente establecera la posicion en el mapa y consta de una sola linea de codigo, asi:


Sub posicionar()

GMapControl1.Position = New PointLatLng(latitudm, longitudm)

End Sub

Por otra parte, en el evento MouseDoubleClick del componente GmapControl agregamos el siguiente codigo para que al momento de hacer doble clic sobre cualquier lugar se coloque una marca y se observen las coordenadas correspondientes de latitud y longitud:

Private Sub GMapControl1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles GMapControl1.MouseDoubleClick

If e.Button = MouseButtons.Left Then

Cursor.Current = Cursors.WaitCursor

Dim latLng As PointLatLng = GMapControl1.FromLocalToLatLng(e.X, e.Y)

Dim current = New PointLatLng(Math.Abs(latLng.Lat), latLng.Lng)

Dim currentMark = New GMapMarkerGoogleGreen(current)

Dim overlay = New GMapOverlay(GMapControl1, "current")

GMapControl1.MarkersEnabled = False

overlay.Markers.Clear()

GMapControl1.Overlays.Clear()

overlay.Markers.Add(currentMark)

GMapControl1.Overlays.Add(overlay)

GMapControl1.MarkersEnabled = True

Cursor.Current = Cursors.Hand

Me.Text_longitud.Text = latLng.Lng.ToString()

Me.Text_latitud.Text = latLng.Lat.ToString()

End If

End Sub

siguiendo con la programacion de la aplicacion, vamos a crear otras funciones que nos permitan llamar a cada una de las anteriores (ubicar1(), ubicar2(), ubicar3() ) y desplegarlas a traves de un hilo o hebra de proceso para evitar algun bloqueo debido a la carga de procesos que se hacen y ademas incluir otros comandos al realizar cada una de las ubicaciones; por tanto la siguiente funcion o subrutina la llamaremos busqueda_boton_inicio() y se desencadenara al presionar el boton inicio, el codigo de dicho procedimiento es:


Sub busqueda_boton_inicio()

'--------

establecer_modo_conexion()

establecer_servidor_mapa()

'--------

Me.Label_mensaje.Text = "Espere por favor"

Me.Panel_mensaje.Visible = True

Me.PictureBox_carga.Visible = True

Me.PictureBox_carga.Image = Image.FromFile("carga.gif")

proceso_ubi = New Thread(AddressOf ubicar1)

'ponemos al hilo en marcha

proceso_ubi.Start()

End Sub

Ahora, la busqueda por coordenadas de latitud y longitud sera:


Sub busqueda_boton_coordenadas()

'--------

establecer_modo_conexion()

establecer_servidor_mapa()

'--------

Me.Label_mensaje.Text = "Espere por favor"

Me.Panel_mensaje.Visible = True

Me.PictureBox_carga.Visible = True

Me.PictureBox_carga.Image = Image.FromFile("carga.gif")

proceso_ubi = New Thread(AddressOf ubicar2)

'ponemos al hilo en marcha

proceso_ubi.Start()

End Sub

y por ultimo la busqueda por nombre de un lugar o sitio conocido nos quedara asi:


Sub busqueda_boton_lugar()

Me.GMapControl1.ReloadMap()

GMapProvider.Language = LanguageType.Spanish

Dim search As String = String.Format("{0}", Me.Text_busqueda.Text)

Dim code As GeoCoderStatusCode = GMapControl1.SetCurrentPositionByKeywords(search)

If code <> GeoCoderStatusCode.G_GEO_SUCCESS Then

MessageBox.Show("Direccion no encontrada!" & Convert.ToString(Me.Text_busqueda.Text) & " " & code.ToString(), "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

Return

End If

Dim objects = New GMapOverlay(GMapControl1, "objects")

objects.Markers.Clear()

Me.GMapControl1.Overlays.Clear()

Agregar_ubicacion(Me.Text_busqueda.Text)

End Sub

Donde la funcion Agregar_ubicacion tendra la siguiente estructura:


Private Sub Agregar_ubicacion(ByVal lugar As String)

establecer_modo_conexion()

establecer_servidor_mapa()

Dim unknow As GeoCoderStatusCode = GeoCoderStatusCode.Unknow

Dim latLngFromGeocoder As System.Nullable(Of PointLatLng) = GMap.NET.MapProviders.GMapProviders.GoogleHybridMap.GetPoint(lugar, unknow)

If latLngFromGeocoder.HasValue AndAlso (unknow = GeoCoderStatusCode.G_GEO_SUCCESS) Then

'.......posiciono.............

latitudm = latLngFromGeocoder.Value.Lat

longitudm = latLngFromGeocoder.Value.Lng

Me.Label_mensaje.Text = "Espere por favor"

Me.Panel_mensaje.Visible = True

Me.PictureBox_carga.Visible = True

Me.PictureBox_carga.Image = Image.FromFile("carga.gif")

proceso_ubi = New Thread(AddressOf ubicar3)

'ponemos al hilo en marcha

proceso_ubi.Start()

Me.Text_longitud.Text = latLngFromGeocoder.Value.Lng.ToString()

Me.Text_latitud.Text = latLngFromGeocoder.Value.Lat.ToString()

pres_boton_inicio = False

pres_boton_coordenadas = False

pres_boton_buscar = True

pres_boton_ws = False

End If

End Sub

Luego al Timer1 le agregamos el siguiente codigo (para hacer que se desaparezca un archivo gif de carga) y que se muestre un mensaje:


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

If (indicador_termino = 1) Then

Me.Label_mensaje.Text = "Carga Finalizada"

proceso_ubi.Abort()

Me.PictureBox_carga.Visible = False

If (contador = 2) Then

indicador_termino = 0

contador = 0

Me.Panel_mensaje.Visible = False

End If

contador += 1

End If

End Sub

“Dicho timer tendra una frecuencia o intervalo de 1000 milisegundos o 1 segundo”

Ahora si, teniendo las funciones y procedimientos de ubicacion y busqueda listos, podemos invocarlos dentro de cada boton asi:


Private Sub Button_inicio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_inicio.Click

busqueda_boton_inicio()

pres_boton_inicio = True

pres_boton_coordenadas = False

pres_boton_buscar = False

pres_boton_ws = False

End Sub

aqui llamamos al procedimiento de posicionar a un punto fijo ya preestablecido en la aplicacion, ademas colocamos una variable logica llamada pres_boton_inicio en true y colocamos las demas en false que seran utilizadas como indicadores mutuamente excluyentes, ahora vamos con el boton localizar coordenadas:


Private Sub Button_coordenadas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_coordenadas.Click

If (Me.Text_latitud.Text.Trim = "" Or Me.Text_longitud.Text.Trim = "") Then

MsgBox("Por favor, Ingrese Los valores Correspondientes a la latitud y longitud que desea buscar!", MsgBoxStyle.Exclamation, "Notificacion")

Else

'puede realizar la ubicacion

busqueda_boton_coordenadas()

pres_boton_inicio = False

pres_boton_coordenadas = True

pres_boton_buscar = False

pres_boton_ws = False

End If

End Sub

Por ultimo, el boton buscar lugar quedara asi:


Private Sub Button_buscar_lugar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_buscar_lugar.Click

busqueda_boton_lugar()

End Sub

Ejecutando el programa y poniendolo a prueba con lo que ya se ha programado veremos los siguientes resultados:

al escribir el nombre de un lugar y presionar el boton correspondiente (buscar lugar), veremos que el programa automaticamente nos muestra un elemento gif de carga en la parte derecha de la ventana y mientras que se carga el mapa podemos ver la ubicacion en coordenadas de latitud y longitud que devuelve el programa:

Luego, una vez cargado el mapa observaremos un resultado similar al siguiente:

Si hacemos clic sobre el combo servidor de mapas y escogemos otro como puede ser “Ovi Mpas” y volvemos a hacer la busqueda, notaresmos que nuestro mapa cambia al que ofrece el nuevo servidor:

y podemos probar con cualquier servidor que deseemos y veremos los resultados al instante, por ejemplo, podemos ver el mapa que se genera al escoger la opcion Open Street Maps:

Bueno, hasta aqui nuestro programa puede localizar tanto coordenadas o lugares en el mapa, ahora hace falta programar la opcion de consulta de datos a traves del webservice, pero antes de llegar alla debemos completar el servicio web y crear una funcion llamada consultarDatos() para traer los datos que estan registrados en la base de datos, asi que abrimos netbeans y codificamos lo siguiente en el servicio web WebServiceGPS:


//---------------comienzo procedimiento para consultar datos----------------

@WebMethod

public boolean consultarDatos(){

String conexionBD="jdbc:mysql://127.0.0.1/coordenadas_gps";

Connection conexion=null;

boolean funciono=false;

String con;

String idregistro;

idregistro="";

ResultSet rs;

try{

// JOptionPane.showMessageDialog(null,"entro");

Class.forName("com.mysql.jdbc.Driver");//el driver de mysql

conexion=DriverManager.getConnection(conexionBD, "root","12345");//conexion a la base de datos

Statement s = conexion.createStatement();

// JOptionPane.showMessageDialog(null,no+" "+ap);

con="SELECT max(id) as id from datos" ;

rs = s.executeQuery (con); {

while (rs.next()) {

idregistro=rs.getString("id");

//JOptionPane.showMessageDialog(null, idregistro);

}

}

//ahora si traigo los datos de ubicacion

con="SELECT * from datos where id='"+idregistro+"'" ;

rs = s.executeQuery (con); {

while (rs.next()) {

latitud=rs.getString("latitud");

longitud=rs.getString("longitud");

//JOptionPane.showMessageDialog(null, "si");

}

}

funciono=true;

MostrarLatitud();

MostrarLongitud();

}

catch(Exception e){

System.out.println("No se ha completado la petición...");

}

return funciono;

}

Tambien creamos las funciones que permiten mostrar los datos de latitud y longitud asi:


@WebMethod

public String MostrarLatitud(){

String lati;

lati="";

lati=latitud;

return lati;

}

@WebMethod

public String MostrarLongitud(){

String longi;

longi="";

longi=longitud;

return longi;

}

El codigo completo se puede observar en las siguientes imagenes:


Bien, ahora Ponemos en marcha el webservice:

Luego procedemos a agregar la referencia web en vb.net de dicho servicio; para ello vamos a la opcion Proyecto de la barra de menu y seleccionamos la opcion agregar referencia de servicio tal y como se ve en la imagen:

Despues en la ventana que aparece presionamos el boton avanzadas:

Posteriormente en la nueva ventana que aparece presionamos el boton llamado Agregar referencia web tal y como se ve en la siguiente imagen:

Luego, en la siguiente ventana copiamos la wsdl o ruta del webservice, presionamos el boton ir para que se listen los procedimientos de los que dispone el servicio web, despues le colocamos un nombre a la referencia, en este caso la llame: datos_gps y presionamos el boton agregar referencia:

Listo, con esto ya hemos agregado la referencia web al proyecto de vb.net; ahora debemos agregar el siguiente import para hacer el llamado al servicio web:


Imports Rastreador_GPS_Gmap.datos_gps

Ahora debemos crear un procedimiento encargado de posicionar los datos (latitud y longitud) que son traidos por el servicio web, dicho procedimiento lo llamaremos busqueda_activar_webservice():


Sub busqueda_activar_webservice()

establecer_modo_conexion()

establecer_servidor_mapa()

'--------

Me.Label_mensaje.Text = "Espere por favor"

Me.Panel_mensaje.Visible = True

Me.PictureBox_carga.Visible = True

Me.PictureBox_carga.Image = Image.FromFile("carga.gif")

proceso_ubi = New Thread(AddressOf ubicar2)

'ponemos al hilo en marcha

proceso_ubi.Start()

'--------

End Sub

Por consiguiente el codigo del boton Activar para recibir los datos del webservice quedara asi:


Private Sub Button_activaws_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_activaws.Click

contador_rws = 0

Try

Me.Timer_refresco_ws_contador.Enabled = False

Me.Timer_refresco.Enabled = True

Dim jws As New datos_gps.servicio_gpsService

Dim resultado As Boolean

resultado = jws.consultarDatos()

If (resultado = True) Then

'MsgBox("entro")

Me.Text_latitud.Text = jws.MostrarLatitud()

Me.Text_longitud.Text = jws.MostrarLongitud()

'--------

busqueda_activar_webservice()

'--------

pres_boton_inicio = False

pres_boton_coordenadas = False

pres_boton_buscar = False

pres_boton_ws = True

Else

' MsgBox("no")

End If

Me.Button_activaws.Enabled = False

Me.Button_desactivaws.Enabled = True

Catch ex As Exception

Me.Timer_refresco_ws_contador.Enabled = False

Me.Timer_refresco.Enabled = False

MsgBox("Servicio web No Disponible, Verifique Conexion a Internet..!", MsgBoxStyle.Exclamation, "Notificacion")

End Try

End Sub

Ademas hay que programar en el timer refresco lo siguiente para determinar si se debe actualizar la lectura de datos de la base de datos, el intervalo que maneja dicho timer es de 1000 milisegundos y el codigo que lleva es el siguiente:


Private Sub Timer_refresco_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_refresco.Tick

Me.Text_indica_termino.Text = indicador_termino

If (indicador_termino = 1) Then

'......comienzo a contar hasta 60 para volver a refrescar la posicion, activo el timer refresco ws contador

contador_rws = 0

Me.Timer_refresco_ws_contador.Enabled = True

Me.Timer_refresco.Enabled = False

End If

End Sub

Por ultimo, en el timer refresco_ws_contador vamos a contar hasta 60 que es la frecuencia con la que se actualizara el mapa, es decir, que cada minuto se va a leer una nueva posicion del celular o gps:


Private Sub Timer_refresco_ws_contador_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer_refresco_ws_contador.Tick

Me.Text_contador_ws.Text = contador_rws

If (contador_rws = 60) Then

'realizo la ubicacion

Try

Dim jws As New datos_gps.servicio_gpsService

Dim resultado As Boolean

resultado = jws.consultarDatos()

If (resultado = True) Then

'MsgBox("entro")

Me.Text_latitud.Text = jws.MostrarLatitud()

Me.Text_longitud.Text = jws.MostrarLongitud()

'--------

busqueda_activar_webservice()

'--------

pres_boton_inicio = False

pres_boton_coordenadas = False

pres_boton_buscar = False

pres_boton_ws = True

Else

' MsgBox("no")

End If

Me.Button_activaws.Enabled = False

Me.Button_desactivaws.Enabled = True

Catch ex As Exception

desactivar_datos_webservice()

MsgBox("Servicio web No Disponible, Verifique Conexion a Internet..!", MsgBoxStyle.Exclamation, "Notificacion")

End Try

contador_rws = 0

Me.Timer_refresco.Enabled = True

Me.Timer_refresco_ws_contador.Enabled = False

End If

contador_rws += 1

End Sub

Luego creamos una funcion o procedimiento para desactivar la lectura de los datos por el webservice, lo llamaremos desactivar_datos_webservice() y tendra lo siguiente:


Sub desactivar_datos_webservice()

Me.Timer_refresco.Enabled = False

Me.Timer_refresco_ws_contador.Enabled = False

Me.Text_indica_termino.Text = 0

Me.Text_contador_ws.Text = 0

Me.Button_activaws.Enabled = True

Me.Button_desactivaws.Enabled = False

End Sub

Ahora lo llamamos en el evento clic del boton desactivar:


Private Sub Button_desactivaws_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_desactivaws.Click

desactivar_datos_webservice()

End Sub

Ademas tenemos que programar en el evento SelectedIndexChanged del combobox servidor de mapas para que el mapa cambie automaticamente al seleccionar algun item de los que aparecen en la lista, el codigo que debe ir alli es el siguiente:


Private Sub Combo_servidor_mapa_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Combo_servidor_mapa.SelectedIndexChanged

If (pres_boton_inicio = True) Then

busqueda_boton_inicio()

End If

'..............

If (pres_boton_coordenadas = True) Then

busqueda_boton_coordenadas()

End If

'---------------

If (pres_boton_buscar = True) Then

busqueda_boton_lugar()

End If

',,,,,,,,,,,,,,,,,,

If (pres_boton_ws = True) Then

busqueda_activar_webservice()

End If

End Sub

Para terminar solo hay que programar en el evento scroll de nuestro Trackbar_zoom de tal manera que se pueda ir variando el zoom al ir moviendo la barra de desplazamiento:


Private Sub TrackBar_zoom_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_zoom.Scroll

Me.TextBox_zoom.Text = Me.TrackBar_zoom.Value

If (pres_boton_inicio = True) Then

' modifico el zoom cuando busco por el boton inicio

busqueda_boton_inicio()

End If

'........................

If (pres_boton_coordenadas = True) Then

' modifico el zoom cuando busco por el boton coordenadas

busqueda_boton_coordenadas()

End If

'.......................

If (pres_boton_buscar = True) Then

' modifico el zoom cuando busco por el boton lugar

busqueda_boton_coordenadas()

End If

'......................

If (pres_boton_ws = True) Then

' modifico el zoom cuando busco por el boton webservice

busqueda_activar_webservice()

End If

End Sub

Bien, con todo esto ya hemos terminado de programar nuestra aplicacion, ahora podemos ejecutarla y ver los resultados:

Aqui presionamos el boton activar, nos podemos dar cuenta que ya comenzo la lectura de los datos de la base de datos a traves del webservice, luego veremos el mapa cargado y en la parte inferior derecha podemos ver los contadores, el primero indica que el mapa esta cargado (cuando esta en 1) y el contador de abajo indica el segundo por el cual va transcurriendo dicho tiempo hasta llegar a 60 para que se actualice o refresque una nueva posicion:

Como se puede ver entre los registros de la base de datos, el ultimo registro que es el que esta leyendo cada 60 segundos el webservice corresponde a la ultima ubicacion o posicion segun el gps:

Bien, esto es todo acerca de nuestro rastreador, se pueden poner a prueba todas las opciones de este programa y observar los resultados pertinentes; espero y este tutorial pueda ser de utilidad a quien lo pueda necesitar.

*Para descargar la aplicacion puedes presionar el siguiente link:Descargar Aplicacion de Vb.net

*Para descargar el webservice en netbeans 6.9.1 presiona el siguiente enlace: Descargar WebService

*para descargar la base de datos puedes hacer clic sobre el siguiente link:Descargar Base de datos

Anuncios

18 respuestas a “Rastreador GPS-Aplicacion Cliente en Vb.Net

  1. excelente….!!! pero me pregunto , como seria una manera(como leo y que harware utilizo para leer los datos de latitud ,longitud) de ir almacenando los datos ? si me pudieras dar un consejo.. GRACIAS……!!!!!

  2. excelente….!!! pero me pregunto , como seria una manera(como leo y que hardware utilizo para leer los datos de latitud ,longitud) de ir almacenando los datos ? si me pudieras dar un consejo.. GRACIAS……!!!!! 🙂

  3. Parece un buen trabajo pero tengo un problema a ver si me ayudas …hasta ahora no he manejado el WEB Service… De acuerdo con tu Publicacion ya instale el Netbeans y el JDK pero ahora ¿ como levanto el Web Service con los archivos que baje para probar ????… a ver si me ayudas .

    Saludos

  4. Buenas, estoy probando esto y la verdad que funciona muy bien todo, pero, te cuento que estoy utilizando un modulo GSM/GPRS, el SIM908 y cuando quiero establecer la conexion con el servidor el modulo me devuelve el siguiente error.
    HTTP/1.1 400 Petición incorrecta
    Server: Apache-Coyote/1.1
    Transfer-Encoding: chunked
    Date: Wed, 04 Sep 2013 14:19:16 GMT
    Connection: close

    alguna idea de que puede ser???

    Desde ya muchas gracias por el gran aporte.
    Saludos

    • Hola compañero, recuerda que la comunicación se esta realizando a través de un webservice, para que puedas hacer una conexión exitosa al servidor necesitas poner en marcha el servicio web con el servidor apache tomcat. Verifica bien los parámetros de conexión al webservice.

      • Gracias por la respuesta, efectivamente el webservice esta corriendo, lo hago antes de tratar de conectarme con el modulo, tal vez lo hago mal pero segun la explicacion de mas arriba es… Test Webservice y de alli se tiene que abrir la pagina y dejarla corriendo… eso ocurre perfectamente.
        No se que pueda estar pasando… si pruebo conectarme al servidor monitoreando con otro programa la conexion tcp ip lo hace correctamente… pero cuando inicio el webservice y quiero conectarme me salta ese error que cito mas arriba. la direccion ip es dinamica pero antes de realizar mi conexion verifico de poner en mi modulo la que me asigna en ese momento. no se si tendra que ver con el webservice.

        Saludos

  5. Logre conectarme, pero el problema es que ahora no puedo pasarle los parametros de latitud y longitud… te consulto desde tu experiencia, si yo tendria que mandar al webservice los datos con el comando GET… como lo tendria que hacer? vamos a suponer que en vez de un celular ocupo otra computadora remota para enviarle estos datos… como lo podria hacer?

    • Hola compañero, me alegro de que te hayas podido conectar al webservice; acerca del problema que que tu ves en cuanto a pasarle los parámetros de latitud y longitud, los puedes resolver con un PC tal y como lo planteas en lugar de tener un celular, lo que necesitas es una aplicación que este recibiendo los parametros del gps por el puerto serial y los vas guardando cada cierto tiempo en la base de datos remota haciendo uso de un webservice. A manera de ejemplo, te recomiendo que te guies del siguiente ejemplo: Consumir Web Service con VB.Net principalmente te fijas de la opcion guardar que es muy semejante a la que implemento en la aplicacion movil para ir guardando los datos. Eso es todo, espero y puedas resolver tus tudas.

    • Hola carlos, estoy en tu misma situacion, estudiando los comandos get para tratar de establecer la conexion con el sim 908, queria preguntarte: ¿tuviste que subir el web service a una pagina de internet o te comunicaste con el sim 908 a la maquina en donde corre el programa?, queria que me cuentes tu procedimiento para poder establecer la conexion y si lograste enviar los datos de longitud y latitud. te dejo mi email y estamos en contacto…mmgswim@hotmail.com

  6. Hola amigo disculpa las molestias pero mira tengo problemas con la aplicación el Gmap no me deja buscar nada entonces podrías colaborarme con esto 🙂 muchas gracias por tu atención.

  7. hola mira necesito saber como cambio tu versión de GMap.net 1.6 a 1.7 que es el actual y hay funciones que cambiaron y no funcionan mas te paso el listado desde ya gracias

    Dim currentMark = New GMarkerGooglegreen(current) no esta definido
    Dim rect As New GMapMarkerGoogleRed(GMapControl1.Position) no esta definido
    Dim objects = New GMapOverlay(Me.GMapControl1, “objects”) no esta definido

    • Dim currentMark = New GMarkerGooglegreen(current) no esta definido
      Dim rect As New GMapMarkerGoogleRed(GMapControl1.Position) no esta definido
      Dim objects = New GMapOverlay(Me.GMapControl1, “objects”) no esta definido

      estos errores se quitan si agregar los dll que tiene el proyecto(descarga el proyecto) de la carpeta Debug ahí esta hasta la imagen gif. y los dos archivos dll

      saludos..

  8. Hola amigo disculpa la molestia, estoy empezando en la programación y tu proyecto es muy interesante, pero no se como enviar los datos de posición de un teléfono al web service y así localizarlo desde la aplicación, disculpa si ya esta explicado arriba.

    Saludos

  9. He probado tu codigo esta bonito interesante, mi pregunta es me sale de otro pais como hago para que salga con mi pais y como tomo los valores de mi equipo movil, para que que realmente eso esta funcionando

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 )

Google+ photo

Estás comentando usando tu cuenta de Google+. 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 )

Conectando a %s