Lo estoy haciendo con linux (diran por que en linux, si hay personas que utilizan mas el S.O. windows, lo hago por que mis intenciones son que me funcione en linux por cuestiones de proyecto)
Utilizo un parser de NMEA a GPRMC del cual
Código:
<?php
set_time_limit(10);
// Converts DMS ( Degrees / minutes / seconds )
// to decimal format longitude / latitude
function DMStoDEC($dms, $longlat){
if($longlat == 'lattitude'){
$deg = substr($dms, 0, 2);
$min = substr($dms, 2, 8);
$sec = '';
}
if($longlat == 'longitude'){
$deg = substr($dms, 0, 3);
$min = substr($dms, 3, 8);
$sec='';
}
return $deg+((($min*60)+($sec))/3600);
}
//Set timezone
date_default_timezone_set('America/Cancun');
//Connect to GPS
$gps = fopen("/dev/ttyUSB0", "r"); //Leerlo desde el puerto
//$gps = fopen("/home/saul/Escritorio/gps.txt", "r"); //Leerlo desde ubuntu saul
//$gps = fopen("/home/pi/Desktop/gps.txt", "r"); //Leer archivo en RPi
//Read data from GPS
while(!feof($gps)){
$buffer = fgets($gps);
if(substr($buffer, 0, 6)=='$GPRMC'){
//echo $buffer."-----------------------"."\n";
$gprmc = explode(',',$buffer);
$data['timestamp'] = strtotime('now');
$data['sat_status'] = $gprmc[2];
$data['lattitude_dms'] = $gprmc[3];
$data['lattitude_decimal'] = DMStoDEC($gprmc[3],'lattitude');
$data['lattitude_direction'] = $gprmc[4];
$data['longitude_dms'] = $gprmc[5];
$data['longitude_decimal'] = DMStoDEC($gprmc[5],'longitude');
$data['longitude_direction'] = $gprmc[6];
if($gprmc[6]=='W'){
$data['longitude_decimal']= '-'.DMStoDEC($gprmc[5],'longitude');
}
$data['speed_knots'] = $gprmc[7];
$data['bearing'] = $gprmc[8];
$data['google_map'] = 'http://maps.google.com/maps?q='.$data['lattitude_decimal'].','.$data['longitude_decimal'];
/*print_r($data);*/
echo "\n\n";
} }
fclose($gps);
?>
Si recibo la información del Puerto directamente con esta linea:
Código:
$gps = fopen("/dev/ttyUSB0", "r"); //Leerlo desde el puerto
Procesa esta información y nunca se detiene... pero con un cat /dev/ttyUSB0 >> gps.txt y lo leo desde ese archivo
Código:
$gps = fopen("/home/saul/Escritorio/gps.txt", "r"); //Leerlo desde ubuntu
Y me ubica en el ultimo punto captura del documento con esto:
Código:
//Read data from GPS
while(!feof($gps)){
$buffer = fgets($gps);
if(substr($buffer, 0, 6)=='$GPRMC'){
//echo $buffer."-----------------------"."\n";
$gprmc = explode(',',$buffer);
$data['timestamp'] = strtotime('now');
$data['sat_status'] = $gprmc[2];
$data['lattitude_dms'] = $gprmc[3];
$data['lattitude_decimal'] = DMStoDEC($gprmc[3],'lattitude');
$data['lattitude_direction'] = $gprmc[4];
$data['longitude_dms'] = $gprmc[5];
$data['longitude_decimal'] = DMStoDEC($gprmc[5],'longitude');
$data['longitude_direction'] = $gprmc[6];
if($gprmc[6]=='W'){
$data['longitude_decimal']= '-'.DMStoDEC($gprmc[5],'longitude');
}
$data['speed_knots'] = $gprmc[7];
$data['bearing'] = $gprmc[8];
$data['google_map'] = 'http://maps.google.com/maps?q='.$data['lattitude_decimal'].','.$data['longitude_decimal'];
/*print_r($data);*/
echo "\n\n";
}}
fclose($gps);
Y en el javascript mando las coordenadas que me hace el parser hecho en php asi:
Código:
function initialize() {
var myLatlng = new google.maps.LatLng(<?php echo $data['lattitude_decimal'];?>,<?php echo $data['longitude_decimal'];?>);
var mapOptions = {
center: myLatlng,
zoom: 16,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"),mapOptions);
var marker = new google.maps.Marker({
position: myLatlng,
map: map,
title: 'Hello World!'
});
}
con el html en la marca del <body> asi:
Código:
<body onload="initialize()">
Y como les digo desde el archivo sin ningún problema pero desde el puerto tengo problemas...
Lo que quiero es hacer que cada determinado tiempo me lea desde el puerto para que primero no procese toda la información que va recibiendo y pueda hacer un Tracking (Rastreo) sin ningún problema con el google maps, solo eso me falta.
¡INTENTE! con el javascript el settimeout asi:
Código:
function gps(){
setTimeout(
function initialize() {
var myLatlng = new google.maps.LatLng(<?php echo $data['lattitude_decimal'];?>,<?php echo $data['longitude_decimal'];?>);
var mapOptions = {
center: myLatlng,
zoom: 16,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var map = new google.maps.Map(document.getElementById("map_canvas"),mapOptions);
var marker = new google.maps.Marker({
position: myLatlng,
map: map,
title: 'Hello World!'
});
},3000);
)
Y ni si quiera me muestra el Google Maps, e intente en el PHP con un sleep dentro del while:
Código:
//Read data from GPS
while(!feof($gps)){
$buffer = fgets($gps);
if(substr($buffer, 0, 6)=='$GPRMC'){
//echo $buffer."-----------------------"."\n";
$gprmc = explode(',',$buffer);
$data['timestamp'] = strtotime('now');
$data['sat_status'] = $gprmc[2];
$data['lattitude_dms'] = $gprmc[3];
$data['lattitude_decimal'] = DMStoDEC($gprmc[3],'lattitude');
$data['lattitude_direction'] = $gprmc[4];
$data['longitude_dms'] = $gprmc[5];
$data['longitude_decimal'] = DMStoDEC($gprmc[5],'longitude');
$data['longitude_direction'] = $gprmc[6];
if($gprmc[6]=='W'){
$data['longitude_decimal']= '-'.DMStoDEC($gprmc[5],'longitude');
}
$data['speed_knots'] = $gprmc[7];
$data['bearing'] = $gprmc[8];
$data['google_map'] = 'http://maps.google.com/maps?q='.$data['lattitude_decimal'].','.$data['longitude_decimal'];
/*print_r($data);*/
echo "\n\n";
}
//sleep for 3 seconds
sleep(3);
}
Y no me funciona... practicamente lo que quiero es estar recibiendo la información desde el puerto (donde tengo conectado mi dispositivo gps) y procesarlo cada 3 segundos con el google maps para que pueda realizar el rastreo en "Tiempo real", alguien que sepa? y que me pueda ayudar porfavor u.u no encuentro la solución a este (considero yo...) pequeño detalle