On Thursday 19 February 2009 10:41:58 you wrote:
> On Thu, Feb 19, 2009 at 5:32 PM, Daniel Benoy <[email protected]> wrote:
> > In short, that script calls nsupdate which, using some private key
> > authentication magic, changes my 'myphone.dynamic.example.com' address to
> > the IP of my phone's ppp0 interface. So every time I log in to GPRS I
> > become reachable by that address.
> >
> > Then, I made up a short script on my blog that creates an outgoing
> > connection to the gpsd port on my phone's address, and asks it where its
> > current location is, then renders the results using the google maps API
> > (which is free to use non-commercially).
>
> Nice!
>
> Mind sharing this blog script, too?
>
> r
>
----
<?php
// Read in the line from cache
$fresh = 0;
$cachefile = '/var/cache/gps';
$fh = fopen($cachefile, 'r');
if ($fh) {
$resp = fread($fh, filesize($cachefile));
fclose($fh);
}
// Refresh from GPS only if more than a minute has passed since the creation
time of the cache
if (time() - filemtime($cachefile) > 60) {
print "Refreshing from live GPS data ... ";
for ($i=0; $i<3; $i++) {
$sock = @fsockopen("myphone.dynamic.example.com", 2947, $errno, $errstr, 3);
if ($sock) { break; }
}
if (!$sock) {
print "Could not connect to GPS. Using cached data.<br/>";
} else {
for ($i=0; $i<10; $i++) {
@fwrite($sock, "O\n"); # Query what we actually want
$realresp = @fread($sock, 384);
if (strncmp($realresp, 'GPSD,O=', 7)) {
print "<!-- Unexpected response from GPS connection. -->";
} elseif (strncmp($realresp, 'GPSD,O=?', 8) == 0) {
print "<!-- The GPS connection responded, but had no fixed location.
-->";
} else {
$resp = $realresp;
$fh = fopen($cachefile, 'w');
if ($fh) {
fwrite($fh, $resp);
fclose($fh);
$fresh = 1;
}
print "Success!<br/>";
break;
}
}
if ($i == 10) {
print "Failed. Using cached data<br/>";
}
@fclose($sock);
}
}
//print($resp);
?>
<script
src="http://maps.google.com/maps?file=api&v=2&key=MY-GOOGLE-API-KEY-HERE-GET-YOUR-OWN-FROM-GOOGLE"
type="text/javascript"></script>
<div id="map" style="width: 500px; height: 300px"></div>
<script type="text/javascript">
//<![CDATA[
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
}
//]]>
</script>
<?php
// Make sure the data is fresh
if ($fresh || time() - filemtime($cachefile) < 900) {
// Parse GPS response
$location = split(" ", $resp);
?>
<script type="text/javascript">
//<![CDATA[
if (GBrowserIsCompatible()) {
map.setCenter(new GLatLng(<?php print($location[3])?>, <?php
print($location[4])?>), 13);
var point = new GPoint(<?php print($location[4])?>, <?php
print($location[3])?>);
var marker = new GMarker(point);
map.addOverlay(marker);
}
//]]>
</script>
Last update (GPS time): <?php print(date("Y-m-d H:i:s", $location[1]))?><br/>
Latitude: <?php print($location[3]); ?><br/>
Longitude: <?php print($location[4]); ?><br/>
Heading: <?php print($location[8]); ?><br/>
Ground Speed (km/h): <?php print($location[9] * 3.6); ?><br/>
<?php } else { ?>
<script type="text/javascript">
//<![CDATA[
if (GBrowserIsCompatible()) {
map.setCenter(new GLatLng(0, 0), 1);
}
//]]>
</script>
<p>Unfortunately, there has been no GPS data update in at least 15 minutes.
This probably means that the phone is currently unreachable.</p>
<p>The phone must be connected to a publicly accessible network, such as
cellular internet GPRS, in order to be reached for GPS location information.
If the phone is connected to a local wireless LAN which is firewalled, or the
phone is off or its GPS receiver is deactivated, then it will be unable to
provide telemetry.</p>
<?php } ?>
----
--
Daniel Benoy
http://daniel.benoy.name
_______________________________________________
Openmoko community mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/community