GPS Position von iOS Geräte im Webfront anzeigen.

So, mir hat es nicht so gut gefallen das dieses Script immer alle 10min, oder wenn man will auch jede min. getriggert wird. Habe es jetzt so gemacht das es immer nur dann Aktualisiert wird wenn uTrackme Daten in der DB aktualisiert hat.

Also im Skript „Standortbestimmung“ Zeile 12 „RunScript“ reinschreiben.

<?

// Hilfs-Integervariable mit Profil anlegen
if($IPS_SENDER == "WebFront")
{
   SetValue($IPS_VARIABLE, $IPS_VALUE);
   $name = GetValueFormatted(15106 /*[Standortbestimmung\Geräte]*/);
}
if(isset($IPS_VALUE)) {
 // NIX
} else {
    if($IPS_SENDER == "RunScript") {
       $name = GetValueFormatted(15106 /*[Standortbestimmung\Geräte]*/);
       }
    else {
     SetValueString(30903 /*[Standortbestimmung\Karte]*/, "<center>Bitte Gerät auswählen!</center>");
     return;
     }

Und in der Receiveposition.php nach „mysql_close($link);“
die 2 Zeilen "IPS_Sleep und RunScript mit der ID vom Standortbestimmung eintragen FERTISCH.

// Datenbankverbindung beenden
mysql_close($link);

IPS_Sleep(1000);

IPS_RunScript(24285);  

Hallo allerseits, ich hab das ding auch mal laufen und nun mal eine Frage zu der APP und der Akkulaufzeit.

Der Hersteller preist ja an das die APP so wenig strpom Verbraucht das die quasi im 24x7 Betrieb bleiben kann.

Mein iPhone 3GS hällt nun aber keinen Tag durch wenn die APP läuft.

Egal ob die APP im Hintergrund läuft ist oben in der Ecke immer das Ortungssymbol zu sehen und mein Server empfängt fast minütlich Positionsdaten.

Die Art der Verbindung spielt bei dem Verhalten keine Rolle. Das ding macht das über UMTS genauso wie über WLAN

Einstellungen der APP:

AUTO LAUNCH: ON
AUTO SUSPEND: ON

DEVICE ON EXTERNAL POWER:

WWAN: MIN 30Min MAX 4h
WLAN: MIN 30Min MAX 4h

Accuracy 20m
Fix 30sec

DEVICE ON BATTERY:

WWAN: MIN 30Min MAX 4h
WLAN: MIN 30Min MAX 4h

Accuracy 20m
Fix 30sec

Notifications & Alerts OFF

Hat jemand ebenfalls dieses Verhalten beobachten können?

Ich habe das Gerät heute Morgen um 07:00 mit 100% Batterieladung vom
Netz genommen. Jetzt (08:50) sind nur noch 70% über!

Das ist so nicht brauchbar.

Jemand eine Idee?

Gruß Martin

Hallo,
die Beschreibung von sanmann ist wirklich gut. Ich konnte alles nachvollziehen.
Leider reicht das für mich nicht, da ich nicht die geringste Ahnung von der Datenbank habe.
Ich vermute, dass ich erstmal einen MySQL-Server installieren muss.
Werde ich heute abend mal versuchen.

Dann folgen sicherlich noch Fragen wie:
Muss ich dann in MySQL noch eine Datenbank anlegen?
Wenn ja mit welchen Werten?

Bin ich mit meinen Vermutungen auf dem richtigen Weg???
Gibt es einen hilfreichen Link (die Suchfunktion brachte leider nichts)?

Alternativ würde ich auch die Lösung von Frank nehmen, aber auch das habe ich nicht verstanden…

@docrossi
Ich glaube wir haben die gleichen Probleme :frowning:

Gruß, Peter

Wenn du keinen SQL Server hast musst du dir einen Installieren.

Ich hab Mysql auf dem IPS Server installiert.
Dann brauchst du noch die Mysql Workbench um die Datenbank anzulegen.
Die nennen das in dem Tool ein Schema erstellen :slight_smile:

Datenbankname: ipsdata

In diese Datenbank erstellst du eine Tabelle namens: location

Die Struktur der Tabelle steht im ersten Post (Erstes Bild)

Dann musst du noch nen Datenbankbenutzer erstellen der Rechte auf die DB hat:

QUERY:
GRANT ALL PRIVILEGES ON ipsdata.* TO ‚user‘@‚localhost‘ IDENTIFIED BY ‚password‘;

Danach hast du eine Funktionsfähige Datenbank

Der Rest ist in diesem Thread erklärt.

Gruß Martin

Und hier gibt es die MySQL Datenbank „kostenlos“.

   [MySQL :: Download MySQL Community Server](http://www.mysql.de/downloads/mysql/)

Lade auch die passenden Tools runter.

[MySQL :: MySQL GUI Tools Bundle: Archived Downloads](http://dev.mysql.com/downloads/gui-tools/5.0.html)

Beim installieren wirst du dann nach einem Passwort gefragt, der User ist dann „root“.
Brauchst dann keinen weiteren Benutzer anlegen.

Gruß Michael

Die Scripte mit dem Root DB User laufen zu lassen bezeichne ich mal als grob fahrlässig !

Gruß Martin

Hallo,

vielen Dank für die Unterstützung bei der Datenbank.
Grundsätzlich funktioniert nun alles.
Die Fehlermeldung auf dem iPhone bekomme ich auch (siehe #15), aber das verhindert nicht die Funktionalität.
Ich werde wohl noch die Änderungen von bmwm3 einbauen und für die Datenbank einen User einrichten.

Bei der Darstellung im webfront hätte ich gerne das Fenster für die Karte angepasst. (wo kann man das einstellen?)
(Nachtrag: bereits gefunden!)

Kann man die Karte auch im dashboard darstellen?

Gruß, Peter

Also ich habe die Original Php vom Hersteller genommen, und modifiziert um die SQL Funktionalität zu bekommen. Die Fehlermeldung am iPhone ist damit weg:

  1. utrackme.php Empfängt die Daten vom Iphone
<?
    /*
     * This is a simple php frontend implementing the uTrackMe web API to provide
     * a multi-user tracking service.
     *
     * It uses a file to store the last known locations. This script requires 
     * php 4.3 or higher.
     */
    
    /* Init globals */
   // SQL Datenbank Zugriffsdaten und Gerätename bitte 	
        $MySQLHost="127.0.0.1";
	$username="dbuser";
	$password="dbpass";

// ---------------------------





    $data_file_path="utrackme_data_store.txt";
    $_DATA = array();

    /* -------------------------------------------------------------------- */
    function store_location_data($ID_KEY)
    /*
     * Description: Store the newly received location information in the session cache.
     * Params     : [in]     ID_KEY
     * Global     : [in/out] SESSION
     *              [in]     REQUEST
     */
    {
        global $_DATA;
        global $_REQUEST;
        
        /*
         *  Get the SESSION data array for this device; 
         *  if it doesn't exist yet create a new array.
         */
        
        if (isset($_DATA[$ID_KEY])) $data = $_DATA[$ID_KEY];
        else $data = array();
        
        /*
         * Copy the data from the REQUEST into the session data array.
         *
         * Store the last location, but only if at least one was supplied.
         * uTrackMe does not send a location when the device doesn't have 
         * a location fix or the location didn't change since the last request.
         * (Note: The rest of the track log is ignored in this script.)
         */
      
        $data["time"] = time();
        $data["id"] = $_REQUEST['id'];        
        $data["lock"] = $_REQUEST['lk'];        
        if ($_REQUEST['lk'] == 1) $data["lastlocktime"] = time();
        if (isset($_REQUEST["nm"])) $data["device_name"] = $_REQUEST['nm'];        
        if (isset($_REQUEST["d"])) $data["location"] = end($_REQUEST['d']);      

      
                
        /* Copy the data array back into the SESSION data. */
        
        $_DATA[$ID_KEY] = $data;
    }

    /* -------------------------------------------------------------------- */
    function output_location_data_plist($CUR_ID_KEY = "")
    /*
     * Description: Output the location data stored in the session cache of
     *              all devices in text plist format (uTrackMe also supports
     *              XML format)
     *
     *              (
     *                  {
     *                      id = "0000000";
     *                      tm = 1234567890;
     *                      nm = "iPhone";
     *                      lk = 1;
     *                      d = 1234567890,37.331689,-122.030731,100,-1,-1;
     *                  },
     *                  ... etc ...
     *              )
     * 
     * Params     : [in] CUR_ID_KEY
     * Global     : [in] SESSION
     */
    {
        global $_DATA;

        foreach( $_DATA as $ID_KEY => $data)
        {
            if (($ID_KEY == $CUR_ID_KEY) || (!isset($data["id"]))) continue;
                        
            /* Output the plist */
            $response .= "   {
";
            $response .= "      id = \"".addslashes($data["id"])."\";
";
 			$response .= "      tm = ".$data["time"].";
";
            $response .= "      nm = \"".addslashes($data["device_name"])."\";
";
            $response .= "      lk = \"".addslashes($data["lock"])."\";
";
            if (isset($data["lastlocktime"])) $response .= "      ll = ".$data["lastlocktime"].";
";
            if (isset($data["location"])) $response .= "      d = \"".addslashes($data["location"])."\";
";
            $response .= "   },
";
        }
        
		return $response;
    }

    /* -------------------------------------------------------------------- */
    /* MAIN                                                                 */
    /* -------------------------------------------------------------------- */

    header("content-type:text/plain");

    /* Open/create data from file */
    
    if (file_exists($data_file_path)) 
    {
        $fp = fopen($data_file_path, "r+");
        $contents = '';
        while (!feof($fp)) $contents .= fread($fp, 8192);
        $_DATA = unserialize($contents);
    }
    else
    {
        $fp = fopen($data_file_path, "w");
    }
    
    flock($fp, LOCK_EX) or die ("Failed to lock file"); // do an exclusive lock
	
	/* Get the name and version number for the user agent */ 
	$arr = explode(" ", $_SERVER['HTTP_USER_AGENT']);
	$arr = explode("/", $arr[0]);
	$app=$arr[0];
	$version=str_replace(".", "", $arr[1]);

	if (isset($_REQUEST["id"]))
	{
		/* Store the calling device's location information */
		store_location_data($_REQUEST["id"]);
	}
	
    /* Response begins with "OK". Start plist output */
   	$response = "OK
(
";

    /* Output location information of all devices this script is tracking */
	if ($app != "utmBeacon")
	{
	    $response .= output_location_data_plist($_REQUEST["id"]);
	}
	
	/* 
	 * Add a welcome message;
	 */
	//if ( $_REQUEST["nr"] == 1 ) 
	//{
	//	$msg = "thanx"; 
	//	$response .= "   {
      msg = \"".addslashes($msg)."\";
   },
";
	//}

	/* Close plist output */
	$response .= ")
";

    /* Write data back and close file */
    
    fseek($fp, 0);
    fwrite($fp, serialize($_DATA));
    flock($fp, LOCK_UN); // release the lock
    fclose($fp);
    
    $number 		= $_REQUEST['nr'];
    $iudid 		= $_REQUEST['id'];
    $devicename 	= $_REQUEST['nm'];
    $locationlock 	= $_REQUEST['lk'];  
    $location		= $_REQUEST['d'];

    foreach ($location as $value)
	{
		$locationarray = explode(",", $value);
		$date		= date("Ymd", $locationarray[0]);
		$time		= date("His", $locationarray[0]);
		$latitude	= $locationarray[1];
		$longitude	= $locationarray[2];
		$accuracy	= $locationarray[3];
		$speed		= $locationarray[4];
		$course		= $locationarray[5];
		$altitude	= $locationarray[6];
	
			
	}
		
	// Connect zum Datenbankserver
   	 $link = mysql_connect($MySQLHost, $username, $password) or die("Keine Verbindung möglich!");    
    
	// Daten in Datenbank eintragen
		mysql_select_db("ipsdata") or die("Auswahl der Datenbank fehlgeschlagen");
		$insert = "INSERT INTO location SET number='".$number."', iudid='".$iudid."', devicename='".$devicename."', locationlock='".$locationlock."', date='".$date."', time='".$time."', latitude='".$latitude."', longitude='".$longitude."', accuracy='".$accuracy."', speed='".$speed."', course='".$course."', altitude='".$altitude."'";
		$query = mysql_query($insert);
	
	//debug.log
		$myFile = "debug.log";
		$fh = fopen($myFile, 'w') or die("can't open file");
		fwrite($fh, $number."
");
		fwrite($fh, $iudid."
");
		fwrite($fh, $devicename."
");
		fwrite($fh, $locationlock."
");
		fwrite($fh, $date."
");	
		fwrite($fh, $time."
");
		fwrite($fh, $latitude."
");
		fwrite($fh, $longitude."
");
		fwrite($fh, $accuracy."
");
		fwrite($fh, $speed."
");
		fwrite($fh, $course."
");
		fwrite($fh, $altitude."
");

		if (!$query) {
			fwrite($fh, "Fehler im Query");
		}
	
		fclose($fh);


	// Datenbankverbindung beenden
   	 mysql_close($link);
	
	
	/* Output response */
	echo $response;
	IPS_Sleep(1000);

	IPS_RunScript(13375); 
?>

Die letzte Zeile " IPS_RunScript(13375); " ruft bei mir das IPS Script „Position Anzeigen“ auf. Anstelle des Timers (siehe Post 21 von bmwm3)

  1. PHP zur Anzeige der Position im Dashboard, im Script wird oben der
    Gerätename hinterlegt. Dann im Dash einfach via Browser Element anzeigen
    lassn.
<?php
// SQL Datenbank Zugriffsdaten und Gerätename bitte anpassen
$MySQLHost="127.0.0.1";
$username="dbuser";
$password="dbpass";
$name="gerätename";

// Connect zur Datenbank
$link = mysql_connect($MySQLHost, $username, $password) or die("Keine Verbindung möglich!");

mysql_select_db("ipsdata") or die("Auswahl der Datenbank fehlgeschlagen");

$select = "SELECT devicename,date,time,latitude,longitude FROM location where (devicename = '".$name."') ORDER BY id DESC LIMIT 1";
$query = mysql_query($select);
$num_rows = mysql_num_rows($query);
$row = mysql_fetch_array($query);

// Connect zur Datenbank trennen
mysql_close($link);


$lat = $row['latitude'];
$lng = $row['longitude'];
$devicename = $row['devicename'];
$date = $row['date'];
$time = $row['time'];

?>

<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Standortbestimmung</title>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
  function initialize() {
    var latlng = new google.maps.LatLng(<?php echo $lat; ?>,<?php echo $lng; ?>);
    var myOptions = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    }
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	
	var marker = new google.maps.Marker({
		position: latlng,
		map: map,
		title:"<?php echo $devicename; ?>"
	}); 
  }
</script>
</head>
<body onload="initialize()">

<div id="map_canvas" style="height: 100%;"></div>
</body>
</html>
<?php 
	echo "Zeitstempel der Position: ";
	echo $date; 
	echo " - ";
	echo $time; 
?>

P.S: Das Script „Position Anzeigen“ und die map.php bleiben so wie im 1. Post beschrieben.

Gruß Martin

Hallo Martin,

danke für die schnelle Antwort.

Zum PHP zur Anzeige im dashboard habe ich noch eine Frage:
Muss ich das script in den TString kopieren?
Das habe ich versucht, bekomme aber dann einen Syntaxfehler in Zeile 38 Position 37 und dann einen weiteren in Zeile 54/1 (Objekt erwartet).

Gruß, Peter

Nein,

leg das als PHP Datei auch nach c:\ipsymcon\webfront\user\utrackme

dann fügst du im Dahboard ein Webbrowser Element ein und trägst unter URL

http://ip:82/user/utrackme/dateiname.php

ein

Martin

Hallo Martin,

danke,
hatte gerade darüber nachgedacht, dass es so eine Lösung geben müsste.
Du hast mir hier ne Menge Zeit gespart.

Gruß, Peter

Hi ich habe mir selber ein System programmiert (Vorstellung folgt…) ohne SQL Server.

Ich habe nur das Problem das utrackme nicht oft genug updates macht.

Beispiel:

Ich gehe in meinem Ort spazieren nach ca 5 Min checkt utrackme das ich micht bewegt habe und datet up.

Nach 30min stehe ich wieder vor meiner Tür und er datet nix up. Nach 10min wieder im Haus checkt er es erst.

GPS empfang ist immer supper !

Woran kann das liegen ?

Hallo !

Ich vermute mal es liegt an den Einstellungen von utrackme. Man kann für Batteriebetrieb und Netzbetrieb die Intervalle unterschiedlich einstellen. Normal wird bei Akku-Betrieb die Position nur selten gesendet. Das spart Akku.

Hi habe ich auch schon vermutet und habe es auf 2 iphones auf das niedrigste eingestellt, da sollte er mich mit updates zu bomben ?

Hallo !

Also bei mir ist das so. Klappt es denn, wenn das Phone am Strom hängt?

Happy Day, Frank

Hi auch nicht besonders.

Es ist einfach das timeimg was nicht passt. Ich Komme heim Parke auf der anderen Strassen Seite gehe zum Haus und nach 10min im Haus checkt er wo ich bin.

Hat er beim Fahren einen GPS fix? Ohne sender er nichts.

Ja hat er.

Und max send auf 1min und min sent auf 30s?

Hallo Leute,

die ganze Sache läuft bei mir eigentlich ganz gut. Einen kleinen „Schönheitsfehler“ habe ich jedoch:
Beim ersten Aufruf wird die Karte nur unvollständig angezeigt (siehe Screenshot).
Wenn ich es via Skript noch mal aufrufe, dann wird es korrekt dargestellt. Ich vermute daher ein Timingproblem.

Wenn das so wäre, könnte ich dann irgendwo eine Wartezeit einbauen, damit das Bild schon beim ersten Aufruf korrekt dargestellt wird?

Joachim