13 de enero de 2011

Códigos de Barras QR usando la API de Google

Un pequeño ejemplo de como utilizar la API de Google para generar códigos de barras de dos dimensiones de tipo QR:

** Este seria el contenido de informacion del QR
lcDato =[?re=XAXX010101000%26rr=XAXX010101000%26tt=1234567890.123456] + ;
  [%26id=ad662d33-6934-459c-a128-BDf0393f0f44]
** Ancho x Alto
lcDimensiones = '300x300'
** Donde quieren guardar la imagen, ojo, es PNG
lcImagen = PUTFILE('QRCode','QRCode','png')

IF EMPTY(lcImagen)
  RETURN
ENDIF

IF GoogleQR(lcDato,lcDimensiones,lcImagen) == 0
  MESSAGEBOX('Descarga Exitosa',0+64,'GoogleQR')
ELSE
  MESSAGEBOX('Error en la generacion del Codigo QR',0+16,'GoogleQR')
ENDIF

FUNCTION GoogleQR(pDato,pDimensiones,pImagen)
  WAIT WINDOW "Generando y descargando Código QR, espere por favor..." NOWAIT
  DECLARE LONG URLDownloadToFile IN "urlmon";
    LONG pCaller,;
    STRING szURL,;
    STRING szFileName,;
    LONG dwReserved,;
    LONG lpfnCB
  sURL ="https://chart.googleapis.com/chart?cht=qr&chs=" + ;
    pDimensiones + "&chld=Q&chl=" + STRTRAN(pDato,'&','%26')
  nRetVal = URLDownloadToFile (0, sURL, pImagen, 0, 0)
  WAIT CLEAR
  RETURN nRetVal
ENDFUNC
Más información:
Google API
Gracias a Luis María Guayán por el tip de esta API de Google
Baltazar Moreno

6 de enero de 2011

Trabajar con GPS y Google Maps

Estuve trabajando en un proyecto sobre GPS que me gustaría compartir con ustedes, y surge la pregunta como trabajar con GPS, Google Maps y VFP9.

Por supuesto la respuesta es mas fácil de lo que esperaba, primero configurar el GPS, cada GPS es diferente lo que hay que hacer es indicarle que envíe datos a través GPRS a un IP fija, abrir un puerto en el "receptor" y lograr que escuche ese puerto.

Bueno aquí la primer solución, usando iFox, excelente herramienta, por supuesto que pueden usar WinSock pero me ha resultado mas complicado.

Nota: Pueden descargar iFox desde este enlace

Aquí el código con IFOX.
*** abrir puerto para escuchar ***
THIS.iFoxSockets = CREATEOBJECT("iFox.Sockets")
THIS.Socket = 0

*** indico el puerto que quiero escuchar en el gps debe indicar enviar datos a ese puerto
THIS.ListenSocket = THIS.iFoxSockets.LISTEN(1123)
IF THIS.ListenSocket <> 0
  * THIS.txtServer.VALUE = "Esperando conexión ..." && pueden manejar con un text box
  UPDATE gp_gps SET conectado = "Esperando..." && o pueden almacenar en una tabla
  THIS.tmrRead.INTERVAL = 400 && un timer que lee el puerto cada cierto tiempo
ELSE
  UPDATE gp_gps SET conectado = "Error"
ENDIF

*** codigo del timer ***
LOCAL nSocket, cRes
IF THISFORM.ListenSocket <> 0
  nSocket = THISFORM.iFoxSockets.AcceptConnections(THISFORM.ListenSocket)
  IF nSocket <> 0
    * Aunque es posible en este ejemplo no aceptamos mas de una conexión
    THISFORM.iFoxSockets.CLOSE(THISFORM.ListenSocket)
    THISFORM.ListenSocket = 0
    THISFORM.Socket = nSocket
    UPDATE gp_gps SET conectado="Conectado " && + THISFORM.iFoxSockets.GetRemoteHost(nSocket) + ;
      " (" + THISFORM.iFoxSockets.GetRemoteHostIP(nSocket) + " )"
  ENDIF
ENDIF
IF THISFORM.Socket <> 0
  cRes = THISFORM.iFoxSockets.READ(THISFORM.Socket)
  IF !EMPTY(cRes)
    THISFORM.edtRespuesta.VALUE = cRes + THISFORM.edtRespuesta.VALUE
    THISFORM.lbldatos.CAPTION = "Ultimos datos:" + TTOC(DATETIME())
    THISFORM.edit1.VALUE = mc_splitgps(cres,puerto)
    ***
    *** el GPS envia todo en una sola cadena lo que hago aca es separar los datos, 
    *** el GPS envia algo asi:
    *** (013666666666BP05000013666666666110106A2309.0321S06419.0954W009.811302384.57000000000L000860AF)
    *** el mc_split separa los datos en latitud longitud, fecha, hora velocidad
    *** todo es cuestion de observar un poco, por supuesto en cada gps es diferente pero 
    *** en este caso en particular queda algo asi:
    *** 013666666666BP05000013666666666
    *** Fecha 110106
    *** A23
    *** Latitud 09.0321S
    *** Longitud 06419.0954W
    *** Velocidad 009.8
    *** Hora 113023
    *** 84.57000000000L000860AF
    ***
  ELSE
    IF THISFORM.iFoxSockets.SocketClosed
      THISFORM.iFoxSockets.CLOSE(THISFORM.Socket)
      THISFORM.Socket = 0
      UPDATE gp_gps SET conectado = "Finalizado..."
    ENDIF
  ENDIF
ENDIF
***
Bueno para que lo puedan ir digiriendo los dejo un rato, en la siguiente entrega, ver los datos en Google Maps.

Bueno hasta aquí la lectura del puerto.

Saludos y hasta la próxima.

Carlos [Caremi66]