Files
EQN/appServer/distquake_upload4.php
2017-09-22 15:16:26 +02:00

351 lines
17 KiB
PHP

<?php
$arrival_time = microtime(true);
$ini = parse_ini_file("conf.ini", true);
if ($ini['db']['log'] == "1") {
$arrival_time = microtime(true);
$filename = basename(__FILE__);
$filename = "log_" . $filename . ".txt";
$chunck = strval($arrival_time) . " " . $_SERVER['REQUEST_URI'] . "\r\n";
file_put_contents($filename, $chunck, FILE_APPEND);
}
if (empty($_REQUEST['u_id'])) {
exit("No parameters");
}
$calmax = $_REQUEST['cal_max'];
$calmin = $_REQUEST['cal_min'];
$user_id = $_REQUEST['u_id'];
$user_latitude = $_REQUEST['lat'];
$user_longitude = $_REQUEST['lon'];
$user_accuracy = $_REQUEST['acc'];
$calibrated = $_REQUEST['cal'];
$screenOn = $_REQUEST['s_on'];
$charge = $_REQUEST['ch'];
$delta_notification = $_REQUEST['d_not'];
$event = $_REQUEST['e_t'];
if (!empty($_REQUEST['upd'])){
$upd=$_REQUEST['upd'];
}
else{
$upd=1;
}
if (!empty($_REQUEST['a_max'])){
$max_acc=$_REQUEST['a_max'];
}
else{
$max_acc=-1;
}
if (!empty($_REQUEST['mon'])){
$mon=$_REQUEST['mon'];
}
else{
$mon=0;
}
if ($user_id <> 0) {
mysql_connect($ini['db']['host'], $ini['db']['user'], $ini['db']['pass']);
mysql_select_db($ini['db']['db']);
$enabled = (int) ($calibrated == 1 and $screenOn == 0 and $charge == 1 and $user_latitude <> 0 and $user_longitude <> 0);
//insert into notification table as first thing so counter_ref is 1 at least
if ($enabled==1){
$sql = mysql_query("replace into notifications (enabled,user_id,latitude,longitude) values ($enabled,$user_id,$user_latitude,$user_longitude)");
}
else{
$sql = mysql_query("delete from notifications where user_id=$user_id");
}
if ($event == 1 and $enabled == 1 and $delta_notification < 8) {
$sql = mysql_query("delete from candidate where data < date_sub(now(), interval 7 second)");
//cerca il conteggio di riferimento nella tabella di cache
$sql = mysql_query("SELECT count as counter_ref FROM cache_refcount WHERE abs(latitude-$user_latitude)<0.015 and abs(longitude-$user_longitude)<0.015 order by counter_ref desc");
if (mysql_num_rows($sql)) {
$counter_ref0 = mysql_result($sql, 0, "counter_ref");
}
else{
//se il conteggio non è trovato viene calcolato e messo nella tabella di cache
$sql = mysql_query("SELECT count(*) as counter_ref FROM notifications WHERE abs(latitude-$user_latitude)<0.2 and abs(longitude-$user_longitude)<0.2");
$counter_ref0 = mysql_result($sql, 0, "counter_ref");
$sql = mysql_query("INSERT INTO cache_refcount (latitude,longitude,count) values ($user_latitude,$user_longitude,$counter_ref0)");
}
$radius=0.2;
$counter_ref = round(sqrt($counter_ref0)*1.95);
if ($user_latitude>-33.625 && $user_latitude<-33.275 && $user_longitude>-70.85 && $user_longitude<-70.475){
$counter_ref = round(sqrt($counter_ref0)*3.5);
}
if ($user_latitude>19.15 && $user_latitude<19.75 && $user_longitude>-99.35 && $user_longitude<-98.82){
$counter_ref = round(sqrt($counter_ref0)*3.5);
}
if ($counter_ref0>2000){
$minutes=intval(date('i'));
$seconds = intval(date('s'));
if (($minutes==0 && $seconds<40) || ($minutes==59 && $seconds>50) || ($minutes==30 && $seconds<40) || ($minutes==29 && $seconds>50)){
$counter_ref = round(sqrt($counter_ref0)*3.5);
}
}
$sql = mysql_query("insert into candidate(latitude,longitude,active,max_acc) values ($user_latitude,$user_longitude,$counter_ref0,$max_acc)");
$sql = mysql_query("select count(*) as count from candidate where abs(latitude-$user_latitude)<$radius and abs(longitude-$user_longitude)<$radius and abs(latitude-$user_latitude)>0.002 and abs(longitude-$user_longitude)>0.002 and data >= date_sub(now(), interval 7 second)");
$counter = mysql_result($sql, 0, "count");
if ($counter > $counter_ref) {
$sql = mysql_query("select avg(latitude) as mean_latitude,avg(longitude) as mean_longitude from candidate where abs(latitude-$user_latitude)<$radius and abs(longitude-$user_longitude)<$radius and abs(latitude-$user_latitude)>0.002 and abs(longitude-$user_longitude)>0.002 and data >= date_sub(now(), interval 7 second)");
$mean_latitude = mysql_result($sql, 0, "mean_latitude");
$mean_longitude = mysql_result($sql, 0, "mean_longitude");
$sql = mysql_query("SELECT count(*) as thr1 FROM notifications WHERE abs(latitude-$mean_latitude)<0.55 and abs(longitude-$mean_longitude)<0.55 and enabled=1");
$thr1 = mysql_result($sql, 0, "thr1");
$thr1 = round(sqrt($thr1)*1.95);
$sql = mysql_query("SELECT count(*) as thr2 FROM notifications WHERE abs(latitude-$mean_latitude)<1.1 and abs(longitude-$mean_longitude)<1.1 and enabled=1");
$thr2 = mysql_result($sql, 0, "thr2");
$thr2 = round(sqrt($thr2)*1.95);
$sql = mysql_query("select count(*) as signals1 from candidate where abs(latitude-$mean_latitude)<0.55 and abs(longitude-$mean_longitude)<0.55 and abs(latitude-$mean_latitude)>0.002 and abs(longitude-$mean_longitude)>0.002");
$signals1 = mysql_result($sql, 0, "signals1");
$sql = mysql_query("select count(*) as signals2 from candidate where abs(latitude-$mean_latitude)<1.1 and abs(longitude-$mean_longitude)<1.1 and abs(latitude-$mean_latitude)>0.002 and abs(longitude-$mean_longitude)>0.002");
$signals2 = mysql_result($sql, 0, "signals2");
$intensity=0;
if ($thr1/$counter_ref>1.2){
if ($signals1>$thr1){
$intensity=2;
}
else{
$intensity=1;
}
}
else{
if ($thr2/$counter_ref>1.2){
if ($signals2>$thr2){
$intensity=2;
}
}
}
$randcode = mt_rand(1000000, 9999999);
$state = 2;
$c = $counter + 1;
//try to estimate a better epicenter using the weighted average algorithm
//$sql = mysql_query("select sum(latitude*(1/active))/sum(1/active) as better_latitude,sum(longitude*(1/active))/sum(1/active) as better_longitude from candidate where abs(latitude-$mean_latitude)<2 and abs(longitude-$mean_longitude)<2 and active>0");
//$better_latitude = mysql_result($sql, 0, "better_latitude");
//$better_longitude = mysql_result($sql, 0, "better_longitude");
$better_latitude=$mean_latitude;
$better_longitude=$mean_longitude;
$sql = mysql_query("SELECT ID from earthquakes WHERE abs(latitude-$better_latitude)<4.5 AND abs(longitude-$better_longitude)<4.5 AND date > date_sub(now(), interval 2 minute) LIMIT 1");
if (mysql_num_rows($sql)) {
//do nothing
} else {
$sql = mysql_query("insert into earthquakes (latitude,longitude,latitude_old,longitude_old,signals,thr,signals1,thr1,signals2,thr2,state,code,intensity) values ($better_latitude,$better_longitude,$mean_latitude,$mean_longitude,$c,$counter_ref,$signals1,$thr1,$signals2,$thr2,$state,$randcode,$intensity)");
//note that this is based on the mean_latitude and mean_longitude and NOT on the better estimates
$sql = mysql_query("insert into earthquake_details (code,latitude,longitude,data,active,max_acc) select $randcode,latitude,longitude,data,active,max_acc from candidate where abs(latitude-$mean_latitude)<$radius and abs(longitude-$mean_longitude)<$radius");
//generate the new file for download
$filename = "past_quakes.txt";
$sql = mysql_query('SET CHARACTER SET utf8');
$sql = mysql_query("SELECT format(latitude,3) as latitude,format(longitude,3) as longitude,users,state,code,TIMESTAMPDIFF(MINUTE,date,NOW()) AS difference FROM earthquakes where latitude<>0 AND longitude<>0 AND ban<5 AND falsealarm=0");
if (mysql_num_rows($sql)) {
while ($e = mysql_fetch_assoc($sql))
$output_file[] = $e;
$json_file = json_encode($output_file);
file_put_contents($filename, $json_file);
}
$datetime = date('Y-m-d H:i:s');
$dataArray = array(
'latitude' => number_format((float) $better_latitude, 2, '.', ''),
'longitude' => number_format((float) $better_longitude, 2, '.', ''),
'detection_latitude' => number_format((float) $mean_latitude, 2, '.', ''),
'detection_longitude' => number_format((float) $mean_longitude, 2, '.', ''),
'wave_speed' => 8,
'counter' => $c,
'datetime' => $datetime,
'intensity' => $intensity,
'type' => 'eqn'
);
//extract users for notifications
$row_limit=250000;
$distance_ref=-1;
$keep_going=1;
while ($keep_going){
$sql2 = mysql_query("SELECT reg_id,ABS(last_latitude-$better_latitude)+ABS(last_longitude-$better_longitude) as distance FROM gcm where notification_eqn=1 and reg_id<>'' and ABS(last_latitude-$better_latitude)+ABS(last_longitude-$better_longitude)>$distance_ref ORDER BY distance ASC limit $row_limit");
$num_rows2 = mysql_num_rows($sql2);
if ($num_rows2>0){
while ($data = mysql_fetch_assoc($sql2)) {
$regidArray[] = $data['reg_id'];
$distanceArray[] = $data['distance'];
}
$distance_ref=end($distanceArray);
$block_size = 999;
$iter = ceil($num_rows2 / $block_size);
$folder_eqn = uniqid();
mkdir($folder_eqn);
$filename_data = $folder_eqn . "/dataarray.json";
file_put_contents($filename_data, json_encode($dataArray));
for ($i = 0; $i < $iter; $i++) {
$index_start = $i * $block_size;
$index_end = ($i + 1) * $block_size - 1;
if ($index_end > $num_rows2 - 1) {
$index_end = $num_rows2 - 1;
}
$regidArrayGCM = array_slice($regidArray, $index_start, $index_end - $index_start + 1);
$filename = $folder_eqn . "/gcmid" . $i . ".json";
file_put_contents($filename, json_encode($regidArrayGCM));
//exec("php /var/www/earthquakenetwork.it/mysql/distquake_gcm_call.php $filename_data $filename" . "> /dev/null 2>/dev/null &");
sleep(0.1);
}
//sleep(1);
//$files = glob($folder_eqn.'/*',GLOB_MARK);
//foreach ($files as $file) {
// unlink($file);
//}
//rmdir($folder_eqn.'/');
unset($distanceArray);
unset($regidArray);
}
else{
$keep_going=0;
}
}
require_once('/var/www/earthquakenetwork.it/mysql/codebird.php');
if ($better_latitude<32 and $better_longitude>-115 and $better_longitude<-35){
\Codebird\Codebird::setConsumerKey("Y71jBy9zGPkqXo8Fa8BRHCfU9", "PEaChITvoSn9r32HwpHc4XY8kQQML8ksuBZZRbsdww6xY7EyaS");
$cb = \Codebird\Codebird::getInstance();
$cb->setToken("811156846937538560-I5n28wjcQ8eVf497q5qe36EF4I9Kwjb", "pvHLu9dz4BaVNOlQz3rzFkh0XvpJq3fZZ6PYZGv06u1Gy");
}
else{
\Codebird\Codebird::setConsumerKey("ohMqhP9qQKMXSyNhdGltmnvgA", "ljMnxTuEIKDINSedkusbgRj6lIruB8Oi5EP6WOaZ6uW9DJg3gu");
$cb = \Codebird\Codebird::getInstance();
$cb->setToken("1707171247-n3v2z1JNPhJdkSJY2ES9PVFKWav9TgUPBPS22hI", "rgTMihngYdqHc69eFYjloZoSnzTOficDyG5FTm1zNqGmq");
}
$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" . $better_latitude . "," . $better_longitude . "&sensor=true&language=es";
$data = @file_get_contents($url);
$jsondata = json_decode($data, true);
if (is_array($jsondata) && $jsondata['status'] == "OK") {
$c = count($jsondata['results']['0']['address_components']);
$region = "";
$country = "";
$stored = 0;
for ($i = 0; $i < $c; $i++) {
if (strcmp($jsondata['results']['0']['address_components'][$i]['types'][0], "country") == 0) {
$country = $jsondata['results']['0']['address_components'][$i]['long_name'];
}
if (strcmp($jsondata['results']['0']['address_components'][$i]['types'][0], "administrative_area_level_2") == 0) {
if ($stored == 0) {
$region = $jsondata['results']['0']['address_components'][$i]['long_name'];
}
}
if (strcmp($jsondata['results']['0']['address_components'][$i]['types'][0], "administrative_area_level_3") == 0) {
$region = $jsondata['results']['0']['address_components'][$i]['long_name'];
$stored = 1;
}
}
$region = str_replace(' ', '', $region);
$country = str_replace(' ', '', $country);
if ($better_latitude<32 and $better_longitude>-115 and $better_longitude<-35) {
$text = "#sismo detectado en tiempo real en #" . $region . " #" . $country . " por @SismoDetector. Descarga la app https://goo.gl/v73ASq";
} else {
$text = "#terremoto rilevato in tempo reale a #" . $region . " #" . $country . ". Scarica la app per ricevere allerte https://goo.gl/y4wBKB";
}
$params = array(
'status' => $text
);
$reply = $cb->statuses_update($params);
}
}
}
if ($counter > $counter_ref) {
$sql = mysql_query("SELECT count(*) as thr1 FROM notifications WHERE abs(latitude-$mean_latitude)<0.4 and abs(longitude-$mean_longitude)<0.4 and enabled=1");
$thr1 = mysql_result($sql, 0, "thr1");
$thr1 = round(sqrt($thr1)*1.95);
$sql = mysql_query("SELECT count(*) as thr2 FROM notifications WHERE abs(latitude-$mean_latitude)<0.8 and abs(longitude-$mean_longitude)<0.8 and enabled=1");
$thr2 = mysql_result($sql, 0, "thr2");
$thr2 = round(sqrt($thr2)*1.95);
$sql = mysql_query("select count(*) as signals1 from candidate where abs(latitude-$mean_latitude)<0.4 and abs(longitude-$mean_longitude)<0.4 and abs(latitude-$mean_latitude)>0.002 and abs(longitude-$mean_longitude)>0.002");
$signals1 = mysql_result($sql, 0, "signals1");
$sql = mysql_query("select count(*) as signals2 from candidate where abs(latitude-$mean_latitude)<0.8 and abs(longitude-$mean_longitude)<0.8 and abs(latitude-$mean_latitude)>0.002 and abs(longitude-$mean_longitude)>0.002");
$signals2 = mysql_result($sql, 0, "signals2");
$sql = mysql_query("insert into earthquakes_test (latitude,longitude,signals,thr,signals1,thr1,signals2,thr2) values ($mean_latitude,$mean_longitude,$counter,$counter_ref,$signals1,$thr1,$signals2,$thr2)");
}
}
$filename = date('Ymd');
$host = gethostname();
$host = substr($host,0,4);
$filename=$filename.'_'.$host;
$filename = "/var/log/eqn/log_eqn_" . $filename . ".txt";
$delta_notification = round($delta_notification * 100) / 100;
$chunck = (int) $event . ',' . $enabled . ',' . $_REQUEST['u_id'] . ',' . $_REQUEST['lat'] . ',' . $_REQUEST['lon'] . ',' . $_REQUEST['acc'] . ',' . strval($delta_notification) . ',' . strval($arrival_time) . "\r\n";
file_put_contents($filename, $chunck, FILE_APPEND);
//$filename="online_users.txt";
//$online_users=file_get_contents($filename);
//$online_users=intval($online_users);
$sql = mysql_query("select last_latitude,last_longitude from gcm where user_id=$user_id limit 1");
$c = mysql_num_rows($sql);
if ($c>0){
$last_latitude = mysql_result($sql, 0, "last_latitude");
$last_longitude = mysql_result($sql, 0, "last_longitude");
//$upd==1 and ricordarsi di aggiungere all'if
if ($user_latitude<>0 and $user_longitude<>0 and $last_latitude==0 and $last_longitude==0){
$sql = mysql_query("update gcm set last_latitude=$user_latitude,last_longitude=$user_longitude where user_id=$user_id limit 1");
}
print("ok");
}
else{
print("reg");
}
if ($mon>0){
$sql = mysql_query("insert into monitoring (user_id,monitoring_time,date,last_update) values ($user_id,$mon,date_sub(now(),interval $mon minute),now()) on duplicate key update monitoring_time=monitoring_time+$mon,last_update=now()");
}
mysql_close();
}
else{
print("ok");
}
?>