How to find the location with GSM cells
Discover how to find the coordinate from the GSM cells!!
[iframe_loader src=”https://oe2.open-electronics.org/celltrack/” height=”2150″ width=”100%”]
The PHP code to find the coordinates from GSM cells
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Tracking cell by Boris Landoni Example</title>
<?php
function geturl()
{
if ($_REQUEST["myl"] != "") {
$temp = split(":", $_REQUEST["myl"]);
$mcc = substr("00000000".($temp[0]),-8);
$mnc = substr("00000000".($temp[1]),-8);
$lac = substr("00000000".($temp[2]),-8);
$cid = substr("00000000".($temp[3]),-8);
} else {
$hex = $_REQUEST["hex"];
//echo "hex $hex";
if ($hex=="1"){
//echo "da hex to dec";
$mcc=substr("00000000".hexdec($_REQUEST["mcc"]),-8);
$mnc=substr("00000000".hexdec($_REQUEST["mnc"]),-8);
$lac=substr("00000000".hexdec($_REQUEST["lac"]),-8);
$cid=substr("00000000".hexdec($_REQUEST["cid"]),-8);
$nlac[0]=substr("00000000".hexdec($_REQUEST["lac0"]),-8);
$ncid[0]=substr("00000000".hexdec($_REQUEST["cid0"]),-8);
$nlac[1]=substr("00000000".hexdec($_REQUEST["lac1"]),-8);
$ncid[1]=substr("00000000".hexdec($_REQUEST["cid1"]),-8);
$nlac[2]=substr("00000000".hexdec($_REQUEST["lac2"]),-8);
$ncid[2]=substr("00000000".hexdec($_REQUEST["cid2"]),-8);
$nlac[3]=substr("00000000".hexdec($_REQUEST["lac3"]),-8);
$ncid[3]=substr("00000000".hexdec($_REQUEST["cid3"]),-8);
$nlac[4]=substr("00000000".hexdec($_REQUEST["lac4"]),-8);
$ncid[4]=substr("00000000".hexdec($_REQUEST["cid4"]),-8);
$nlac[5]=substr("00000000".hexdec($_REQUEST["lac5"]),-8);
$ncid[5]=substr("00000000".hexdec($_REQUEST["cid5"]),-8);
}else{
//echo "lascio dec";
$mcc = substr("00000000".$_REQUEST["mcc"],-8);
$mnc = substr("00000000".$_REQUEST["mnc"],-8);
$lac = substr("00000000".$_REQUEST["lac"],-8);
$cid = substr("00000000".$_REQUEST["cid"],-8);
$nlac[0]=substr("00000000".($_REQUEST["lac0"]),-8);
$ncid[0]=substr("00000000".($_REQUEST["cid0"]),-8);
$nlac[1]=substr("00000000".($_REQUEST["lac1"]),-8);
$ncid[1]=substr("00000000".($_REQUEST["cid1"]),-8);
$nlac[2]=substr("00000000".($_REQUEST["lac2"]),-8);
$ncid[2]=substr("00000000".($_REQUEST["cid2"]),-8);
$nlac[3]=substr("00000000".($_REQUEST["lac3"]),-8);
$ncid[3]=substr("00000000".($_REQUEST["cid3"]),-8);
$nlac[4]=substr("00000000".($_REQUEST["lac4"]),-8);
$ncid[4]=substr("00000000".($_REQUEST["cid4"]),-8);
$nlac[5]=substr("00000000".($_REQUEST["lac5"]),-8);
$ncid[5]=substr("00000000".($_REQUEST["cid5"]),-8);
}
}
//echo "MCC : $mcc <br> MNC : $mnc <br>LAC : $lac <br>CID : $cid <br>";
return array ($mcc, $mnc, $lac, $cid, $nlac, $ncid);
}
function decodegoogle($mcc,$mnc,$lac,$cid)
{
$mcch=substr("00000000".dechex($mcc),-8);
$mnch=substr("00000000".dechex($mnc),-8);
$lach=substr("00000000".dechex($lac),-8);
$cidh=substr("00000000".dechex($cid),-8);
echo "<tr><td>Hex </td><td>MCC: $mcch </td><td>MNC: $mnch </td><td>LAC: $lach </td><td>CID: $cidh </td></tr></table>";
$data =
"\x00\x0e". // Function Code?
"\x00\x00\x00\x00\x00\x00\x00\x00". //Session ID?
"\x00\x00". // Contry Code
"\x00\x00". // Client descriptor
"\x00\x00". // Version
"\x1b". // Op Code?
"\x00\x00\x00\x00". // MNC
"\x00\x00\x00\x00". // MCC
"\x00\x00\x00\x03".
"\x00\x00".
"\x00\x00\x00\x00". //CID
"\x00\x00\x00\x00". //LAC
"\x00\x00\x00\x00". //MNC
"\x00\x00\x00\x00". //MCC
"\xff\xff\xff\xff". // ??
"\x00\x00\x00\x00" // Rx Level?
;
$init_pos = strlen($data);
$data[$init_pos - 38]= pack("H*",substr($mnch,0,2));
$data[$init_pos - 37]= pack("H*",substr($mnch,2,2));
$data[$init_pos - 36]= pack("H*",substr($mnch,4,2));
$data[$init_pos - 35]= pack("H*",substr($mnch,6,2));
$data[$init_pos - 34]= pack("H*",substr($mcch,0,2));
$data[$init_pos - 33]= pack("H*",substr($mcch,2,2));
$data[$init_pos - 32]= pack("H*",substr($mcch,4,2));
$data[$init_pos - 31]= pack("H*",substr($mcch,6,2));
$data[$init_pos - 24]= pack("H*",substr($cidh,0,2));
$data[$init_pos - 23]= pack("H*",substr($cidh,2,2));
$data[$init_pos - 22]= pack("H*",substr($cidh,4,2));
$data[$init_pos - 21]= pack("H*",substr($cidh,6,2));
$data[$init_pos - 20]= pack("H*",substr($lach,0,2));
$data[$init_pos - 19]= pack("H*",substr($lach,2,2));
$data[$init_pos - 18]= pack("H*",substr($lach,4,2));
$data[$init_pos - 17]= pack("H*",substr($lach,6,2));
$data[$init_pos - 16]= pack("H*",substr($mnch,0,2));
$data[$init_pos - 15]= pack("H*",substr($mnch,2,2));
$data[$init_pos - 14]= pack("H*",substr($mnch,4,2));
$data[$init_pos - 13]= pack("H*",substr($mnch,6,2));
$data[$init_pos - 12]= pack("H*",substr($mcch,0,2));
$data[$init_pos - 11]= pack("H*",substr($mcch,2,2));
$data[$init_pos - 10]= pack("H*",substr($mcch,4,2));
$data[$init_pos - 9]= pack("H*",substr($mcch,6,2));
if ((hexdec($cid) > 0xffff) && ($mcch != "00000000") && ($mnch != "00000000")) {
$data[$init_pos - 27] = chr(5);
} else {
$data[$init_pos - 24]= chr(0);
$data[$init_pos - 23]= chr(0);
}
$context = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type: application/binary\r\n"
. "Content-Length: " . strlen($data) . "\r\n",
'content' => $data
)
);
$xcontext = stream_context_create($context);
$str=file_get_contents("http://www.google.com/glm/mmap",FALSE,$xcontext);
if (strlen($str) > 10) {
$lat_tmp = unpack("l",$str[10].$str[9].$str[8].$str[7]);
$lat = $lat_tmp[1]/1000000;
$lon_tmp = unpack("l",$str[14].$str[13].$str[12].$str[11]);
$lon = $lon_tmp[1]/1000000;
$raggio_tmp = unpack("l",$str[18].$str[17].$str[16].$str[15]);
$raggio = $raggio_tmp[1]/1;
} else {
echo "Not found!";
$lat = 0;
$lon = 0;
}
return array($lat,$lon,$raggio);
}
list($mcc,$mnc,$lac,$cid, $nlac, $ncid)=geturl();
echo "<table cellspacing=30><tr><td>Dec</td><td>MCC: $mcc </td><td>MNC: $mnc </td><td>LAC: $lac </td><td>CID: $cid </td></tr>";
list ($lat,$lon,$raggio)=decodegoogle($mcc,$mnc,$lac,$cid);
echo "<br>Google result for the main Cell<br>";
echo "Lat=$lat <br> Lon=$lon <br> Range=$raggio m<br>";
echo "<a href=\"http://maps.google.it/maps?f=q&source=s_q&hl=it&geocode=&q=$lat,$lon&z=14\" TARGET=\"_blank\" >See on Google maps</a> <BR> <br>";
for ($contatore=0; $contatore < (count($nlac)); $contatore++) {
if ($nlac[$contatore]==0) {
//echo "trovato campo vuoto al contatore $contatore<BR>";
$ncelle=$contatore;
break;
}
}
for ($contatore=0; $contatore < ($ncelle); $contatore++) {
echo "LAC: $nlac[$contatore]\t CID: $ncid[$contatore]<BR>";
list ($nlat[$contatore],$nlon[$contatore],$nraggio[$contatore])=decodegoogle($mcc,$mnc,$nlac[$contatore],$ncid[$contatore]);
echo "<br>Google result for the Neighbor Cell $contatore <br>";
echo "nLat=$nlat[$contatore] <br> nLon=$nlon[$contatore] <br> nRaggio=$nraggio[$contatore] m<br><br>";
}
echo "<div id=\"map\" style=\"width: 100%; height: 700px\"></div>";
echo "<script type=\"text/javascript\">";
echo "var latgoogle=$lat;";
echo "var longoogle=$lon;";
echo "var raggio=$raggio;";
//creo un file contenente le coordinate delle celle ****
$stringa_xml_doc = " <markers>\n\t";
$stringa_xml_doc =$stringa_xml_doc. "<marker lat=\"$lat\" lng=\"$lon\" rag=\"$raggio\" html=\"Main cell\" ico=\"antred\" label=\"Main\" />";
for($contatore= 0; $contatore < $ncelle; $contatore++)
{
if ($nlat[$contatore]!=0) {
$stringa_xml_doc =$stringa_xml_doc. "<marker lat=\"$nlat[$contatore]\" lng=\"$nlon[$contatore]\" rag=\"$nraggio[$contatore]\" html=\"Cell $contatore\" ico=\"antbrown\" label=\"Marker $contatore\" />";
}
}
$stringa_xml_doc =$stringa_xml_doc."\n </markers>";
echo ($stringa_xml_doc);
//$stringa_xml = $stringa_xml_dtd.$stringa_xml_doc;
$stringa_xml = $stringa_xml_doc;
$file_name = "celle_xml.xml";
$file = fopen ($file_name,"w");
$num = fwrite ($file, $stringa_xml);
fclose($file);
echo("File XML creato con successo!!");
//***
echo "nLat=new Array();";
echo "nLon=new Array();";
echo "nraggio=new Array();";
for ($contatore=0; $contatore < ($ncelle); $contatore++)
{
echo " nLat [$contatore] =$nlat[$contatore];
nLon [$contatore] =$nlon[$contatore];
nraggio [$contatore]=$nraggio[$contatore];";
}
echo "</script>";
?>
<center>
<br>
<br>
<center>
<br>
<br>
<iframe width='100%' height='540' marginwidth='0' marginheight='0' scrolling='no' frameborder='0' src='http://open-electronics.org/fb/' ></iframe>
</center>
<br>
<br>
</center>
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAIJFMStkxCl4SCny-4ljyrBRkrgiUOwoahV4KonZmGOdSmhVVVBTizYtL9IQMT4sND3EJvMdlOrIA8g" type="text/javascript"></script>
</head>
<body onunload="GUnload()">
<center>
<br>
<br>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-5248152858136551";
/* OE Link Banner post */
google_ad_slot = "3312240372";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<br>
<br>
</center>
<script type="text/javascript">
//function initialize() {
if (GBrowserIsCompatible()) {
//alert("boris2");
//}
// This function picks up the click and opens the corresponding info window
function myclick(i) {
GEvent.trigger(gmarkers[i], "click");
}
var map = new GMap2(document.getElementById("map"));
//map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.setUIToDefault();
function cursore() {
alert("boris");
var pointg = new GLatLng(latgoogle,longoogle);
alert(pointg);
}
// A function to create the marker and set up the event window
function createMarker(point,name,html,icona) {
var marker = new GMarker(point,markerOptions);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(html);
});
return marker;
}
// Read the data from example.xml
GDownloadUrl("celle_xml.xml", function(doc) {
var xmlDoc = GXml.parse(doc);
var markers = xmlDoc.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
// obtain the attribues of each marker
var lat = parseFloat(markers[i].getAttribute("lat"));
var lng = parseFloat(markers[i].getAttribute("lng"));
var raggio = parseFloat(markers[i].getAttribute("rag"));
var icona = markers[i].getAttribute("ico");
var Icon = new GIcon(G_DEFAULT_ICON);
Icon.image = icona + ".png";
// Set up our GMarkerOptions object
markerOptions = { icon:Icon };
var point = new GLatLng(lat,lng);
var html = markers[i].getAttribute("html");
var label = markers[i].getAttribute("label");
// create the marker
if (icona=="antred") {
var color="#FF0000";
var fillColor="#FF6600";
}
else {
var color="#FF6699";
var fillColor="#FF99CC";
}
var thickness=4;
var opacity=0.4;
var fillOpacity=0.2;
var polyCircle=drawCircle(point, raggio, color, thickness, opacity, fillColor, fillOpacity);
map.addOverlay(polyCircle);
var marker = createMarker(point,label,html,markerOptions);
map.addOverlay(marker);
}
map.setCenter(point, 13);
// put the assembled side_bar_html contents into the side_bar div
//document.getElementById("side_bar").innerHTML = side_bar_html;
});
function drawCircle(center, radius, color, thickness, opacity, fillColor, fillOpacity)
{
radiusMiles=radius*0.000621371192;
//alert(radiusMiles);
var degreesPerPoint = 8;
var radiusLat = radiusMiles * (1/69.046767); // there are >> >> > 69.046767 miles per degree latitude
var radiusLon = radiusMiles * (1/(69.046767 * Math.cos(parseFloat(center.lat()) * Math.PI / 180)));
var points = new Array();
//Loop through all degrees from 0 to 360
for(var i = 0; i < 360; i += degreesPerPoint)
{
var point = new GLatLng(parseFloat(center.lat()) + (radiusLat * Math.sin(i * Math.PI / 180)), parseFloat(center.lng()) + (radiusLon * Math.cos(i * Math.PI / 180)));
points.push(point);
}
points.push(points[0]); // close the circle
polyCircle = new GPolygon(points, color, thickness, opacity, fillColor, fillOpacity)
return polyCircle;
}
}
</script>
<script type="text/javascript">
//cursore(); //carica il marcatore
</script>
</body>
</html>