Add support for vdlm2dec
[FlightAirMap.git] / scripts / daemon-spotter.php
blob2acb69ac38562b8d8789b95a72ead55c0005aa40
1 #!/usr/bin/php
2 <?php
3 /**
4 * This script is used to retrieve message from SBS source like Dump1090, Radarcape,.. or from phpvms, wazzup files,AIS, APRS,...
5 * This script can be used as cron job with $globalDaemon = FALSE
6 */
8 require_once(dirname(__FILE__).'/../require/class.SpotterImport.php');
9 require_once(dirname(__FILE__).'/../require/class.SpotterServer.php');
10 //require_once(dirname(__FILE__).'/../require/class.APRS.php');
11 require_once(dirname(__FILE__).'/../require/class.ATC.php');
12 require_once(dirname(__FILE__).'/../require/class.ACARS.php');
13 require_once(dirname(__FILE__).'/../require/class.SBS.php');
14 require_once(dirname(__FILE__).'/../require/class.Source.php');
15 require_once(dirname(__FILE__).'/../require/class.Connection.php');
16 require_once(dirname(__FILE__).'/../require/class.Common.php');
17 if (isset($globalTracker) && $globalTracker) {
18 require_once(dirname(__FILE__).'/../require/class.TrackerImport.php');
20 if (isset($globalMarine) && $globalMarine) {
21 require_once(dirname(__FILE__).'/../require/class.AIS.php');
22 require_once(dirname(__FILE__).'/../require/class.MarineImport.php');
25 if (!isset($globalDebug)) $globalDebug = FALSE;
27 if ($globalInstalled === FALSE) {
28 echo "This script MUST be run after install script. Use your web browser to run install/index.php";
29 sleep(5);
30 die();
34 // Check if schema is at latest version
35 $Connection = new Connection();
36 if ($Connection->connectionExists() === false) {
37 echo "Can't connect to your database. Check DB is running, user/password and database logs.";
38 exit();
40 if ($Connection->latest() === false) {
41 echo "You MUST update to latest schema. Use your web browser to run install/index.php";
42 exit();
44 if (PHP_SAPI != 'cli') {
45 echo "This script MUST be called from console, not a web browser.";
46 // exit();
49 // This is to be compatible with old version of settings.php
50 if (!isset($globalSources)) {
51 if (isset($globalSBS1Hosts)) {
52 //$hosts = $globalSBS1Hosts;
53 foreach ($globalSBS1Hosts as $host) {
54 $globalSources[] = array('host' => $host);
56 } else {
57 if (!isset($globalSBS1Host)) {
58 echo '$globalSources MUST be defined !';
59 die;
61 //$hosts = array($globalSBS1Host.':'.$globalSBS1Port);
62 $globalSources[] = array('host' => $globalSBS1Host,'port' => $globalSBS1Port);
66 $options = getopt('s::',array('source::','server','nodaemon','idsource::','aprsserverssid::','aprsserverpass::','aprsserverhost::','aprsserverport::','format::','noaprsserver','enable-aircraft','disable-aircraft','enable-tracker','disable-tracker','enable-marine','disable-marine'));
67 //if (isset($options['s'])) $hosts = array($options['s']);
68 //elseif (isset($options['source'])) $hosts = array($options['source']);
69 if (isset($options['s'])) {
70 $globalSources = array();
71 if (isset($options['format'])) $globalSources[] = array('host' => $options['s'],'format' => $options['format']);
72 else $globalSources[] = array('host' => $options['s']);
73 } elseif (isset($options['source'])) {
74 $globalSources = array();
75 if (isset($options['format'])) $globalSources[] = array('host' => $options['source'],'format' => $options['format']);
76 else $globalSources[] = array('host' => $options['source']);
78 if (isset($options['aprsserverhost'])) {
79 $globalServerAPRS = TRUE;
80 $globalServerAPRShost = $options['aprsserverhost'];
82 if (isset($options['aprsserverport'])) $globalServerAPRSport = $options['aprsserverport'];
83 if (isset($options['aprsserverssid'])) $globalServerAPRSssid = $options['aprsserverssid'];
84 if (isset($options['aprsserverpass'])) $globalServerAPRSpass = $options['aprsserverpass'];
85 if (isset($options['noaprsserver'])) $globalServerAPRS = FALSE;
86 if (isset($options['enable-aircraft'])) {
87 if ($globalDebug) echo 'Enable Aircraft mode'."\n";
88 $globalAircraft = TRUE;
90 if (isset($options['disable-aircraft'])) {
91 if ($globalDebug) echo 'Disable Aircraft mode'."\n";
92 $globalAircraft = FALSE;
94 if (isset($options['enable-tracker'])) {
95 if ($globalDebug) echo 'Enable Tracker mode'."\n";
96 $globalTracker = TRUE;
98 if (isset($options['disable-tracker'])) {
99 if ($globalDebug) echo 'Disable Tracker mode'."\n";
100 $globalTracker = FALSE;
102 if (isset($options['enable-marine'])) {
103 if ($globalDebug) echo 'Enable Marine mode'."\n";
104 $globalMarine = TRUE;
106 if (isset($options['disable-marine'])) {
107 if ($globalDebug) echo 'Disable Marine mode'."\n";
108 $globalMarine = FALSE;
110 if (isset($options['nodaemon'])) $globalDaemon = FALSE;
111 if (isset($options['server'])) $globalServer = TRUE;
112 if (isset($options['idsource'])) $id_source = $options['idsource'];
113 else $id_source = 1;
114 if (isset($globalServer) && $globalServer) {
115 if ($globalDebug) echo "Using Server Mode\n";
116 $SI=new SpotterServer();
118 require_once(dirname(__FILE__).'/../require/class.APRS.php');
119 $SI = new adsb2aprs();
120 $SI->connect();
122 } else $SI=new SpotterImport($Connection->db);
124 if (isset($globalTracker) && $globalTracker) require_once(dirname(__FILE__).'/../require/class.TrackerImport.php');
125 if (isset($globalMarine) && $globalMarine) {
126 require_once(dirname(__FILE__).'/../require/class.AIS.php');
127 require_once(dirname(__FILE__).'/../require/class.MarineImport.php');
130 if (isset($globalTracker) && $globalTracker) $TI = new TrackerImport($Connection->db);
131 if (isset($globalMarine) && $globalMarine) {
132 $AIS = new AIS();
133 $MI = new MarineImport($Connection->db);
135 //$APRS=new APRS($Connection->db);
136 $SBS=new SBS();
137 if (!isset($globalNoDB) || $globalNoDB !== TRUE) {
138 $ACARS=new ACARS($Connection->db,true);
139 $Source=new Source($Connection->db);
141 $Common=new Common();
142 date_default_timezone_set('UTC');
143 //$servertz = system('date +%Z');
144 // signal handler - playing nice with sockets and dump1090
145 if (function_exists('pcntl_fork')) {
146 pcntl_signal(SIGINT, function() {
147 global $sockets;
148 echo "\n\nctrl-c or kill signal received. Tidying up ... ";
149 die("Bye!\n");
151 pcntl_signal_dispatch();
154 // let's try and connect
155 if ($globalDebug) echo "Connecting...\n";
156 $use_aprs = false;
157 $aprs_full = false;
158 $reset = 0;
160 function connect_all($hosts) {
161 //global $sockets, $formats, $globalDebug,$aprs_connect,$last_exec, $globalSourcesRights, $use_aprs;
162 global $sockets,$httpfeeds, $globalSources, $globalDebug,$aprs_connect,$last_exec, $globalSourcesRights, $use_aprs, $reset,$context;
163 $reset++;
164 if ($globalDebug) echo 'Connect to all...'."\n";
165 foreach ($hosts as $id => $value) {
166 $host = $value['host'];
167 $globalSources[$id]['last_exec'] = 0;
168 // Here we check type of source(s)
169 if (filter_var($host,FILTER_VALIDATE_URL) && (!isset($globalSources[$id]['format']) || strtolower($globalSources[$id]['format']) == 'auto')) {
170 if (preg_match('/deltadb.txt$/i',$host)) {
171 //$formats[$id] = 'deltadbtxt';
172 $globalSources[$id]['format'] = 'deltadbtxt';
173 //$last_exec['deltadbtxt'] = 0;
174 if ($globalDebug) echo "Connect to deltadb source (".$host.")...\n";
175 } else if (preg_match('/vatsim-data.txt$/i',$host)) {
176 //$formats[$id] = 'vatsimtxt';
177 $globalSources[$id]['format'] = 'vatsimtxt';
178 //$last_exec['vatsimtxt'] = 0;
179 if ($globalDebug) echo "Connect to vatsim source (".$host.")...\n";
180 } else if (preg_match('/aircraftlist.json$/i',$host)) {
181 //$formats[$id] = 'aircraftlistjson';
182 $globalSources[$id]['format'] = 'aircraftlistjson';
183 //$last_exec['aircraftlistjson'] = 0;
184 if ($globalDebug) echo "Connect to aircraftlist.json source (".$host.")...\n";
185 } else if (preg_match('/aircraft.json$/i',$host)) {
186 //$formats[$id] = 'aircraftjson';
187 $globalSources[$id]['format'] = 'aircraftjson';
188 //$last_exec['aircraftlistjson'] = 0;
189 if ($globalDebug) echo "Connect to aircraft.json source (".$host.")...\n";
190 } else if (preg_match('/aircraft$/i',$host)) {
191 //$formats[$id] = 'planefinderclient';
192 $globalSources[$id]['format'] = 'planefinderclient';
193 //$last_exec['aircraftlistjson'] = 0;
194 if ($globalDebug) echo "Connect to planefinderclient source (".$host.")...\n";
195 } else if (preg_match('/opensky/i',$host)) {
196 //$formats[$id] = 'aircraftlistjson';
197 $globalSources[$id]['format'] = 'opensky';
198 //$last_exec['aircraftlistjson'] = 0;
199 if ($globalDebug) echo "Connect to opensky source (".$host.")...\n";
201 // Disabled for now, site change source format
202 } else if (preg_match('/radarvirtuel.com\/list_aircrafts$/i',$host)) {
203 //$formats[$id] = 'radarvirtueljson';
204 $globalSources[$id]['format'] = 'radarvirtueljson';
205 //$last_exec['radarvirtueljson'] = 0;
206 if ($globalDebug) echo "Connect to radarvirtuel.com/file.json source (".$host.")...\n";
207 if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
208 echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
209 exit(0);
212 } else if (preg_match('/planeUpdateFAA.php$/i',$host)) {
213 //$formats[$id] = 'planeupdatefaa';
214 $globalSources[$id]['format'] = 'planeupdatefaa';
215 //$last_exec['planeupdatefaa'] = 0;
216 if ($globalDebug) echo "Connect to planeUpdateFAA.php source (".$host.")...\n";
217 if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
218 echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
219 exit(0);
221 } else if (preg_match('/\/action.php\/acars\/data$/i',$host)) {
222 //$formats[$id] = 'phpvmacars';
223 $globalSources[$id]['format'] = 'phpvmacars';
224 //$last_exec['phpvmacars'] = 0;
225 if ($globalDebug) echo "Connect to phpvmacars source (".$host.")...\n";
226 } else if (preg_match('/\/api\/v1\/acars\/data$/i',$host)) {
227 //$formats[$id] = 'phpvmacars';
228 $globalSources[$id]['format'] = 'vaos';
229 //$last_exec['phpvmacars'] = 0;
230 if ($globalDebug) echo "Connect to vaos source (".$host.")...\n";
231 } else if (preg_match('/VAM-json.php$/i',$host)) {
232 //$formats[$id] = 'phpvmacars';
233 $globalSources[$id]['format'] = 'vam';
234 if ($globalDebug) echo "Connect to Vam source (".$host.")...\n";
235 } else if (preg_match('/whazzup/i',$host)) {
236 //$formats[$id] = 'whazzup';
237 $globalSources[$id]['format'] = 'whazzup';
238 //$last_exec['whazzup'] = 0;
239 if ($globalDebug) echo "Connect to whazzup source (".$host.")...\n";
240 } else if (preg_match('/blitzortung/i',$host)) {
241 $globalSources[$id]['format'] = 'blitzortung';
242 if ($globalDebug) echo "Connect to blitzortung source (".$host.")...\n";
243 } else if (preg_match('/airwhere/i',$host)) {
244 $globalSources[$id]['format'] = 'airwhere';
245 if ($globalDebug) echo "Connect to airwhere source (".$host.")...\n";
246 } else if (preg_match('/recentpireps/i',$host)) {
247 //$formats[$id] = 'pirepsjson';
248 $globalSources[$id]['format'] = 'pirepsjson';
249 //$last_exec['pirepsjson'] = 0;
250 if ($globalDebug) echo "Connect to pirepsjson source (".$host.")...\n";
251 } else if (preg_match(':data.fr24.com/zones/fcgi/feed.js:i',$host)) {
252 //$formats[$id] = 'fr24json';
253 $globalSources[$id]['format'] = 'fr24json';
254 //$last_exec['fr24json'] = 0;
255 if ($globalDebug) echo "Connect to fr24 source (".$host.")...\n";
256 if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
257 echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
258 exit(0);
260 } else if (preg_match(':myshiptracking.com/:i',$host)) {
261 //$formats[$id] = 'fr24json';
262 $globalSources[$id]['format'] = 'myshiptracking';
263 //$last_exec['fr24json'] = 0;
264 if ($globalDebug) echo "Connect to myshiptracking source (".$host.")...\n";
265 if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
266 echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
267 exit(0);
269 //} else if (preg_match('/10001/',$host)) {
270 } else if (preg_match('/10001/',$host) || (isset($globalSources[$id]['port']) && $globalSources[$id]['port'] == '10001')) {
271 //$formats[$id] = 'tsv';
272 $globalSources[$id]['format'] = 'tsv';
273 if ($globalDebug) echo "Connect to tsv source (".$host.")...\n";
275 } elseif (filter_var($host,FILTER_VALIDATE_URL) || (isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'sailaway') || (isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'acarsjson')) {
276 if ($globalSources[$id]['format'] == 'aisnmeahttp' || $globalSources[$id]['format'] == 'acarsjson') {
277 $idf = fopen($globalSources[$id]['host'],'r',false,$context);
278 if ($idf !== false) {
279 $httpfeeds[$id] = $idf;
280 if ($globalDebug) echo "Connected to ".$globalSources[$id]['format']." source (".$host.")...\n";
281 } elseif ($globalDebug) echo "Can't connect to ".$globalSources[$id]['host']."\n";
282 } elseif ($globalDebug && isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'sailaway') echo "Connect to ".$globalSources[$id]['format']." source (sailaway)...\n";
283 elseif ($globalDebug) echo "Connect to ".$globalSources[$id]['format']." source (".$host.")...\n";
284 } elseif (!filter_var($host,FILTER_VALIDATE_URL)) {
285 $hostport = explode(':',$host);
286 if (isset($hostport[1])) {
287 $port = $hostport[1];
288 $hostn = $hostport[0];
289 } else {
290 $port = $globalSources[$id]['port'];
291 $hostn = $globalSources[$id]['host'];
293 $Common = new Common();
294 if (!isset($globalSources[$id]['format']) || ($globalSources[$id]['format'] != 'acars' && $globalSources[$id]['format'] != 'flightgearsp')) {
295 $s = $Common->create_socket($hostn,$port, $errno, $errstr);
296 } else {
297 $s = $Common->create_socket_udp($hostn,$port, $errno, $errstr);
299 if ($s) {
300 $sockets[$id] = $s;
301 if (!isset($globalSources[$id]['format']) || strtolower($globalSources[$id]['format']) == 'auto') {
302 if (preg_match('/aprs/',$hostn) || $port == '10152' || $port == '14580') {
303 //$formats[$id] = 'aprs';
304 $globalSources[$id]['format'] = 'aprs';
305 //$aprs_connect = 0;
306 //$use_aprs = true;
307 } elseif (preg_match('/pub-vrs/',$hostn) || $port == '32001' || $port == '32005' || $port == '32010' || $port == '32015' || $port == '32030') {
308 $globalSources[$id]['format'] = 'vrstcp';
309 } elseif ($port == '10001') {
310 //$formats[$id] = 'tsv';
311 $globalSources[$id]['format'] = 'tsv';
312 } elseif ($port == '30002') {
313 //$formats[$id] = 'raw';
314 $globalSources[$id]['format'] = 'raw';
315 } elseif ($port == '5001') {
316 //$formats[$id] = 'raw';
317 $globalSources[$id]['format'] = 'flightgearmp';
318 } elseif ($port == '30005') {
319 // Not yet supported
320 //$formats[$id] = 'beast';
321 $globalSources[$id]['format'] = 'beast';
322 //} else $formats[$id] = 'sbs';
323 } else $globalSources[$id]['format'] = 'sbs';
324 //if ($globalDebug) echo 'Connection in progress to '.$host.'('.$formats[$id].')....'."\n";
326 if ($globalDebug) echo 'Connection in progress to '.$hostn.':'.$port.' ('.$globalSources[$id]['format'].')....'."\n";
327 } else {
328 if ($globalDebug) echo 'Connection failed to '.$hostn.':'.$port.' : '.$errno.' '.$errstr."\n";
329 sleep(10);
330 connect_all($hosts);
335 if (!isset($globalMinFetch)) $globalMinFetch = 15;
337 // Initialize all
338 $status = array();
339 $sockets = array();
340 $httpfeeds = array();
341 $formats = array();
342 $last_exec = array();
343 $time = time();
344 if (isset($globalSourcesTimeout)) $timeout = $globalSourcesTimeOut;
345 else if (isset($globalSBS1TimeOut)) $timeout = $globalSBS1TimeOut;
346 else $timeout = 20;
347 $errno = '';
348 $errstr='';
350 if (!isset($globalDaemon)) $globalDaemon = TRUE;
351 /* Initiate connections to all the hosts simultaneously */
352 //connect_all($hosts);
353 //connect_all($globalSources);
355 if (isset($globalProxy) && $globalProxy) {
356 $context = stream_context_create(array('http' => array('timeout' => $timeout,'proxy' => $globalProxy,'request_fulluri' => true)));
357 } else {
358 $context = stream_context_create(array('http' => array('timeout' => $timeout)));
361 // APRS Configuration
362 if (!is_array($globalSources)) {
363 echo '$globalSources in require/settings.php MUST be an array';
364 die;
366 foreach ($globalSources as $key => $source) {
367 if (!isset($source['format'])) {
368 $globalSources[$key]['format'] = 'auto';
370 if (isset($source['callback']) && $source['callback'] === TRUE) {
371 unset($globalSources[$key]);
374 connect_all($globalSources);
375 foreach ($globalSources as $key => $source) {
376 if (isset($source['format']) && $source['format'] == 'aprs') {
377 $aprs_connect = 0;
378 $use_aprs = true;
379 if (isset($source['port']) && $source['port'] == '10152') $aprs_full = true;
380 break;
384 if ($use_aprs) {
385 require_once(dirname(__FILE__).'/../require/class.APRS.php');
386 $APRS=new APRS();
387 $aprs_connect = 0;
388 $aprs_keep = 120;
389 $aprs_last_tx = time();
390 if (isset($globalAPRSversion)) $aprs_version = $globalAPRSversion;
391 else $aprs_version = 'FlightAirMap '.str_replace(' ','_',$globalName);
392 if (isset($globalAPRSssid)) $aprs_ssid = $globalAPRSssid;
393 else $aprs_ssid = substr('FAM'.strtoupper(str_replace(' ','_',$globalName)),0,8);
394 if (isset($globalAPRSfilter)) $aprs_filter = $globalAPRSfilter;
395 else $aprs_filter = 'r/'.$globalCenterLatitude.'/'.$globalCenterLongitude.'/250.0';
396 if ($aprs_full) $aprs_filter = '';
397 if (isset($globalAPRSpass)) $aprs_pass = $globalAPRSpass;
398 else $aprs_pass = '-1';
400 if ($aprs_filter != '') $aprs_login = "user {$aprs_ssid} pass {$aprs_pass} vers {$aprs_version} filter {$aprs_filter}\n";
401 else $aprs_login = "user {$aprs_ssid} pass {$aprs_pass} vers {$aprs_version}\n";
404 // connected - lets do some work
405 //if ($globalDebug) echo "Connected!\n";
406 sleep(1);
407 if ($globalDebug) echo "SCAN MODE \n\n";
408 if (!isset($globalCronEnd)) $globalCronEnd = 60;
409 $endtime = time()+$globalCronEnd;
410 $i = 1;
411 $tt = array();
412 // Delete all ATC
413 if ((isset($globalVA) && $globalVA) || (isset($globalIVAO) && $globalIVAO) || (isset($globalVATSIM) && $globalVATSIM)) {
414 $ATC=new ATC($Connection->db);
416 if (!$globalDaemon && ((isset($globalVA) && $globalVA) || (isset($globalIVAO) && $globalIVAO) || (isset($globalVATSIM) && $globalVATSIM))) {
417 $ATC->deleteAll();
420 // Infinite loop if daemon, else work for time defined in $globalCronEnd or only one time.
421 while ($i > 0) {
422 if (function_exists('pcntl_fork')) pcntl_signal_dispatch();
424 if (!$globalDaemon) $i = $endtime-time();
425 // Delete old ATC
426 if ($globalDaemon && ((isset($globalVA) && $globalVA) || (isset($globalIVAO) && $globalIVAO) || (isset($globalVATSIM) && $globalVATSIM))) {
427 if ($globalDebug) echo 'Delete old ATC...'."\n";
428 $ATC->deleteOldATC();
431 if (count($last_exec) == count($globalSources)) {
432 $max = $globalMinFetch;
433 foreach ($last_exec as $last) {
434 if ((time() - $last['last']) < $max) $max = time() - $last['last'];
436 if ($max < $globalMinFetch) {
437 if ($globalDebug) echo 'Sleeping...'."\n";
438 sleep($globalMinFetch-$max+2);
443 //foreach ($formats as $id => $value) {
444 foreach ($globalSources as $id => $value) {
445 date_default_timezone_set('UTC');
446 //if ($globalDebug) echo 'Source host : '.$value['host'].' - Source format: '.$value['format']."\n";
447 if (!isset($last_exec[$id]['last'])) $last_exec[$id]['last'] = 0;
448 if ($value['format'] === 'deltadbtxt' &&
450 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
451 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
454 //$buffer = $Common->getData($hosts[$id]);
455 $buffer = $Common->getData($value['host']);
456 if ($buffer != '') $reset = 0;
457 $buffer = trim(str_replace(array("\r\n", "\r", "\n", "\\r", "\\n", "\\r\\n"), '\n', $buffer));
458 $buffer = explode('\n', $buffer);
459 foreach ($buffer as $line) {
460 if ($line != '' && count($line) > 7) {
461 $line = explode(',', $line);
462 $data = array();
463 $data['hex'] = $line[1]; // hex
464 $data['ident'] = $line[2]; // ident
465 if (isset($line[3])) $data['altitude'] = $line[3]; // altitude
466 if (isset($line[4])) $data['speed'] = $line[4]; // speed
467 if (isset($line[5])) $data['heading'] = $line[5]; // heading
468 if (isset($line[6])) $data['latitude'] = $line[6]; // lat
469 if (isset($line[7])) $data['longitude'] = $line[7]; // long
470 $data['verticalrate'] = ''; // vertical rate
471 //if (isset($line[9])) $data['squawk'] = $line[9]; // squawk
472 $data['emergency'] = ''; // emergency
473 $data['datetime'] = date('Y-m-d H:i:s');
474 $data['format_source'] = 'deltadbtxt';
475 $data['id_source'] = $id_source;
476 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
477 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
478 if (isset($value['sourcestats'])) $data['sourcestats'] = $value['sourcestats'];
479 $SI->add($data);
480 unset($data);
483 $last_exec[$id]['last'] = time();
484 } elseif ($value['format'] === 'radarcapejson' &&
486 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
487 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
490 //$buffer = $Common->getData($hosts[$id]);
491 $buffer = $Common->getData($value['host']);
492 if ($buffer != '') {
493 $all_data = json_decode($buffer,true);
494 foreach ($all_data as $line) {
495 $data = array();
496 $data['datetime'] = date('Y-m-d H:i:s',$line['uti']);
497 $data['hex'] = $line['hex']; // hex
498 $data['ident'] = $line['fli']; // ident
499 $data['altitude'] = $line['alt']; // altitude
500 $data['speed'] = $line['spd']; // speed
501 $data['heading'] = $line['trk']; // heading
502 $data['latitude'] = $line['lat']; // lat
503 $data['longitude'] = $line['lon']; // long
504 $data['verticalrate'] = $line['vrt']; // vertical rate
505 $data['squawk'] = $line['squ']; // squawk
506 $data['ground'] = $line['gda']; // ground
507 $data['registration'] = $line['reg'];
508 //$data['emergency'] = ''; // emergency
509 $data['datetime'] = date('Y-m-d H:i:s');
510 $data['format_source'] = 'radarcapejson';
511 $data['id_source'] = $id_source;
512 if (isset($value['name']) && $value['name'] != '') {
513 if (isset($line['src']) && !$line['src'] == 'M') $data['source_name'] = $value['name'].'_MLAT';
514 else $data['source_name'] = $value['name'];
515 } elseif (isset($line['src']) && $line['src'] == 'M') $data['source_name'] = 'MLAT';
516 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
517 if (isset($value['sourcestats'])) $data['sourcestats'] = $value['sourcestats'];
519 $SI->add($data);
520 unset($data);
523 $last_exec[$id]['last'] = time();
524 } elseif ($value['format'] === 'aisnmeatxt' &&
526 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
527 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
530 date_default_timezone_set('CET');
531 $buffer = $Common->getData(str_replace('{date}',date('Ymd'),$value['host']));
532 date_default_timezone_set('UTC');
533 if ($buffer != '') $reset = 0;
534 $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
535 $buffer = explode('\n',$buffer);
536 foreach ($buffer as $line) {
537 if ($line != '') {
538 //echo "'".$line."'\n";
539 $add = false;
540 $ais_data = $AIS->parse_line(trim($line));
541 $data = array();
542 if (isset($ais_data['ident'])) $data['ident'] = $ais_data['ident'];
543 if (isset($ais_data['mmsi'])) $data['mmsi'] = substr($ais_data['mmsi'],-9);
544 if (isset($ais_data['speed'])) $data['speed'] = $ais_data['speed'];
545 if (isset($ais_data['heading'])) $data['heading'] = $ais_data['heading'];
546 if (isset($ais_data['latitude'])) $data['latitude'] = $ais_data['latitude'];
547 if (isset($ais_data['longitude'])) $data['longitude'] = $ais_data['longitude'];
548 if (isset($ais_data['status'])) $data['status'] = $ais_data['status'];
549 if (isset($ais_data['statusid'])) $data['status_id'] = $ais_data['statusid'];
550 if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
551 if (isset($ais_data['typeid'])) $data['type_id'] = $ais_data['typeid'];
552 if (isset($ais_data['imo'])) $data['imo'] = $ais_data['imo'];
553 if (isset($ais_data['callsign'])) $data['callsign'] = $ais_data['callsign'];
554 if (isset($ais_data['timestamp'])) {
555 $data['datetime'] = date('Y-m-d H:i:s',$ais_data['timestamp']);
556 if (!isset($last_exec[$id]['timestamp']) || $ais_data['timestamp'] >= $last_exec[$id]['timestamp']) {
557 $last_exec[$id]['timestamp'] = $ais_data['timestamp'];
558 $add = true;
560 } else {
561 $data['datetime'] = date('Y-m-d H:i:s');
562 $add = true;
564 $data['format_source'] = 'aisnmeatxt';
565 $data['id_source'] = $id_source;
566 //print_r($data);
567 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
568 if ($add && isset($ais_data['mmsi_type']) && $ais_data['mmsi_type'] === 'Ship') $MI->add($data);
569 unset($data);
572 $last_exec[$id]['last'] = time();
573 } elseif ($value['format'] === 'aisnmeahttp') {
574 $arr = $httpfeeds;
575 $w = $e = null;
577 if (isset($arr[$id])) {
578 $nn = stream_select($arr,$w,$e,$timeout);
579 if ($nn > 0) {
580 foreach ($httpfeeds as $feed) {
581 $buffer = stream_get_line($feed,2000,"\n");
582 if ($buffer === FALSE) {
583 connect_all($globalSources);
585 $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
586 $buffer = explode('\n',$buffer);
587 foreach ($buffer as $line) {
588 if ($line != '') {
589 $ais_data = $AIS->parse_line(trim($line));
590 $data = array();
591 if (isset($ais_data['ident'])) $data['ident'] = $ais_data['ident'];
592 if (isset($ais_data['mmsi'])) $data['mmsi'] = substr($ais_data['mmsi'],-9);
593 if (isset($ais_data['speed'])) $data['speed'] = $ais_data['speed'];
594 if (isset($ais_data['heading'])) $data['heading'] = $ais_data['heading'];
595 if (isset($ais_data['latitude'])) $data['latitude'] = $ais_data['latitude'];
596 if (isset($ais_data['longitude'])) $data['longitude'] = $ais_data['longitude'];
597 if (isset($ais_data['status'])) $data['status'] = $ais_data['status'];
598 if (isset($ais_data['statusid'])) $data['status_id'] = $ais_data['statusid'];
599 if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
600 if (isset($ais_data['typeid'])) $data['type_id'] = $ais_data['typeid'];
601 if (isset($ais_data['imo'])) $data['imo'] = $ais_data['imo'];
602 if (isset($ais_data['callsign'])) $data['callsign'] = $ais_data['callsign'];
603 if (isset($ais_data['destination'])) $data['arrival_code'] = $ais_data['destination'];
604 if (isset($ais_data['eta_ts'])) $data['arrival_date'] = date('Y-m-d H:i:s',$ais_data['eta_ts']);
605 if (isset($ais_data['timestamp'])) {
606 $data['datetime'] = date('Y-m-d H:i:s',$ais_data['timestamp']);
607 } else {
608 $data['datetime'] = date('Y-m-d H:i:s');
610 $data['format_source'] = 'aisnmeahttp';
611 $data['id_source'] = $id_source;
612 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
613 if (isset($ais_data['mmsi_type']) && $ais_data['mmsi_type'] === 'Ship') $MI->add($data);
614 unset($data);
618 } else {
619 $format = $value['format'];
620 if (isset($tt[$format])) $tt[$format]++;
621 else $tt[$format] = 0;
622 if ($tt[$format] > 30) {
623 if ($globalDebug) echo 'Reconnect...'."\n";
624 sleep(2);
625 //$sourceeen[] = $value;
626 //connect_all($sourceeen);
627 //$sourceeen = array();
628 connect_all($globalSources);
632 } elseif ($value['format'] === 'myshiptracking' &&
634 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
635 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
638 $buffer = $Common->getData($value['host'],'get','','','','','20');
639 if ($buffer != '') {
640 //echo $buffer;
641 $all_data = json_decode($buffer,true);
642 //print_r($all_data);
643 if (isset($all_data[0]['DATA'])) {
644 foreach ($all_data[0]['DATA'] as $line) {
645 if ($line != '') {
646 $data = array();
647 $data['ident'] = $line['NAME'];
648 $data['mmsi'] = $line['MMSI'];
649 if (strlen($data['mmsi']) > 9) {
650 $data['mmsi'] = substr($data['mmsi'],-9);
652 $data['speed'] = $line['SOG'];
653 $data['heading'] = $line['COG'];
654 $data['latitude'] = $line['LAT'];
655 $data['longitude'] = $line['LNG'];
656 // if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
657 //$data['type_id'] = $line['TYPE'];
658 $data['imo'] = $line['IMO'];
659 if ($line['DEST'] != '') $data['arrival_code'] = $line['DEST'];
660 if ($line['ARV'] != '') $data['arrival_time'] = date('Y-m-d H:i:s',strtotime($line['ARV']));
661 $data['datetime'] = date('Y-m-d H:i:s',$line['T']);
662 $data['format_source'] = 'myshiptracking';
663 $data['id_source'] = $id_source;
664 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
665 $MI->add($data);
666 unset($data);
671 $last_exec[$id]['last'] = time();
672 } elseif ($value['format'] === 'boatbeaconapp' &&
674 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
675 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
678 $buffer = $Common->getData(str_replace('{timestamp}',time(),$value['host']));
679 if ($buffer != '') {
680 $all_data = json_decode($buffer,true);
681 if (isset($all_data[0]['mmsi'])) {
682 foreach ($all_data as $line) {
683 if ($line != '') {
684 $data = array();
685 $data['ident'] = $line['shipname'];
686 $data['callsign'] = $line['callsign'];
687 $data['mmsi'] = substr($line['mmsi'],-9);
688 $data['speed'] = $line['sog'];
689 if ($line['heading'] != '511') $data['heading'] = $line['heading'];
690 $data['latitude'] = $line['latitude'];
691 $data['longitude'] = $line['longitude'];
692 $data['type_id'] = $line['shiptype'];
693 $data['arrival_code'] = $line['destination'];
694 $data['datetime'] = $line['time'];
695 $data['format_source'] = 'boatbeaconapp';
696 $data['id_source'] = $id_source;
697 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
698 $MI->add($data);
699 unset($data);
705 $last_exec[$id]['last'] = time();
706 } elseif ($value['format'] === 'boatnerd' &&
708 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
709 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
712 $buffer = $Common->getData($value['host']);
713 if ($buffer != '') {
714 $all_data = json_decode($buffer,true);
715 if (isset($all_data['features'][0]['id'])) {
716 foreach ($all_data['features'] as $line) {
717 print_r($line);
718 $data = array();
719 if (isset($line['properties']['name'])) $data['ident'] = $line['properties']['name'];
720 if (isset($line['properties']['callsign'])) $data['callsign'] = $line['properties']['callsign'];
721 if (isset($line['properties']['mmsi'])) $data['mmsi'] = substr($line['properties']['mmsi'],-9);
722 if (isset($line['properties']['imo'])) $data['imo'] = $line['properties']['imo'];
723 if (isset($line['properties']['speed'])) $data['speed'] = $line['properties']['speed'];
724 if (isset($line['properties']['heading']) && $line['properties']['heading'] != 0) $data['heading'] = $line['properties']['heading'];
725 $data['latitude'] = $line['geometry']['coordinates'][1];
726 $data['longitude'] = $line['geometry']['coordinates'][0];
727 if (isset($line['properties']['vesselType'])) $data['type'] = $line['properties']['vesselType'];
728 if (isset($line['properties']['destination'])) $data['arrival_code'] = $line['properties']['destination'];
729 if (isset($line['properties']['eta']) && $line['properties']['eta'] != '') $data['arrival_date'] = $line['properties']['eta'];
730 $data['format_source'] = 'boatnerd';
731 $data['id_source'] = $id_source;
732 $data['datetime'] = date('Y-m-d H:i:s');
733 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
734 if ($line['properties']['vesselType'] != 'Navigation Aid') $MI->add($data);
735 unset($data);
740 $last_exec[$id]['last'] = time();
741 } elseif ($value['format'] === 'shipplotter' &&
743 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
744 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
747 if ($globalDebug) echo 'download...';
748 $buffer = $Common->getData($value['host'],'post',$value['post'],'','','','','ShipPlotter');
749 if ($globalDebug) echo 'done !'."\n";
750 // FIXME: Need more work
751 if ($buffer != '') $reset = 0;
752 $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
753 $buffer = explode('\n',$buffer);
754 foreach ($buffer as $line) {
755 if ($line != '') {
756 $data = array();
757 //echo $line."\n";
758 $data['mmsi'] = (int)substr($line,0,9);
759 $data['datetime'] = date('Y-m-d H:i:s',substr($line,10,10));
760 $data['status_id'] = substr($line,21,2);
761 $data['type_id'] = substr($line,24,3);
762 $data['latitude'] = substr($line,29,9);
763 $data['longitude'] = substr($line,41,9);
764 $data['speed'] = round(substr($line,51,5));
765 //$data['course'] = substr($line,57,5);
766 $data['heading'] = round(substr($line,63,3));
767 //$data['draft'] = substr($line,67,4);
768 //$data['length'] = substr($line,72,3);
769 //$data['beam'] = substr($line,76,2);
770 $data['ident'] = trim(utf8_encode(substr($line,78,20)));
771 //$data['callsign'] = trim(substr($line,100,7);
772 $data['arrival_code'] = substr($line,108,20);
773 //$data['etaDate'] = substr($line,129,5);
774 //$data['etaTime'] = substr($line,135,5);
775 $data['format_source'] = 'shipplotter';
776 $data['id_source'] = $id_source;
777 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
778 //print_r($data);
779 //echo 'Add...'."\n";
780 $MI->add($data);
781 unset($data);
784 $last_exec[$id]['last'] = time();
785 } elseif ($value['format'] === 'sailaway' &&
787 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
788 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
791 if (isset($globalSailaway['email']) && $globalSailaway['email'] != '' && isset($globalSailaway['password']) && $globalSailaway['password'] != '') {
792 $authsailaway = $Common->getData('https://sailaway.world/cgi-bin/sailaway/weblogin.pl','post',array('submitlogin' => 'Login','email' => $globalSailaway['email'],'pwd' => $globalSailaway['password'], 'page' => 'http://sailaway.world/cgi-bin/sailaway/missions.pl'),'','','','','',false,false,true);
793 //echo $authsailaway;
794 preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $authsailaway, $setcookie);
795 if (isset($setcookie[1][0])) {
796 $sailaway_authcookie = $setcookie[1][0];
800 if ($globalDebug) echo '! Download... ';
801 for ($i =0; $i <= 1; $i++) {
802 if ($globalDebug) echo 'Racetype: '.$i.' ';
803 $buffer = $Common->getData('https://sailaway.world/cgi-bin/sailaway/GetMissions.pl?race=1&tutorial=0&hist=1&racetype='.$i);
804 if ($globalDebug) echo 'done'."\n";
805 if ($buffer != '') {
806 $all_data = json_decode($buffer,true);
807 if (isset($all_data['missions'])) {
808 foreach ($all_data['missions'] as $mission) {
809 $mission_user = $mission['usrname'];
810 $mission_name = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($mission['mistitle']));
811 if (!isset($globalFilter['sailway']['race']) || (isset($globalFilter['sailway']['race']) && in_array($mission['misnr'],$globalFilter['sailway']['race']))) {
812 if (isset($sailaway_authcookie) && $sailaway_authcookie != '') $racebuffer = $Common->getData('https://sailaway.world/cgi-bin/sailaway/GetMission.pl?misnr='.$mission['misnr'],'get','','',$sailaway_authcookie);
813 else $racebuffer = '';
814 $bufferm = $Common->getData('https://sailaway.world/cgi-bin/sailaway/GetLeaderboard.pl?misnr='.$mission['misnr']);
815 } else {
816 $bufferm = '';
817 $racebuffer = '';
819 if ($racebuffer != '') {
820 $race_data = json_decode($racebuffer,true);
821 //print_r($race_data);
822 unset($racebuffer);
823 if (isset($race_data['mission'])) {
824 $datar = array();
825 $datar['id'] = $mission['misnr'];
826 $datar['desc'] = $race_data['mission']['misdescr'];
827 $datar['creator'] = trim(preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($race_data['mission']['usrname'])));
828 $datar['name'] = trim(preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($race_data['mission']['mistitle'])));
829 $datar['startdate'] = $race_data['mission']['misstartdatetime'];
830 $markers = array();
831 foreach ($race_data['mission']['course'] as $course) {
832 $markers[] = array('lat' => $course['miclat'],'lon' => $course['miclon'],'name' => $course['micname'],'type' => $course['mictype']);
834 $datar['markers'] = json_encode($markers);
835 //print_r($datar);
836 $MI->race_add($datar);
839 if ($bufferm != '') {
840 $mission_data = json_decode($bufferm,true);
841 unset($bufferm);
842 if (isset($mission_data['leaderboard'][0]['results'])) {
843 foreach ($mission_data['leaderboard'][0]['results'] as $sail) {
844 //print_r($sail);
845 //print_r($bufferm);
846 //if ($sail['status'] == 'Racing') {
847 //print_r($sail);
848 $data = array();
849 //$data['mmsi'] = (int)substr($line,0,9);
850 //$data['id'] = $sail['misnr'].'-'.$sail['usrnr'].'-'.$sail['ubtnr'];
851 $data['id'] = $sail['misnr'].'-'.$sail['usrnr'];
852 $data['datetime'] = date('Y-m-d H:i:s');
853 $data['race_begin'] = date('Y-m-d H:i:s',strtotime($mission_data['leaderboard'][0]['misstart']));
854 $data['last_update'] = date('Y-m-d H:i:s');
855 $data['status'] = $sail['status'];
856 $data['type'] = $sail['btptype'];
857 $data['type_id'] = 36;
858 if (isset($sail['pos'])) {
859 $pos = $Common->convertDecLatLong($sail['pos']);
860 $data['latitude'] = $pos['latitude'];
861 $data['longitude'] = $pos['longitude'];
863 if ($sail['status'] == 'Racing' && $sail['resultdescr'] != '-') {
864 $resultdescr = explode(',',$sail['resultdescr']);
865 if (count($resultdescr) > 2) {
866 $data['speed'] = round(str_replace(array('Spd: ','kn.'),'',trim($resultdescr[2]))*1.852,2);
867 $data['heading'] = str_replace(array('Hdg: ','°'),'',trim($resultdescr[1]));
868 if (isset($resultdescr[3])) {
869 $data['distance'] = round(str_replace('nm.','',trim(explode(' ',$resultdescr[3])[1]))*1.852,3);
873 $data['ident'] = trim(preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($sail['ubtname'])));
874 $data['captain_id'] = $sail['usrnr'];
875 $data['captain_name'] = $sail['usrname'];
876 $data['race_id'] = $sail['misnr'];
877 if ($sail['rank'] != 'DNF') $data['race_rank'] = $sail['rank'];
878 $data['race_time'] = $sail['racetime'];
879 if ($mission_user != '') {
880 $data['race_name'] = $mission_name.' ('.$mission_user.')';
881 } else {
882 $data['race_name'] = $mission_name;
884 //$data['callsign'] = trim(substr($line,100,7);
885 $data['format_source'] = 'sailaway';
886 $data['id_source'] = $id_source;
887 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
888 //print_r($data);
889 //if ($data['race_id'] == '48') print_r($data);
890 //echo 'Add...'."\n";
891 $MI->add($data);
892 unset($data);
894 //} else echo $sail['status']."\n";
902 $last_exec[$id]['last'] = time();
903 //} elseif (($value === 'whazzup' && (time() - $last_exec['whazzup'] > $globalMinFetch)) || ($value === 'vatsimtxt' && (time() - $last_exec['vatsimtxt'] > $globalMinFetch))) {
904 } elseif (
906 $value['format'] === 'whazzup' &&
908 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
909 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
911 ) || (
912 $value['format'] === 'vatsimtxt' &&
914 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
915 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
919 //$buffer = $Common->getData($hosts[$id]);
920 $buffer = $Common->getData($value['host']);
921 $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
922 $buffer = explode('\n',$buffer);
923 $reset = 0;
924 foreach ($buffer as $line) {
925 if ($line != '') {
926 $line = explode(':', $line);
927 if (count($line) > 30 && $line[0] != 'callsign') {
928 $data = array();
929 if (isset($line[37]) && $line[37] != '') $data['id'] = $value['format'].'-'.$line[1].'-'.$line[0].'-'.$line[37];
930 else $data['id'] = $value['format'].'-'.$line[1].'-'.$line[0];
931 $data['pilot_id'] = $line[1];
932 $data['pilot_name'] = $line[2];
933 $data['hex'] = str_pad(dechex($Common->str2int($line[1])),6,'000000',STR_PAD_LEFT);
934 $data['ident'] = $line[0]; // ident
935 if ($line[7] != '' && $line[7] != 0) $data['altitude'] = $line[7]; // altitude
936 $data['speed'] = $line[8]; // speed
937 if (isset($line[45])) $data['heading'] = $line[45]; // heading
938 elseif (isset($line[38])) $data['heading'] = $line[38]; // heading
939 $data['latitude'] = $line[5]; // lat
940 $data['longitude'] = $line[6]; // long
941 $data['verticalrate'] = ''; // vertical rate
942 $data['squawk'] = ''; // squawk
943 $data['emergency'] = ''; // emergency
944 $data['waypoints'] = $line[30];
945 $data['datetime'] = date('Y-m-d H:i:s');
946 //$data['datetime'] = date('Y-m-d H:i:s',strtotime($line[37]));
947 //if (isset($line[37])) $data['last_update'] = $line[37];
948 $data['departure_airport_icao'] = $line[11];
949 $data['departure_airport_time'] = rtrim(chunk_split($line[22],2,':'),':');
950 $data['arrival_airport_icao'] = $line[13];
951 $data['frequency'] = $line[4];
952 $data['type'] = $line[18];
953 $data['range'] = $line[19];
954 if (isset($line[35])) $data['info'] = $line[35];
955 $data['id_source'] = $id_source;
956 //$data['arrival_airport_time'] = ;
957 if ($line[9] != '') {
958 $aircraft_data = explode('/',$line[9]);
959 if (isset($aircraft_data[1])) {
960 $data['aircraft_icao'] = $aircraft_data[1];
964 if ($value === 'whazzup') $data['format_source'] = 'whazzup';
965 elseif ($value === 'vatsimtxt') $data['format_source'] = 'vatsimtxt';
967 $data['format_source'] = $value['format'];
968 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
969 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
970 if ($line[3] === 'PILOT') $SI->add($data);
971 elseif ($line[3] === 'ATC') {
972 //print_r($data);
973 $data['info'] = str_replace('^&sect;','<br />',$data['info']);
974 $data['info'] = str_replace('&amp;sect;','',$data['info']);
975 $typec = substr($data['ident'],-3);
976 if ($typec === 'APP') $data['type'] = 'Approach';
977 elseif ($typec === 'TWR') $data['type'] = 'Tower';
978 elseif ($typec === 'OBS') $data['type'] = 'Observer';
979 elseif ($typec === 'GND') $data['type'] = 'Ground';
980 elseif ($typec === 'DEL') $data['type'] = 'Delivery';
981 elseif ($typec === 'DEP') $data['type'] = 'Departure';
982 elseif ($typec === 'FSS') $data['type'] = 'Flight Service Station';
983 elseif ($typec === 'CTR') $data['type'] = 'Control Radar or Centre';
984 elseif ($data['type'] === '') $data['type'] = 'Observer';
985 if (!isset($data['source_name'])) $data['source_name'] = '';
986 if (isset($ATC)) {
987 if (count($ATC->getByIdent($data['ident'],$data['format_source'])) > 0) echo $ATC->update($data['ident'],$data['frequency'],$data['latitude'],$data['longitude'],$data['range'],$data['info'],$data['datetime'],$data['type'],$data['pilot_id'],$data['pilot_name'],$data['format_source'],$data['source_name']);
988 else echo $ATC->add($data['ident'],$data['frequency'],$data['latitude'],$data['longitude'],$data['range'],$data['info'],$data['datetime'],$data['type'],$data['pilot_id'],$data['pilot_name'],$data['format_source'],$data['source_name']);
991 unset($data);
995 //if ($value === 'whazzup') $last_exec['whazzup'] = time();
996 //elseif ($value === 'vatsimtxt') $last_exec['vatsimtxt'] = time();
997 $last_exec[$id]['last'] = time();
998 } elseif ($value['format'] === 'airwhere' &&
1000 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1001 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1004 $buffer = $Common->getData('http://www.airwhere.co.uk/pilots.php','get','','','','','20');
1005 if ($buffer != '') {
1006 $all_data = simplexml_load_string($buffer);
1007 foreach($all_data->children() as $childdata) {
1008 $data = array();
1009 $line = $childdata;
1010 //$data['hex'] = str_pad(dechex((int)$line['pktPilotID']),6,'000000',STR_PAD_LEFT);
1011 $data['id'] = date('Ymd').(int)$line['pktPilotID'];
1012 $data['datetime'] = date('Y-m-d H:i:s',strtotime((string)$line['entryTime'].' BST'));
1013 $data['latitude'] = (float)$line['pktLatitude'];
1014 $data['longitude'] = (float)$line['pktLongitude'];
1015 if ((float)$line['pktTrack'] != 0) $data['heading'] = (float)$line['pktTrack'];
1016 if ((int)$line['pktSpeed'] != 0) $data['speed'] = (int)$line['pktSpeed'];
1017 $data['altitude'] = round((int)$line['pktAltitude']*3.28084);
1018 $data['altitude_relative'] = 'AMSL';
1019 $data['pilot_id'] = (int)$line['pktPilotID'];
1020 $data['aircraft_icao'] = 'PARAGLIDER';
1021 $pilot_data = explode(',',$Common->getData('http://www.airwhere.co.uk/pilotdetails.php?pilot='.$data['pilot_id']));
1022 if (isset($pilot_data[4])) $data['pilot_name'] = $pilot_data[4];
1023 $data['format_source'] = $value['format'];
1024 $SI->add($data);
1025 unset($data);
1028 $Source->deleteOldLocationByType('gs');
1029 $buffer = $Common->getData('http://www.airwhere.co.uk/gspositions.php','get','','','','','20');
1030 if ($buffer != '') {
1031 $all_data = simplexml_load_string($buffer);
1032 foreach($all_data->children() as $childdata) {
1033 $data = array();
1034 $line = $childdata;
1035 $data['id'] = (int)$line['gsID'];
1036 $data['latitude'] = (float)$line['gsLatitude'];
1037 $data['longitude'] = (float)$line['gsLongitude'];
1038 $data['altitude'] = round((int)$line['gsHeight']*3.28084);
1039 $data['altitude_relative'] = 'AMSL';
1040 $data['datetime'] = date('Y-m-d H:i:s',strtotime((string)$line['gsLastUpdate'].' BST'));
1041 if (count($Source->getLocationInfoByLocationID($data['id'])) > 0) {
1042 $Source->updateLocationByLocationID('',$data['latitude'],$data['longitude'],$data['altitude'],'','','airwhere','antenna.png','gs',$id,$data['id'],$data['datetime']);
1043 } else {
1044 $Source->addLocation('',$data['latitude'],$data['longitude'],$data['altitude'],'','','airwhere','antenna.png','gs',$id,$data['id'],$data['datetime']);
1046 unset($data);
1049 $last_exec[$id]['last'] = time();
1051 } if ($value['format'] === 'aircraftlistjson') {
1052 print_r($globalSources);
1053 print_r($last_exec);
1054 echo $globalMinFetch;
1056 } elseif ($value['format'] === 'aircraftlistjson' &&
1058 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1059 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1062 $buffer = $Common->getData($value['host'],'get','','','','','20');
1063 if ($buffer != '') {
1064 $all_data = json_decode($buffer,true);
1065 if (isset($all_data['acList'])) {
1066 $reset = 0;
1067 foreach ($all_data['acList'] as $line) {
1068 $data = array();
1069 $data['hex'] = $line['Icao']; // hex
1070 if (isset($line['Call'])) $data['ident'] = $line['Call']; // ident
1071 if (isset($line['Alt'])) $data['altitude'] = $line['Alt']; // altitude
1072 if (isset($line['Spd'])) $data['speed'] = $line['Spd']; // speed
1073 if (isset($line['Trak'])) $data['heading'] = $line['Trak']; // heading
1074 if (isset($line['Lat'])) $data['latitude'] = $line['Lat']; // lat
1075 if (isset($line['Long'])) $data['longitude'] = $line['Long']; // long
1076 //$data['verticalrate'] = $line['']; // verticale rate
1077 if (isset($line['Sqk'])) $data['squawk'] = $line['Sqk']; // squawk
1078 $data['emergency'] = ''; // emergency
1079 if (isset($line['Reg'])) $data['registration'] = $line['Reg'];
1080 if (isset($line['PosTime'])) $data['datetime'] = date('Y-m-d H:i:s',round($line['PosTime']/1000));
1081 else $data['datetime'] = date('Y-m-d H:i:s');
1082 //$data['datetime'] = date('Y-m-d H:i:s');
1083 if (isset($line['Type'])) $data['aircraft_icao'] = $line['Type'];
1084 $data['format_source'] = 'aircraftlistjson';
1085 $data['id_source'] = $id_source;
1086 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1087 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1088 if (isset($data['latitude'])) $SI->add($data);
1089 unset($data);
1091 } elseif (is_array($all_data)) {
1092 $reset = 0;
1093 foreach ($all_data as $line) {
1094 $data = array();
1095 $data['hex'] = $line['hex']; // hex
1096 $data['ident'] = $line['flight']; // ident
1097 $data['altitude'] = $line['altitude']; // altitude
1098 $data['speed'] = $line['speed']; // speed
1099 $data['heading'] = $line['track']; // heading
1100 $data['latitude'] = $line['lat']; // lat
1101 $data['longitude'] = $line['lon']; // long
1102 $data['verticalrate'] = $line['vrt']; // verticale rate
1103 $data['squawk'] = $line['squawk']; // squawk
1104 $data['emergency'] = ''; // emergency
1105 if (isset($line['PosTime'])) $data['datetime'] = date('Y-m-d H:i:s',round($line['PosTime']/1000));
1106 else $data['datetime'] = date('Y-m-d H:i:s');
1107 $data['format_source'] = 'aircraftlistjson';
1108 $data['id_source'] = $id_source;
1109 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1110 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1111 $SI->add($data);
1112 unset($data);
1115 } elseif ($globalDebug) echo 'No data'."\n";
1116 //$last_exec['aircraftlistjson'] = time();
1117 $last_exec[$id]['last'] = time();
1118 //} elseif ($value === 'planeupdatefaa' && (time() - $last_exec['planeupdatefaa'] > $globalMinFetch)) {
1119 } elseif ($value['format'] === 'planeupdatefaa' &&
1121 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1122 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1125 $buffer = $Common->getData($value['host']);
1126 $all_data = json_decode($buffer,true);
1127 if (isset($all_data['planes'])) {
1128 $reset = 0;
1129 foreach ($all_data['planes'] as $key => $line) {
1130 $data = array();
1131 $data['hex'] = $key; // hex
1132 $data['ident'] = $line[3]; // ident
1133 $data['altitude'] = $line[6]; // altitude
1134 $data['speed'] = $line[8]; // speed
1135 $data['heading'] = $line[7]; // heading
1136 $data['latitude'] = $line[4]; // lat
1137 $data['longitude'] = $line[5]; // long
1138 //$data['verticalrate'] = $line[]; // verticale rate
1139 $data['squawk'] = $line[10]; // squawk
1140 $data['emergency'] = ''; // emergency
1141 $data['registration'] = $line[2];
1142 $data['aircraft_icao'] = $line[0];
1143 $deparr = explode('-',$line[1]);
1144 if (count($deparr) === 2) {
1145 $data['departure_airport_icao'] = $deparr[0];
1146 $data['arrival_airport_icao'] = $deparr[1];
1148 $data['datetime'] = date('Y-m-d H:i:s',$line[9]);
1149 $data['format_source'] = 'planeupdatefaa';
1150 $data['id_source'] = $id_source;
1151 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1152 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1153 $SI->add($data);
1154 unset($data);
1157 //$last_exec['planeupdatefaa'] = time();
1158 $last_exec[$id]['last'] = time();
1159 } elseif ($value['format'] === 'opensky' &&
1161 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1162 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1165 $buffer = $Common->getData($value['host']);
1166 $all_data = json_decode($buffer,true);
1167 if (isset($all_data['states'])) {
1168 $reset = 0;
1169 foreach ($all_data['states'] as $key => $line) {
1170 $data = array();
1171 $data['hex'] = $line[0]; // hex
1172 $data['ident'] = trim($line[1]); // ident
1173 $data['altitude'] = round($line[7]*3.28084); // altitude
1174 $data['speed'] = round($line[9]*1.94384); // speed
1175 $data['heading'] = round($line[10]); // heading
1176 $data['latitude'] = $line[6]; // lat
1177 $data['longitude'] = $line[5]; // long
1178 $data['verticalrate'] = $line[11]; // verticale rate
1179 //$data['squawk'] = $line[10]; // squawk
1180 //$data['emergency'] = ''; // emergency
1181 //$data['registration'] = $line[2];
1182 //$data['aircraft_icao'] = $line[0];
1183 $data['datetime'] = date('Y-m-d H:i:s',$line[3]);
1184 $data['format_source'] = 'opensky';
1185 $data['id_source'] = $id_source;
1186 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1187 $SI->add($data);
1188 unset($data);
1191 //$last_exec['planeupdatefaa'] = time();
1192 $last_exec[$id]['last'] = time();
1193 } elseif ($value['format'] === 'aircraftjson' &&
1195 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1196 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1199 $buffer = $Common->getData($value['host']);
1200 $all_data = json_decode($buffer,true);
1201 if (isset($all_data['aircraft']) && isset($all_data['now']) && $all_data['now'] > time()-1800) {
1202 $reset = 0;
1203 foreach ($all_data['aircraft'] as $key => $line) {
1204 $data = array();
1205 // add support for ground vehicule with ~ in front of hex
1206 if (isset($line['hex'])) $data['hex'] = $line['hex']; // hex
1207 if (isset($line['flight'])) $data['ident'] = trim($line['flight']); // ident
1208 if (isset($line['altitude'])) $data['altitude'] = $line['altitude']; // altitude
1209 if (isset($line['speed'])) $data['speed'] = $line['speed']; // speed
1210 if (isset($line['track'])) $data['heading'] = $line['track']; // heading
1211 if (isset($line['lat'])) $data['latitude'] = $line['lat']; // lat
1212 if (isset($line['lon'])) $data['longitude'] = $line['lon']; // long
1213 if (isset($line['vert_rate'])) $data['verticalrate'] = $line['vert_rate']; // verticale rate
1214 if (isset($line['squawk'])) $data['squawk'] = $line['squawk']; // squawk
1215 //$data['emergency'] = ''; // emergency
1216 //$data['registration'] = $line[2];
1217 //$data['aircraft_icao'] = $line[0];
1218 $data['datetime'] = date('Y-m-d H:i:s');
1219 $data['format_source'] = 'aircraftjson';
1220 $data['id_source'] = $id_source;
1221 if (isset($value['name']) && $value['name'] != '') {
1222 if (isset($line['mlat']) && !empty($line['mlat'])) $data['source_name'] = $value['name'].'_MLAT';
1223 else $data['source_name'] = $value['name'];
1224 } elseif (isset($line['mlat']) && !empty($line['mlat'])) $data['source_name'] = 'MLAT';
1225 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1226 $SI->add($data);
1227 unset($data);
1230 //$last_exec['planeupdatefaa'] = time();
1231 $last_exec[$id]['last'] = time();
1232 } elseif ($value['format'] === 'planefinderclient' &&
1234 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1235 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1238 $buffer = $Common->getData($value['host']);
1239 $all_data = json_decode($buffer,true);
1240 if (isset($all_data['aircraft'])) {
1241 $reset = 0;
1242 foreach ($all_data['aircraft'] as $key => $line) {
1243 $data = array();
1244 $data['hex'] = $key; // hex
1245 if (isset($line['callsign'])) $data['ident'] = trim($line['callsign']); // ident
1246 if (isset($line['altitude'])) $data['altitude'] = $line['altitude']; // altitude
1247 if (isset($line['speed'])) $data['speed'] = $line['speed']; // speed
1248 if (isset($line['heading'])) $data['heading'] = $line['heading']; // heading
1249 if (isset($line['lat'])) $data['latitude'] = $line['lat']; // lat
1250 if (isset($line['lon'])) $data['longitude'] = $line['lon']; // long
1251 if (isset($line['vert_rate'])) $data['verticalrate'] = $line['vert_rate']; // verticale rate
1252 if (isset($line['squawk'])) $data['squawk'] = $line['squawk']; // squawk
1253 //$data['emergency'] = ''; // emergency
1254 if (isset($line['reg'])) $data['registration'] = $line['reg'];
1255 if (isset($line['type'])) $data['aircraft_icao'] = $line['type'];
1256 $data['datetime'] = date('Y-m-d H:i:s',$line['pos_update_time']);
1257 $data['format_source'] = 'planefinderclient';
1258 $data['id_source'] = $id_source;
1259 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1260 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1261 $SI->add($data);
1262 unset($data);
1265 $last_exec[$id]['last'] = time();
1266 //} elseif ($value === 'fr24json' && (time() - $last_exec['fr24json'] > $globalMinFetch)) {
1267 } elseif ($value['format'] === 'fr24json' &&
1269 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1270 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1273 //$buffer = $Common->getData($hosts[$id]);
1274 $buffer = $Common->getData($value['host']);
1275 $all_data = json_decode($buffer,true);
1276 if (!empty($all_data)) $reset = 0;
1277 foreach ($all_data as $key => $line) {
1278 if ($key != 'full_count' && $key != 'version' && $key != 'stats') {
1279 $data = array();
1280 $data['hex'] = $line[0];
1281 $data['ident'] = $line[16]; //$line[13]
1282 $data['altitude'] = $line[4]; // altitude
1283 $data['speed'] = $line[5]; // speed
1284 $data['heading'] = $line[3]; // heading
1285 $data['latitude'] = $line[1]; // lat
1286 $data['longitude'] = $line[2]; // long
1287 $data['verticalrate'] = $line[15]; // verticale rate
1288 $data['squawk'] = $line[6]; // squawk
1289 $data['aircraft_icao'] = $line[8];
1290 $data['registration'] = $line[9];
1291 $data['departure_airport_iata'] = $line[11];
1292 $data['arrival_airport_iata'] = $line[12];
1293 $data['emergency'] = ''; // emergency
1294 $data['datetime'] = date('Y-m-d H:i:s'); //$line[10]
1295 $data['format_source'] = 'fr24json';
1296 $data['id_source'] = $id_source;
1297 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1298 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1299 $SI->add($data);
1300 unset($data);
1303 //$last_exec['fr24json'] = time();
1304 $last_exec[$id]['last'] = time();
1305 //} elseif ($value === 'radarvirtueljson' && (time() - $last_exec['radarvirtueljson'] > $globalMinFetch)) {
1306 } elseif ($value['format'] === 'radarvirtueljson' &&
1308 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1309 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1312 //$buffer = $Common->getData($hosts[$id],'get','','','','','150');
1313 $buffer = $Common->getData($value['host'],'get','','','','','150');
1314 //echo $buffer;
1315 $buffer = str_replace(array("\n","\r"),"",$buffer);
1316 $buffer = preg_replace('/,"num":(.+)/','}',$buffer);
1317 $all_data = json_decode($buffer,true);
1318 if (json_last_error() != JSON_ERROR_NONE) {
1319 die(json_last_error_msg());
1321 if (isset($all_data['mrkrs'])) {
1322 $reset = 0;
1323 foreach ($all_data['mrkrs'] as $key => $line) {
1324 if (isset($line['inf'])) {
1325 $data = array();
1326 $data['hex'] = $line['inf']['ia'];
1327 if (isset($line['inf']['cs'])) $data['ident'] = $line['inf']['cs']; //$line[13]
1328 $data['altitude'] = round($line['inf']['al']*3.28084); // altitude
1329 if (isset($line['inf']['gs'])) $data['speed'] = round($line['inf']['gs']*0.539957); // speed
1330 if (isset($line['inf']['tr'])) $data['heading'] = $line['inf']['tr']; // heading
1331 $data['latitude'] = $line['pt'][0]; // lat
1332 $data['longitude'] = $line['pt'][1]; // long
1333 //if (isset($line['inf']['vs'])) $data['verticalrate'] = $line['inf']['vs']; // verticale rate
1334 if (isset($line['inf']['sq'])) $data['squawk'] = $line['inf']['sq']; // squawk
1335 //$data['aircraft_icao'] = $line[8];
1336 if (isset($line['inf']['rc'])) $data['registration'] = $line['inf']['rc'];
1337 //$data['departure_airport_iata'] = $line[11];
1338 //$data['arrival_airport_iata'] = $line[12];
1339 //$data['emergency'] = ''; // emergency
1340 $data['datetime'] = date('Y-m-d H:i:s',$line['inf']['dt']); //$line[10]
1341 $data['format_source'] = 'radarvirtueljson';
1342 $data['id_source'] = $id_source;
1343 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1344 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1345 $SI->add($data);
1346 unset($data);
1350 //$last_exec['radarvirtueljson'] = time();
1351 $last_exec[$id]['last'] = time();
1352 //} elseif ($value === 'pirepsjson' && (time() - $last_exec['pirepsjson'] > $globalMinFetch)) {
1353 } elseif ($value['format'] === 'pirepsjson' &&
1355 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1356 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1359 //$buffer = $Common->getData($hosts[$id]);
1360 $buffer = $Common->getData($value['host'].'?'.time());
1361 $all_data = json_decode(utf8_encode($buffer),true);
1363 if (isset($all_data['pireps'])) {
1364 $reset = 0;
1365 foreach ($all_data['pireps'] as $line) {
1366 $data = array();
1367 $data['id'] = $line['id'];
1368 $data['hex'] = substr(str_pad(dechex($line['id']),6,'000000',STR_PAD_LEFT),0,6);
1369 $data['ident'] = $line['callsign']; // ident
1370 if (isset($line['pilotid'])) $data['pilot_id'] = $line['pilotid']; // pilot id
1371 if (isset($line['name'])) $data['pilot_name'] = $line['name']; // pilot name
1372 if (isset($line['alt'])) $data['altitude'] = $line['alt']; // altitude
1373 if (isset($line['gs'])) $data['speed'] = $line['gs']; // speed
1374 if (isset($line['heading'])) $data['heading'] = $line['heading']; // heading
1375 if (isset($line['route'])) $data['waypoints'] = $line['route']; // route
1376 $data['latitude'] = $line['lat']; // lat
1377 $data['longitude'] = $line['lon']; // long
1378 //$data['verticalrate'] = $line['vrt']; // verticale rate
1379 //$data['squawk'] = $line['squawk']; // squawk
1380 //$data['emergency'] = ''; // emergency
1381 if (isset($line['depicao'])) $data['departure_airport_icao'] = $line['depicao'];
1382 if (isset($line['deptime'])) $data['departure_airport_time'] = $line['deptime'];
1383 if (isset($line['arricao'])) $data['arrival_airport_icao'] = $line['arricao'];
1384 //$data['arrival_airport_time'] = $line['arrtime'];
1385 if (isset($line['aircraft'])) $data['aircraft_icao'] = $line['aircraft'];
1386 if (isset($line['transponder'])) $data['squawk'] = $line['transponder'];
1387 if (isset($line['atis'])) $data['info'] = $line['atis'];
1388 else $data['info'] = '';
1389 $data['format_source'] = 'pireps';
1390 $data['id_source'] = $id_source;
1391 $data['datetime'] = date('Y-m-d H:i:s');
1392 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1393 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1394 if ($line['icon'] === 'plane') {
1395 $SI->add($data);
1396 // print_r($data);
1397 } elseif ($line['icon'] === 'ct') {
1398 $data['info'] = str_replace('^&sect;','<br />',$data['info']);
1399 $data['info'] = str_replace('&amp;sect;','',$data['info']);
1400 $typec = substr($data['ident'],-3);
1401 $data['type'] = '';
1402 if ($typec === 'APP') $data['type'] = 'Approach';
1403 elseif ($typec === 'TWR') $data['type'] = 'Tower';
1404 elseif ($typec === 'OBS') $data['type'] = 'Observer';
1405 elseif ($typec === 'GND') $data['type'] = 'Ground';
1406 elseif ($typec === 'DEL') $data['type'] = 'Delivery';
1407 elseif ($typec === 'DEP') $data['type'] = 'Departure';
1408 elseif ($typec === 'FSS') $data['type'] = 'Flight Service Station';
1409 elseif ($typec === 'CTR') $data['type'] = 'Control Radar or Centre';
1410 else $data['type'] = 'Observer';
1411 if (isset($ATC)) echo $ATC->add($data['ident'],'',$data['latitude'],$data['longitude'],'0',$data['info'],$data['datetime'],$data['type'],$data['pilot_id'],$data['pilot_name'],$data['format_source']);
1413 unset($data);
1416 //$last_exec['pirepsjson'] = time();
1417 $last_exec[$id]['last'] = time();
1418 //} elseif ($value === 'phpvmacars' && (time() - $last_exec['phpvmacars'] > $globalMinFetch)) {
1419 } elseif ($value['format'] === 'phpvmacars' &&
1421 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1422 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1425 //$buffer = $Common->getData($hosts[$id]);
1426 if ($globalDebug) echo 'Get Data...'."\n";
1427 $buffer = $Common->getData($value['host']);
1428 $all_data = json_decode($buffer,true);
1429 if ($buffer != '' && is_array($all_data)) {
1430 $reset = 0;
1431 foreach ($all_data as $line) {
1432 $data = array();
1433 //$data['id'] = $line['id']; // id not usable
1434 if (isset($line['pilotid'])) $data['id'] = $line['pilotid'].$line['flightnum'];
1435 $data['hex'] = substr(str_pad(bin2hex($line['flightnum']),6,'000000',STR_PAD_LEFT),-6); // hex
1436 if (isset($line['pilotname'])) $data['pilot_name'] = $line['pilotname'];
1437 if (isset($line['pilotid'])) $data['pilot_id'] = $line['pilotid'];
1438 $data['ident'] = $line['flightnum']; // ident
1439 $data['altitude'] = $line['alt']; // altitude
1440 $data['speed'] = $line['gs']; // speed
1441 $data['heading'] = $line['heading']; // heading
1442 $data['latitude'] = $line['lat']; // lat
1443 $data['longitude'] = $line['lng']; // long
1444 $data['verticalrate'] = ''; // verticale rate
1445 $data['squawk'] = ''; // squawk
1446 $data['emergency'] = ''; // emergency
1447 //$data['datetime'] = $line['lastupdate'];
1448 //$data['last_update'] = $line['lastupdate'];
1449 if (isset($value['timezone'])) {
1450 $datetime = new DateTime($line['lastupdate'],new DateTimeZone($value['timezone']));
1451 $datetime->setTimeZone(new DateTimeZone('UTC'));
1452 $data['datetime'] = $datetime->format('Y-m-d H:i:s');
1453 } else $data['datetime'] = date('Y-m-d H:i:s');
1454 $data['departure_airport_icao'] = $line['depicao'];
1455 $data['departure_airport_time'] = $line['deptime'];
1456 $data['arrival_airport_icao'] = $line['arricao'];
1457 $data['arrival_airport_time'] = $line['arrtime'];
1458 if (isset($line['registration'])) {
1459 $data['registration'] = $line['registration'];
1460 //if (isset($line['aircraft'])) $data['id'] = $line['aircraft'];
1461 } else $data['registration'] = $line['aircraft'];
1462 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1463 if (isset($line['route'])) $data['waypoints'] = $line['route']; // route
1464 if (isset($line['aircraftname'])) {
1465 $line['aircraftname'] = strtoupper($line['aircraftname']);
1466 $line['aircraftname'] = str_replace('BOEING ','B',$line['aircraftname']);
1467 $aircraft_data = explode('-',$line['aircraftname']);
1468 if (isset($aircraft_data[1]) && strlen($aircraft_data[0]) >= 3 && strlen($aircraft_data[0]) <= 4) $data['aircraft_icao'] = $aircraft_data[0];
1469 elseif (isset($aircraft_data[1]) && strlen($aircraft_data[1]) >= 3 && strlen($aircraft_data[1]) <= 4) $data['aircraft_icao'] = $aircraft_data[1];
1470 else {
1471 $aircraft_data = explode(' ',$line['aircraftname']);
1472 if (isset($aircraft_data[1])) $data['aircraft_icao'] = str_replace('-','',$aircraft_data[1]);
1473 else $data['aircraft_icao'] = str_replace('-','',$line['aircraftname']);
1476 if (isset($line['route'])) $data['waypoints'] = $line['route'];
1477 $data['id_source'] = $id_source;
1478 $data['format_source'] = 'phpvmacars';
1479 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1480 $SI->add($data);
1481 unset($data);
1483 if ($globalDebug) echo 'No more data...'."\n";
1484 unset($buffer);
1485 unset($all_data);
1487 //$last_exec['phpvmacars'] = time();
1488 $last_exec[$id]['last'] = time();
1489 } elseif ($value['format'] === 'vaos' &&
1491 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1492 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1495 //$buffer = $Common->getData($hosts[$id]);
1496 if ($globalDebug) echo 'Get Data...'."\n";
1497 $buffer = $Common->getData($value['host']);
1498 $all_data = json_decode($buffer,true);
1499 if ($buffer != '' && is_array($all_data) && isset($all_data['ACARSData'])) {
1500 $reset = 0;
1501 foreach ($all_data['ACARSData'] as $line) {
1502 //print_r($line);
1503 $data = array();
1504 //$data['id'] = $line['id']; // id not usable
1505 $data['id'] = $line['id'];
1506 //$data['hex'] = substr(str_pad(bin2hex($line['flightnum']),6,'000000',STR_PAD_LEFT),-6); // hex
1507 if (isset($line['user']['username'])) $data['pilot_name'] = $line['user']['username'];
1508 if (isset($line['user_id'])) $data['pilot_id'] = $line['user_id'];
1509 $data['ident'] = str_replace(' ','',$line['bid']['flightnum']); // ident
1510 if (is_numeric($data['ident'])) $data['ident'] = $line['bid']['airline']['icao'].$data['ident'];
1511 $data['altitude'] = $line['altitude']; // altitude
1512 $data['speed'] = $line['groundspeed']; // speed
1513 $data['heading'] = $line['heading']; // heading
1514 $data['latitude'] = $line['lat']; // lat
1515 $data['longitude'] = $line['lon']; // long
1516 //$data['verticalrate'] = ''; // verticale rate
1517 //$data['squawk'] = ''; // squawk
1518 //$data['emergency'] = ''; // emergency
1519 if (isset($value['timezone'])) {
1520 $datetime = new DateTime($line['updated_at'],new DateTimeZone($value['timezone']));
1521 $datetime->setTimeZone(new DateTimeZone('UTC'));
1522 $data['datetime'] = $datetime->format('Y-m-d H:i:s');
1523 } else $data['datetime'] = date('Y-m-d H:i:s');
1525 $data['departure_airport_icao'] = $line['bid']['depapt']['icao'];
1526 $data['departure_airport_time'] = $line['bid']['deptime'];
1527 $data['arrival_airport_icao'] = $line['bid']['arrapt']['icao'];
1528 $data['arrival_airport_time'] = $line['bid']['arrtime'];
1529 $data['registration'] = $line['bid']['aircraft']['registration'];
1531 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1532 if (isset($line['bid']['route']) && $line['bid']['route'] != '') $data['waypoints'] = $line['bid']['route']; // route
1533 $data['aircraft_icao'] = $line['bid']['aircraft']['icao'];
1535 $data['id_source'] = $id_source;
1536 $data['format_source'] = 'vaos';
1537 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1538 $SI->add($data);
1539 unset($data);
1541 if ($globalDebug) echo 'No more data...'."\n";
1542 unset($buffer);
1543 unset($all_data);
1545 //$last_exec['phpvmacars'] = time();
1546 $last_exec[$id]['last'] = time();
1547 } elseif ($value['format'] === 'vam' &&
1549 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1550 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1553 //$buffer = $Common->getData($hosts[$id]);
1554 if ($globalDebug) echo 'Get Data...'."\n";
1555 $buffer = $Common->getData($value['host']);
1556 $all_data = json_decode($buffer,true);
1557 if ($buffer != '' && is_array($all_data)) {
1558 $reset = 0;
1559 foreach ($all_data as $line) {
1560 $data = array();
1561 //$data['id'] = $line['id']; // id not usable
1562 $data['id'] = trim($line['flight_id']);
1563 $data['hex'] = substr(str_pad(bin2hex($line['callsign']),6,'000000',STR_PAD_LEFT),-6); // hex
1564 $data['pilot_name'] = $line['pilot_name'];
1565 $data['pilot_id'] = $line['pilot_id'];
1566 $data['ident'] = trim($line['callsign']); // ident
1567 $data['altitude'] = $line['altitude']; // altitude
1568 $data['speed'] = $line['gs']; // speed
1569 $data['heading'] = $line['heading']; // heading
1570 $data['latitude'] = $line['latitude']; // lat
1571 $data['longitude'] = $line['longitude']; // long
1572 $data['verticalrate'] = ''; // verticale rate
1573 $data['squawk'] = ''; // squawk
1574 $data['emergency'] = ''; // emergency
1575 //$data['datetime'] = $line['lastupdate'];
1576 $data['last_update'] = $line['last_update'];
1577 $data['datetime'] = date('Y-m-d H:i:s');
1578 $data['departure_airport_icao'] = $line['departure'];
1579 //$data['departure_airport_time'] = $line['departure_time'];
1580 $data['arrival_airport_icao'] = $line['arrival'];
1581 //$data['arrival_airport_time'] = $line['arrival_time'];
1582 //$data['registration'] = $line['aircraft'];
1583 if (isset($line['route'])) $data['waypoints'] = $line['route']; // route
1584 $data['aircraft_icao'] = $line['plane_type'];
1585 $data['id_source'] = $id_source;
1586 $data['format_source'] = 'vam';
1587 if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1588 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1589 $SI->add($data);
1590 unset($data);
1592 if ($globalDebug) echo 'No more data...'."\n";
1593 unset($buffer);
1594 unset($all_data);
1596 //$last_exec['phpvmacars'] = time();
1597 $last_exec[$id]['last'] = time();
1598 } elseif ($value['format'] === 'blitzortung' &&
1600 (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1601 (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1604 //$buffer = $Common->getData($hosts[$id]);
1605 if ($globalDebug) echo 'Get Data...'."\n";
1606 $buffer = $Common->getData($value['host']);
1607 $all_data = json_decode($buffer,true);
1608 if ($buffer != '') {
1609 $Source->deleteLocationBySource('blitzortung');
1610 $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
1611 $buffer = explode('\n',$buffer);
1612 foreach ($buffer as $buffer_line) {
1613 $line = json_decode($buffer_line,true);
1614 if (isset($line['time'])) {
1615 $data = array();
1616 $data['altitude'] = $line['alt']; // altitude
1617 $data['latitude'] = $line['lat']; // lat
1618 $data['longitude'] = $line['lon']; // long
1619 $data['datetime'] = date('Y-m-d H:i:s',substr($line['time'],0,10));
1620 $data['id_source'] = $id_source;
1621 $data['format_source'] = 'blitzortung';
1622 $SI->add($data);
1623 if ($globalDebug) echo '☈ Lightning added'."\n";
1624 $Source->addLocation('',$data['latitude'],$data['longitude'],0,'','','blitzortung','weather/thunderstorm.png','lightning',$id,0,$data['datetime']);
1625 unset($data);
1628 if ($globalDebug) echo 'No more data...'."\n";
1629 unset($buffer);
1631 $last_exec[$id]['last'] = time();
1632 } elseif ($value['format'] === 'acarsjson') {
1633 $arr = $httpfeeds;
1634 $w = $e = null;
1635 if (isset($arr[$id])) {
1636 $nn = stream_select($arr,$w,$e,$timeout);
1637 if ($nn > 0) {
1638 foreach ($httpfeeds as $feed) {
1639 $buffer = stream_get_line($feed,2000,"\n");
1640 if ($buffer === FALSE) {
1641 connect_all($globalSources);
1643 $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
1644 $buffer = explode('\n',$buffer);
1645 foreach ($buffer as $line) {
1646 if ($line != '') {
1647 $line = json_decode($line, true);
1648 if (!empty($line)) {
1649 $ACARS->add(isset($line['text']) ? $line['text'] : '', array('registration' => str_replace('.', '', $line['tail']), 'ident' => $line['flight'], 'label' => $line['label'], 'block_id' => $line['block_id'], 'msg_no' => $line['msgno'], 'message' => (isset($line['text']) ? $line['text'] : '')));
1650 $ACARS->deleteLiveAcarsData();
1655 } else {
1656 $format = $value['format'];
1657 if (isset($tt[$format])) $tt[$format]++;
1658 else $tt[$format] = 0;
1659 if ($tt[$format] > 30) {
1660 if ($globalDebug) echo 'Reconnect...'."\n";
1661 sleep(2);
1662 //$sourceeen[] = $value;
1663 //connect_all($sourceeen);
1664 //$sourceeen = array();
1665 connect_all($globalSources);
1669 //} elseif ($value === 'sbs' || $value === 'tsv' || $value === 'raw' || $value === 'aprs' || $value === 'beast') {
1670 } elseif ($value['format'] === 'sbs' || $value['format'] === 'tsv' || $value['format'] === 'raw' || $value['format'] === 'aprs' || $value['format'] === 'famaprs' || $value['format'] === 'beast' || $value['format'] === 'flightgearmp' || $value['format'] === 'flightgearsp' || $value['format'] === 'acars' || $value['format'] === 'acarssbs3' || $value['format'] === 'ais' || $value['format'] === 'vrstcp') {
1671 //$last_exec[$id]['last'] = time();
1672 //$read = array( $sockets[$id] );
1673 $read = $sockets;
1674 $write = NULL;
1675 $e = NULL;
1676 $n = socket_select($read, $write, $e, $timeout);
1677 if ($e != NULL) var_dump($e);
1678 if ($n > 0) {
1679 $reset = 0;
1680 foreach ($read as $nb => $r) {
1681 //$value = $formats[$nb];
1682 $format = $globalSources[$nb]['format'];
1683 if ($format === 'sbs' || $format === 'aprs' || $format === 'famaprs' || $format === 'raw' || $format === 'tsv' || $format === 'acarssbs3') {
1684 $buffer = @socket_read($r, 6000,PHP_NORMAL_READ);
1685 } elseif ($format === 'vrstcp') {
1686 $buffer = @socket_read($r, 6000);
1687 } else {
1688 $az = socket_recvfrom($r,$buffer,6000,0,$remote_ip,$remote_port);
1690 //$buffer = socket_read($r, 60000,PHP_NORMAL_READ);
1691 //echo $buffer."\n";
1692 // lets play nice and handle signals such as ctrl-c/kill properly
1693 //if (function_exists('pcntl_fork')) pcntl_signal_dispatch();
1694 $error = false;
1695 //$SI::del();
1696 if ($buffer !== FALSE) {
1697 if ($format === 'vrstcp') {
1698 $buffer = explode('},{',$buffer);
1699 } else $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'',$buffer));
1701 // SBS format is CSV format
1702 if ($buffer !== FALSE && $buffer !== '') {
1703 $tt[$format] = 0;
1704 if ($format === 'acarssbs3') {
1705 if ($globalDebug) echo 'ACARS : '.$buffer."\n";
1706 $ACARS->add(trim($buffer));
1707 $ACARS->deleteLiveAcarsData();
1708 } elseif ($format === 'raw') {
1709 // AVR format
1710 $data = $SBS->parse($buffer);
1711 if (is_array($data)) {
1712 //if (!empty($data)) print_r($data);
1713 $data['datetime'] = date('Y-m-d H:i:s');
1714 $data['format_source'] = 'raw';
1715 if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
1716 if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1717 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1718 //if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1719 $SI->add($data);
1720 unset($data);
1722 } elseif ($format === 'ais') {
1723 $ais_data = $AIS->parse_line(trim($buffer));
1724 $data = array();
1725 if (isset($ais_data['ident'])) $data['ident'] = $ais_data['ident'];
1726 if (isset($ais_data['mmsi'])) $data['mmsi'] = substr($ais_data['mmsi'],-9);
1727 if (isset($ais_data['speed'])) $data['speed'] = $ais_data['speed'];
1728 if (isset($ais_data['heading'])) $data['heading'] = $ais_data['heading'];
1729 if (isset($ais_data['latitude'])) $data['latitude'] = $ais_data['latitude'];
1730 if (isset($ais_data['longitude'])) $data['longitude'] = $ais_data['longitude'];
1731 if (isset($ais_data['status'])) $data['status'] = $ais_data['status'];
1732 if (isset($ais_data['statusid'])) $data['status_id'] = $ais_data['statusid'];
1733 if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
1734 if (isset($ais_data['imo'])) $data['imo'] = $ais_data['imo'];
1735 if (isset($ais_data['callsign'])) $data['callsign'] = $ais_data['callsign'];
1736 if (isset($ais_data['destination'])) $data['arrival_code'] = $ais_data['destination'];
1737 if (isset($ais_data['eta_ts'])) $data['arrival_date'] = date('Y-m-d H:i:s',$ais_data['eta_ts']);
1738 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1739 if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
1740 if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1742 if (isset($ais_data['timestamp'])) {
1743 $data['datetime'] = date('Y-m-d H:i:s',$ais_data['timestamp']);
1744 } else {
1745 $data['datetime'] = date('Y-m-d H:i:s');
1747 $data['format_source'] = 'aisnmea';
1748 $data['id_source'] = $id_source;
1749 if (isset($ais_data['mmsi_type']) && $ais_data['mmsi_type'] === 'Ship') $MI->add($data);
1750 unset($data);
1751 } elseif ($format === 'flightgearsp') {
1752 //echo $buffer."\n";
1753 if (strlen($buffer) > 5) {
1754 $line = explode(',',$buffer);
1755 $data = array();
1756 //XGPS,2.0947,41.3093,-3047.6953,198.930,0.000,callsign,c172p
1757 $data['hex'] = substr(str_pad(bin2hex($line[6].$line[7]),6,'000000',STR_PAD_LEFT),0,6);
1758 $data['ident'] = $line[6];
1759 $data['aircraft_name'] = $line[7];
1760 $data['longitude'] = $line[1];
1761 $data['latitude'] = $line[2];
1762 $data['altitude'] = round($line[3]*3.28084);
1763 $data['heading'] = round($line[4]);
1764 $data['speed'] = round($line[5]*1.94384);
1765 $data['datetime'] = date('Y-m-d H:i:s');
1766 $data['format_source'] = 'flightgearsp';
1767 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1768 if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1769 //$send = @ socket_send( $r , $data_aprs , strlen($data_aprs) , 0 );
1771 } elseif ($format === 'acars') {
1772 if ($globalDebug) echo 'ACARS : '.$buffer."\n";
1773 $ACARS->add(trim($buffer));
1774 socket_sendto($r, "OK " . $buffer , 100 , 0 , $remote_ip , $remote_port);
1775 $ACARS->deleteLiveAcarsData();
1776 } elseif ($format === 'flightgearmp') {
1777 if (substr($buffer,0,1) != '#') {
1778 $data = array();
1779 //echo $buffer."\n";
1780 $line = explode(' ',$buffer);
1781 if (count($line) === 11) {
1782 $userserver = explode('@',$line[0]);
1783 $data['hex'] = substr(str_pad(bin2hex($line[0]),6,'000000',STR_PAD_LEFT),0,6); // hex
1784 $data['ident'] = $userserver[0];
1785 $data['registration'] = $userserver[0];
1786 $data['latitude'] = $line[4];
1787 $data['longitude'] = $line[5];
1788 $data['altitude'] = $line[6];
1789 $data['datetime'] = date('Y-m-d H:i:s');
1790 $aircraft_type = $line[10];
1791 $aircraft_type = preg_split(':/:',$aircraft_type);
1792 $data['aircraft_name'] = substr(end($aircraft_type),0,-4);
1793 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1794 if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1797 } elseif ($format === 'beast') {
1798 echo 'Beast Binary format not yet supported. Beast AVR format is supported in alpha state'."\n";
1799 die;
1800 } elseif ($format === 'vrstcp') {
1801 foreach($buffer as $all_data) {
1802 $line = json_decode('{'.$all_data.'}',true);
1803 $data = array();
1804 if (isset($line['Icao'])) $data['hex'] = $line['Icao']; // hex
1805 if (isset($line['Call'])) $data['ident'] = $line['Call']; // ident
1806 if (isset($line['Alt'])) $data['altitude'] = $line['Alt']; // altitude
1807 if (isset($line['Spd'])) $data['speed'] = $line['Spd']; // speed
1808 if (isset($line['Trak'])) $data['heading'] = $line['Trak']; // heading
1809 if (isset($line['Lat'])) $data['latitude'] = $line['Lat']; // lat
1810 if (isset($line['Long'])) $data['longitude'] = $line['Long']; // long
1811 //$data['verticalrate'] = $line['']; // verticale rate
1812 if (isset($line['Sqk'])) $data['squawk'] = $line['Sqk']; // squawk
1813 $data['emergency'] = ''; // emergency
1814 if (isset($line['Reg'])) $data['registration'] = $line['Reg'];
1816 if (isset($line['PosTime'])) $data['datetime'] = date('Y-m-d H:i:s',$line['PosTime']/1000);
1817 else $data['datetime'] = date('Y-m-d H:i:s');
1819 $data['datetime'] = date('Y-m-d H:i:s');
1820 if (isset($line['Type'])) $data['aircraft_icao'] = $line['Type'];
1821 $data['format_source'] = 'vrstcp';
1822 $data['id_source'] = $id_source;
1823 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1824 if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1825 if (isset($data['latitude']) && isset($data['hex'])) $SI->add($data);
1826 unset($data);
1828 } elseif ($format === 'tsv' || substr($buffer,0,4) === 'clock') {
1829 $line = explode("\t", $buffer);
1830 for($k = 0; $k < count($line); $k=$k+2) {
1831 $key = $line[$k];
1832 $lined[$key] = $line[$k+1];
1834 if (count($lined) > 3) {
1835 $data['hex'] = $lined['hexid'];
1836 //$data['datetime'] = date('Y-m-d H:i:s',strtotime($lined['clock']));;
1837 $data['datetime'] = date('Y-m-d H:i:s');;
1838 if (isset($lined['ident'])) $data['ident'] = $lined['ident'];
1839 if (isset($lined['lat'])) $data['latitude'] = $lined['lat'];
1840 if (isset($lined['lon'])) $data['longitude'] = $lined['lon'];
1841 if (isset($lined['speed'])) $data['speed'] = $lined['speed'];
1842 if (isset($lined['squawk'])) $data['squawk'] = $lined['squawk'];
1843 if (isset($lined['alt'])) $data['altitude'] = $lined['alt'];
1844 if (isset($lined['heading'])) $data['heading'] = $lined['heading'];
1845 $data['id_source'] = $id_source;
1846 $data['format_source'] = 'tsv';
1847 if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
1848 if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1849 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1850 if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1851 unset($lined);
1852 unset($data);
1853 } else $error = true;
1854 } elseif ($format === 'aprs' && $use_aprs) {
1855 if ($aprs_connect === 0) {
1856 $send = @ socket_send( $r , $aprs_login , strlen($aprs_login) , 0 );
1857 $aprs_connect = 1;
1860 if ( $aprs_keep>60 && time() - $aprs_last_tx > $aprs_keep ) {
1861 $aprs_last_tx = time();
1862 $data_aprs = "# Keep alive";
1863 $send = @ socket_send( $r , $data_aprs , strlen($data_aprs) , 0 );
1866 //echo 'Connect : '.$aprs_connect.' '.$buffer."\n";
1867 //echo 'APRS data : '.$buffer."\n";
1868 $buffer = str_replace('APRS <- ','',$buffer);
1869 $buffer = str_replace('APRS -> ','',$buffer);
1870 //echo $buffer."\n";
1871 date_default_timezone_set('UTC');
1872 if (substr($buffer,0,1) != '#' && substr($buffer,0,1) != '@' && substr($buffer,0,5) != 'APRS ') {
1873 $line = $APRS->parse($buffer);
1874 //if (is_array($line) && isset($line['address']) && $line['address'] != '' && isset($line['ident'])) {
1875 if (is_array($line) && isset($line['latitude']) && isset($line['longitude']) && (isset($line['ident']) || isset($line['address']) || isset($line['mmsi']))) {
1876 $aprs_last_tx = time();
1877 $data = array();
1878 //print_r($line);
1879 if (isset($line['address'])) $data['hex'] = $line['address'];
1880 if (isset($line['mmsi'])) $data['mmsi'] = $line['mmsi'];
1881 if (isset($line['imo'])) $data['imo'] = $line['imo'];
1882 if (isset($line['squawk'])) $data['squawk'] = $line['squawk'];
1883 if (isset($line['arrival_code'])) $data['arrival_code'] = $line['arrival_code'];
1884 if (isset($line['arrival_date'])) $data['arrival_date'] = $line['arrival_date'];
1885 if (isset($line['typeid'])) $data['type_id'] = $line['typeid'];
1886 if (isset($line['statusid'])) $data['status_id'] = $line['statusid'];
1887 if (isset($line['timestamp'])) $data['datetime'] = date('Y-m-d H:i:s',$line['timestamp']);
1888 else $data['datetime'] = date('Y-m-d H:i:s');
1889 //$data['datetime'] = date('Y-m-d H:i:s');
1890 if (isset($line['ident'])) $data['ident'] = $line['ident'];
1891 $data['latitude'] = $line['latitude'];
1892 $data['longitude'] = $line['longitude'];
1893 //$data['verticalrate'] = $line[16];
1894 if (isset($line['speed'])) $data['speed'] = $line['speed'];
1895 //else $data['speed'] = 0;
1896 if (isset($line['altitude'])) $data['altitude'] = $line['altitude'];
1897 if (isset($line['comment'])) $data['comment'] = $line['comment'];
1898 if (isset($line['symbol'])) $data['type'] = $line['symbol'];
1899 //if (isset($line['heading'])) $data['heading'] = $line['heading'];
1901 if (isset($line['heading']) && isset($line['format_source'])) $data['heading'] = $line['heading'];
1902 //else echo 'No heading...'."\n";
1903 //else $data['heading'] = 0;
1904 if (isset($line['stealth'])) $data['aircraft_type'] = $line['stealth'];
1905 //if (!isset($line['source_type']) && (!isset($globalAPRSarchive) || (isset($globalAPRSarchive) && $globalAPRSarchive === FALSE))) $data['noarchive'] = true;
1906 if (isset($globalAPRSarchive) && $globalAPRSarchive === FALSE) $data['noarchive'] = true;
1907 elseif (isset($globalAPRSarchive) && $globalAPRSarchive === TRUE) $data['noarchive'] = false;
1908 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1909 elseif (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === FALSE) $data['noarchive'] = false;
1910 $data['id_source'] = $id_source;
1911 if (isset($line['format_source'])) $data['format_source'] = $line['format_source'];
1912 else $data['format_source'] = 'aprs';
1913 $data['source_name'] = $line['source'];
1914 if (isset($line['source_type'])) $data['source_type'] = $line['source_type'];
1915 else $data['source_type'] = 'flarm';
1916 if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1917 $currentdate = date('Y-m-d H:i:s');
1918 $aprsdate = strtotime($data['datetime']);
1919 if ($data['source_type'] != 'modes' && $data['source_type'] != 'ais') $data['altitude_relative'] = 'AMSL';
1920 // Accept data if time <= system time + 20s
1921 //if (($data['source_type'] === 'modes') || isset($line['stealth']) && ($line['stealth'] === 0 || $line['stealth'] === '') && (strtotime($data['datetime']) <= strtotime($currentdate)+20) && (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude'])))) {
1922 if (
1923 ($data['source_type'] === 'modes') ||
1924 isset($line['stealth']) &&
1925 (!isset($data['hex']) || $data['hex'] != 'FFFFFF') &&
1926 ($line['stealth'] === 0 || $line['stealth'] == '') &&
1927 (($data['latitude'] == '' && $data['longitude'] == '') || (is_numeric($data['latitude']) && is_numeric($data['longitude'])))) {
1928 $send = $SI->add($data);
1929 } elseif ($data['source_type'] === 'ais') {
1930 $data['type'] = '';
1931 if (isset($globalMarine) && $globalMarine) $send = $MI->add($data);
1932 } elseif (isset($line['stealth']) && $line['stealth'] != 0) {
1933 echo '-------- '.$data['ident'].' : APRS stealth ON => not adding'."\n";
1934 } elseif (isset($globalAircraft) && $globalAircraft && isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && (
1935 //$line['symbol'] === 'Balloon' ||
1936 $line['symbol'] === 'Glider' ||
1937 $line['symbol'] === 'No. Plane' ||
1938 $line['symbol'] === 'Aircraft (small)' || $line['symbol'] === 'Helicopter')) {
1939 if ($line['symbol'] === 'Ballon') $data['aircraft_icao'] = 'BALL';
1940 if ($line['symbol'] === 'Glider') $data['aircraft_icao'] = 'PARAGLIDER';
1941 $send = $SI->add($data);
1942 } elseif (isset($globalMarine) && $globalMarine && isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && (
1943 $line['symbol'] === 'Yacht (Sail)' ||
1944 $line['symbol'] === 'Ship (Power Boat)')) {
1945 $send = $MI->add($data);
1946 } elseif (isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && (
1947 $line['symbol'] === 'Car' ||
1948 $line['symbol'] === 'Ambulance' ||
1949 $line['symbol'] === 'Van' ||
1950 $line['symbol'] === 'Truck' || $line['symbol'] === 'Truck (18 Wheeler)' ||
1951 $line['symbol'] === 'Motorcycle' ||
1952 $line['symbol'] === 'Tractor' ||
1953 $line['symbol'] === 'Police' ||
1954 $line['symbol'] === 'Bike' ||
1955 $line['symbol'] === 'Jogger' ||
1956 $line['symbol'] === 'Horse' ||
1957 $line['symbol'] === 'Bus' ||
1958 $line['symbol'] === 'Jeep' ||
1959 $line['symbol'] === 'Recreational Vehicle' ||
1960 $line['symbol'] === 'Yacht (Sail)' ||
1961 $line['symbol'] === 'Ship (Power Boat)' ||
1962 $line['symbol'] === 'Firetruck' ||
1963 $line['symbol'] === 'Balloon' || $line['symbol'] === 'Glider' ||
1964 $line['symbol'] === 'Aircraft (small)' || $line['symbol'] === 'Helicopter' ||
1965 $line['symbol'] === 'SUV' ||
1966 $line['symbol'] === 'Snowmobile' ||
1967 $line['symbol'] === 'Mobile Satellite Station')) {
1968 //} elseif (isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && isset($line['speed']) && $line['symbol'] != 'Weather Station' && $line['symbol'] != 'House QTH (VHF)' && $line['symbol'] != 'Dot' && $line['symbol'] != 'TCP-IP' && $line['symbol'] != 'xAPRS (UNIX)' && $line['symbol'] != 'Antenna' && $line['symbol'] != 'Cloudy' && $line['symbol'] != 'HF Gateway' && $line['symbol'] != 'Yagi At QTH' && $line['symbol'] != 'Digi' && $line['symbol'] != '8' && $line['symbol'] != 'MacAPRS') {
1969 // } elseif (isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && $line['symbol'] != 'Weather Station' && $line['symbol'] != 'House QTH (VHF)' && $line['symbol'] != 'Dot' && $line['symbol'] != 'TCP-IP' && $line['symbol'] != 'xAPRS (UNIX)' && $line['symbol'] != 'Antenna' && $line['symbol'] != 'Cloudy' && $line['symbol'] != 'HF Gateway' && $line['symbol'] != 'Yagi At QTH' && $line['symbol'] != 'Digi' && $line['symbol'] != '8' && $line['symbol'] != 'MacAPRS') {
1970 //echo '!!!!!!!!!!!!!!!! SEND !!!!!!!!!!!!!!!!!!!!'."\n";
1971 if (isset($globalTracker) && $globalTracker) $send = $TI->add($data);
1972 } elseif (!isset($line['stealth']) && is_numeric($data['latitude']) && is_numeric($data['longitude']) && isset($data['ident']) && isset($data['altitude'])) {
1973 if (!isset($data['altitude'])) $data['altitude'] = 0;
1974 $Source->deleteOldLocationByType('gs');
1975 if (count($Source->getLocationInfoByNameType($data['ident'],'gs')) > 0) {
1976 $Source->updateLocation($data['ident'],$data['latitude'],$data['longitude'],$data['altitude'],'','',$data['source_name'],'antenna.png','gs',$id,0,$data['datetime']);
1977 } else {
1978 $Source->addLocation($data['ident'],$data['latitude'],$data['longitude'],$data['altitude'],'','',$data['source_name'],'antenna.png','gs',$id,0,$data['datetime']);
1980 } elseif (isset($line['symbol']) && $line['symbol'] === 'Weather Station') {
1981 //if ($globalDebug) echo '!! Weather Station not yet supported'."\n";
1982 if ($globalDebug) echo '# Weather Station added'."\n";
1983 $Source->deleteOldLocationByType('wx');
1984 $weather_data = json_encode($line);
1985 if (count($Source->getLocationInfoByNameType($data['ident'],'wx')) > 0) {
1986 $Source->updateLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'wx.png','wx',$id,0,$data['datetime'],$weather_data);
1987 } else {
1988 $Source->addLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'wx.png','wx',$id,0,$data['datetime'],$weather_data);
1990 } elseif (isset($line['symbol']) && ($line['symbol'] === 'Lightning' || $line['symbol'] === 'Thunderstorm')) {
1991 //if ($globalDebug) echo '!! Weather Station not yet supported'."\n";
1992 if ($globalDebug) echo '☈ Lightning added'."\n";
1993 $Source->deleteOldLocationByType('lightning');
1994 if (count($Source->getLocationInfoByNameType($data['ident'],'lightning')) > 0) {
1995 $Source->updateLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'weather/thunderstorm.png','lightning',$id,0,$data['datetime'],$data['comment']);
1996 } else {
1997 $Source->addLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'weather/thunderstorm.png','lightning',$id,0,$data['datetime'],$data['comment']);
1999 } elseif ($globalDebug) {
2000 echo '/!\ Not added: '.$buffer."\n";
2001 print_r($line);
2003 unset($data);
2005 elseif (is_array($line) && isset($line['ident']) && $line['ident'] != '') {
2006 $Source->updateLocationDescByName($line['ident'],$line['source'],$id,$line['comment']);
2009 elseif (is_array($line) && $globalDebug && isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && ($line['symbol'] === 'Car' || $line['symbol'] === 'Ambulance' || $line['symbol'] === 'Van' || $line['symbol'] === 'Truck' || $line['symbol'] === 'Truck (18 Wheeler)' || $line['symbol'] === 'Motorcycle')) {
2010 echo '!! Car & Trucks not yet supported'."\n";
2013 //elseif ($line === false && $globalDebug) echo 'Ignored ('.$buffer.")\n";
2014 elseif ($line === true && $globalDebug) echo '!! Failed : '.$buffer."!!\n";
2015 if (isset($globalSources[$nb]['last_weather_clean']) && time()-$globalSources[$nb]['last_weather_clean'] > 60*5) {
2016 $Source->deleteOldLocationByType('lightning');
2017 $Source->deleteOldLocationByType('wx');
2018 $globalSources[$nb]['last_weather_clean'] = time();
2019 } elseif (!isset($globalSources[$nb]['last_weather_clean'])) {
2020 $globalSources[$nb]['last_weather_clean'] = time();
2023 } else {
2024 $line = explode(',', $buffer);
2025 //print_r($line);
2026 if (count($line) > 20) {
2027 $data['hex'] = $line[4];
2029 $data['datetime'] = $line[6].' '.$line[7];
2030 date_default_timezone_set($globalTimezone);
2031 $datetime = new DateTime($data['datetime']);
2032 $datetime->setTimezone(new DateTimeZone('UTC'));
2033 $data['datetime'] = $datetime->format('Y-m-d H:i:s');
2034 date_default_timezone_set('UTC');
2036 // Force datetime to current UTC datetime
2037 date_default_timezone_set('UTC');
2038 $data['datetime'] = date('Y-m-d H:i:s');
2039 $data['ident'] = trim($line[10]);
2040 $data['latitude'] = $line[14];
2041 $data['longitude'] = $line[15];
2042 $data['verticalrate'] = $line[16];
2043 $data['emergency'] = $line[20];
2044 $data['speed'] = $line[12];
2045 $data['squawk'] = $line[17];
2046 $data['altitude'] = $line[11];
2047 $data['heading'] = $line[13];
2048 $data['ground'] = $line[21];
2049 $data['emergency'] = $line[19];
2050 $data['format_source'] = 'sbs';
2051 if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
2052 elseif ($line[0] == 'MLAT') $data['source_name'] = 'MLAT';
2053 if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
2054 if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
2055 $data['id_source'] = $id_source;
2056 if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $send = $SI->add($data);
2057 else $error = true;
2058 unset($data);
2059 } else $error = true;
2060 if ($error) {
2061 if (count($line) > 1 && ($line[0] === 'STA' || $line[0] === 'AIR' || $line[0] === 'SEL' || $line[0] === 'ID' || $line[0] === 'CLK')) {
2062 if ($globalDebug) echo "Not a message. Ignoring... \n";
2063 } else {
2064 if ($globalDebug) echo "Wrong line format. Ignoring... \n";
2065 if ($globalDebug) {
2066 echo $buffer;
2067 //print_r($line);
2069 //socket_close($r);
2070 if ($globalDebug) echo "Reconnect after an error...\n";
2071 if ($format === 'aprs') $aprs_connect = 0;
2072 $sourceer[$nb] = $globalSources[$nb];
2073 connect_all($sourceer);
2074 $sourceer = array();
2078 // Sleep for xxx microseconds
2079 if (isset($globalSBSSleep)) usleep($globalSBSSleep);
2080 } else {
2081 if ($format === 'flightgearmp') {
2082 if ($globalDebug) echo "Reconnect FlightGear MP...";
2083 //@socket_close($r);
2084 sleep($globalMinFetch);
2085 $sourcefg[$nb] = $globalSources[$nb];
2086 connect_all($sourcefg);
2087 $sourcefg = array();
2088 break;
2090 } elseif ($format != 'acars' && $format != 'flightgearsp') {
2091 if (isset($tt[$format])) $tt[$format]++;
2092 else $tt[$format] = 0;
2093 if ($tt[$format] > 30 || $buffer === FALSE) {
2094 if ($globalDebug) echo "ERROR : Reconnect ".$format."...";
2095 //@socket_close($r);
2096 sleep(2);
2097 $aprs_connect = 0;
2098 $sourceee[$nb] = $globalSources[$nb];
2099 connect_all($sourceee);
2100 $sourceee = array();
2101 //connect_all($globalSources);
2102 $tt[$format]=0;
2103 break;
2105 //else if ($globalDebug) echo "Trying again (".$tt[$format]."x) ".$format."...";
2109 } else {
2110 $error = socket_strerror(socket_last_error());
2111 if (($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY && $error != 'Success') || (time() - $time >= $timeout && $error != 'Success')) {
2112 if ($globalDebug) echo "ERROR : socket_select give this error ".$error . "\n";
2113 if (isset($globalDebug)) echo "Restarting...\n";
2114 // Restart the script if possible
2115 if (is_array($sockets)) {
2116 if ($globalDebug) echo "Shutdown all sockets...";
2118 foreach ($sockets as $sock) {
2119 @socket_shutdown($sock,2);
2120 @socket_close($sock);
2124 if ($globalDebug) echo "Waiting...";
2125 sleep(2);
2126 $time = time();
2127 //connect_all($hosts);
2128 $aprs_connect = 0;
2129 if ($reset%5 === 0) sleep(20);
2130 if ($reset%10 === 0) sleep(100);
2131 if ($reset%20 === 0) sleep(200);
2132 if ($reset > 100) exit('Too many attempts...');
2133 if ($globalDebug) echo "Restart all connections...";
2134 connect_all($globalSources);
2138 if ($globalDaemon === false) {
2139 if ($globalDebug) echo 'Check all...'."\n";
2140 if (isset($SI)) $SI->checkAll();
2141 if (isset($TI)) $TI->checkAll();
2142 if (isset($MI)) $MI->checkAll();