New Version

, think I'll call it 0.2.0, and GPL, but please tell me if you decide to redistribute a modified version.
GPSUpdate.php - Now plays NS sounds since their disabled when scripting is enabled. Requires win32std extenstion, since NS functions aren't avaliable when PHP is used as scripting for some reason.
PHP Code:
//<?php
set_time_limit(0);
define('PLAY_SOUND', false);
$Data = array();
function OnGPSPosition ($Latitude, $Longitude, $Altitude) {
global $Data;
$Data['lat'] = (double) $Latitude;
$Data['long'] = (double) $Longitude;
$Data['alt'] = (double) $Altitude;
$Data['nogps'] = false;
update();
}
function OnGPSSpeed ($Speed) {
global $Data;
$Speed = (double) $Speed;
$Speed = $Speed * 1.150779;
$Data['speed'] = $Speed;
$Data['nogps'] = false;
update();
}
function OnGPSNoFix () {
global $Data;
$Data['nogps'] = true;
update();
}
function update () {
global $Data;
if (!isset($Data['lat']) || !isset($Data['long']) || !isset($Data['alt']) || !isset($Data['speed'])) {
$Data['lat'] = 0;
$Data['long'] = 0;
$Data['alt'] = 0;
$Data['speed'] = 0;
$Data['nogps'] = true;
}
$Data['time'] = time();
file_put_contents('GPSData', serialize($Data));
}
function OnScanComplete ($FoundNew, $SeenBefore, $LostContact, $BestSNR) {
if ($FoundNew > 0) {
win_play_wav('ns-aos-new.wav');
}elseif ($LostContact > 0) {
win_play_wav('ns-los.wav');
}elseif ($SeenBefore > 0 && PLAY_SOUND){
$SNRwav = intval($BestSNR / 10);
if ($SNRwav > 6) $SNRwav = 6;
win_play_wav("ns-signal-$SNRwav.wav");
}
}
OnlineUpdate.php - Now uses HTTP POST as to not fill up server logs with GET data, and supports password protection.
PHP Code:
<?php
chdir('C:\\Program Files\\Network Stumbler');
set_time_limit(0);
$LastTime = 0;
while (true) {
if (file_exists('GPSData')) {
$Data = unserialize(file_get_contents('GPSData'));
var_dump($Data);
if ($Data['time'] !== $LastTime) {
if ($Data['lat'] != 0 && $Data['long'] != 0) {
$cURL = curl_init();
curl_setopt_array($cURL, array(
CURLOPT_URL => "http://URL.TO/Update.php",
CURLOPT_HEADER => false,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 3,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => "spd={$Data['speed']}&alt={$Data['alt']}&lat={$Data['lat']}&lng={$Data['long']}&tim={$Data['time']}&pwd=".md5('PASSWORD' . substr(time(), 0, 6)),
));
$ret = curl_exec($cURL);
curl_close($cURL);
if ($ret === false) {
file_put_contents('CACHED_DATA', serialize($Data)."\r\n", FILE_APPEND);
}
}
$LastTime = $Data['time'];
echo "\r\n";
sleep(10);
}else{
echo "\r\n";
sleep(2);
}
}else{
sleep(5);
}
}
Update.php - Modified to support password protection.
PHP Code:
<?php
include('SQL.inc');
if (isset($_REQUEST['spd']) && isset($_REQUEST['alt']) && isset($_REQUEST['lat']) && isset($_REQUEST['lng']) && isset($_REQUEST['tim']) && isset($_REQUEST['pwd'])) {
if ($_REQUEST['pwd'] !== md5('PASSWORD' . substr(time(), 0, 6))) {
die('Invalid pwd!');
}
$_REQUEST['spd'] = $SQL->escape_string($_REQUEST['spd']);
$_REQUEST['alt'] = $SQL->escape_string($_REQUEST['alt']);
$_REQUEST['lat'] = $SQL->escape_string($_REQUEST['lat']);
$_REQUEST['lng'] = $SQL->escape_string($_REQUEST['lng']);
$_REQUEST['tim'] = $SQL->escape_string($_REQUEST['tim']);
$SQL->query("INSERT INTO `data` (`Time`,`Latitude`,`Longitude`,`Altitude`,`Speed`) VALUES ('{$_REQUEST['tim']}','{$_REQUEST['lat']}','{$_REQUEST['lng']}','{$_REQUEST['alt']}','{$_REQUEST['spd']}')");
}
CacheUpdate.php - Use instead of OnlineUpdate.php when theres no internet
PHP Code:
<?php
chdir('C:\\Program Files\\Network Stumbler');
set_time_limit(0);
$LastTime = 0;
while (true) {
if (file_exists('GPSData')) {
$Data = unserialize(file_get_contents('GPSData'));
var_dump($Data);
if ($Data['time'] !== $LastTime) {
if ($Data['lat'] != 0 && $Data['long'] != 0) {
file_put_contents('CACHED_DATA', serialize($Data)."\r\n", FILE_APPEND);
}
$LastTime = $Data['time'];
echo "\r\n";
sleep(10);
}else{
echo "\r\n";
sleep(2);
}
}
}
SendCache.php - Sends cached data to the server.
PHP Code:
<?php
chdir('C:\\Program Files\\Network Stumbler');
if (!file_exists('CACHED_DATA')) {
die('File Not Exist');
}
$File = file('CACHED_DATA');
foreach ($File as $Data) {
$Data = unserialize($Data);
var_dump($Data);
$cURL = curl_init();
curl_setopt_array($cURL, array(
CURLOPT_URL => "http://UTL.TO/Update.php",
CURLOPT_HEADER => false,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 10,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => "spd={$Data['speed']}&alt={$Data['alt']}&lat={$Data['lat']}&lng={$Data['long']}&tim={$Data['time']}&pwd=".md5('' . substr(time(), 0, 6)),
));
$ret = curl_exec($cURL);
if ($ret === false) {
file_put_contents('CACHED_DATA2', serialize($Data)."\r\n", FILE_APPEND);
}else{
var_dump($Data);
}
curl_close($cURL);
}
unlink('CACHED_DATA');
And the best of all,
Viewer.php - Shows GPS trail and current stats on Google Maps API
PHP Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/tr/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<meta http-equiv="Content-Language" content="en-us" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>GPS</title>
<style type="text/css">
v:* {
behavior:url(#default#VML);
}
td,tr,th {
background-color: transparent;
text-align: left;
}
</style>
<script src="http://maps.google.com/maps?file=api&v=2&key=GOOGLE_MAPS_API_KEY_HERE" type="text/javascript"></script>
</head>
<body onunload="GUnload()">
<div id="content"><!--CONTENT-->
<div style="text-align:center;">
<div id="map" style="width:100%;height:500px;"></div>
</div>
</div><!--END_CONTENT-->
<script type="text/javascript">
//<![CDATA[
var map = new GMap2(document.getElementById("map"));
var FirstRun = true;
var polyline;
var currlocation;
function LoadXMLData () {
GDownloadUrl("XMLData.php?" + Math.floor(Math.random()*1000000), function(data, responseCode) {
var xml = GXml.parse(data);
var newdata = xml.documentElement.getElementsByTagName("data");
var datapoints = xml.documentElement.getElementsByTagName("point");
if (FirstRun == true) {
map.setCenter(new GLatLng(parseFloat(datapoints[0].getAttribute("lat")), parseFloat(datapoints[0].getAttribute("lng"))), 16, G_HYBRID_MAP);
FirstRun = false;
}
var points = [];
for (var i = 0; i < datapoints.length; i++) {
points.push(new GLatLng(parseFloat(datapoints[i].getAttribute("lat")), parseFloat(datapoints[i].getAttribute("lng"))));
}
polyline = new GPolyline(points);
map.addOverlay(polyline);
currlocation = new GMarker(new GLatLng(parseFloat(datapoints[0].getAttribute("lat")), parseFloat(datapoints[0].getAttribute("lng"))));
map.addOverlay(currlocation);
currlocation.openInfoWindowHtml("<table><th style='background-color:transparent;'><b>Current Info:</b></th><tr><td>Speed:</td><td>" + parseFloat(newdata[0].getAttribute("spd")) + " MPH</td></tr><tr><td>Altitude:</td><td>" + parseFloat(newdata[0].getAttribute("alt")) + " ft</td></tr><tr><td>Last Update:</td><td>" + (Math.round(((parseFloat(newdata[0].getAttribute("cti")) - parseFloat(newdata[0].getAttribute("tim"))) / 60 ) * 100) / 100) + " minutes ago</td></tr></table>");
map.panTo(new GLatLng(parseFloat(datapoints[0].getAttribute("lat")), parseFloat(datapoints[0].getAttribute("lng"))));
});
}
LoadXMLData();
function ReloadXMLData () {
map.removeOverlay(polyline);
map.removeOverlay(currlocation);
LoadXMLData();
window.setTimeout("ReloadXMLData();", 7500);
}
window.setTimeout("ReloadXMLData();", 7500);
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
//]]>
</script>
</body>
</html>
XMLData.php and SQL.inc were not changed.