Added files
This commit is contained in:
213
lib.php
Normal file
213
lib.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
if ( ! defined('INCLUDER') { exit(0); }
|
||||
|
||||
if(getenv('DBNAME') === false){
|
||||
require_once __DIR__ . '/bootstrap.php';
|
||||
}
|
||||
function db_logging(string $type, string $raw_data, array $headers)
|
||||
{
|
||||
$pdo = Config::dbConnection();
|
||||
$pdo->exec("CREATE TABLE IF NOT EXISTS logging(
|
||||
id SERIAL PRIMARY KEY,
|
||||
request_type VARCHAR,
|
||||
inserted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
raw JSON,
|
||||
headers JSON,
|
||||
_get JSON,
|
||||
_post JSON
|
||||
)");
|
||||
$stmt = $pdo->prepare("INSERT INTO logging(raw, request_type, headers, _get, _post) VALUES(?, ?, ?, ?, ?)");
|
||||
$stmt->execute([$raw_data, $_GET['type'] ?? 'NN', json_encode($headers), json_encode($_GET), json_encode($_POST)]);
|
||||
}
|
||||
|
||||
class UplinkData
|
||||
{
|
||||
|
||||
public $raw;
|
||||
|
||||
public $altitude;
|
||||
public $longitude;
|
||||
public $latitude;
|
||||
public $uplink_token;
|
||||
public $request_type = 'uplink';
|
||||
public $_get;
|
||||
public $_post;
|
||||
public $_headers;
|
||||
public $time;
|
||||
public $device_id;
|
||||
|
||||
public function __construct(string $raw, array $headers)
|
||||
{
|
||||
$this->raw = $raw;
|
||||
$data = json_decode($raw);
|
||||
|
||||
$this->device_id = $data->end_device_ids->device_id;
|
||||
$this->time = $data->received_at;
|
||||
$this->_headers = json_encode($headers);
|
||||
$this->_post = json_encode($_POST);
|
||||
$this->_get = json_encode($_GET);
|
||||
$this->uplink_token = $data->uplink_message->rx_metadata[0]->uplink_token;
|
||||
$this->latitude = $data->uplink_message->rx_metadata[0]->location->latitude;
|
||||
$this->longitude = $data->uplink_message->rx_metadata[0]->location->longitude;
|
||||
$this->altitude = $data->uplink_message->rx_metadata[0]->location->altitude;
|
||||
#$this->latitude = $data->uplink_message->decoded_payload->latitude;
|
||||
#$this->altitude = $data->uplink_message->decoded_payload->altitude;
|
||||
#$this->longitude = $data->uplink_message->decoded_payload->longitude;
|
||||
}
|
||||
|
||||
public function write()
|
||||
{
|
||||
$pdo = Config::dbConnection();
|
||||
$stmt = $pdo->prepare("INSERT INTO tracks
|
||||
(
|
||||
raw, device_id, _get, _post, _headers, latitude,
|
||||
longitude, altitude, time, request_type, uplink_token
|
||||
)
|
||||
VALUES(
|
||||
?, ?, ?, ?, ?, ?,
|
||||
?, ?, ?, ?, ?
|
||||
)");
|
||||
$args = [
|
||||
$this->raw,
|
||||
$this->device_id,
|
||||
$this->_get,
|
||||
$this->_post,
|
||||
$this->_headers,
|
||||
$this->latitude,
|
||||
$this->longitude,
|
||||
$this->altitude,
|
||||
$this->time,
|
||||
$this->request_type,
|
||||
$this->uplink_token,
|
||||
];
|
||||
$stmt->execute($args);
|
||||
}
|
||||
|
||||
public static function get(string $device_id = '', string $from = '', string $to = ''): array
|
||||
{
|
||||
$pdo = Config::dbConnection();
|
||||
$from = $from ?: $_GET['from'] ?: date('Y-m-d H:i:s', time() - 3600 * 24);
|
||||
$to = $to ?: date('Y-m-d H:i:s');
|
||||
$sql = "SELECT * FROM tracks WHERE request_type = 'uplink' AND time BETWEEN ? AND ?";
|
||||
$args = [$from, $to];
|
||||
if ($device_id) {
|
||||
$sql .= " AND device_id = ?";
|
||||
$args[] = $device_id;
|
||||
}
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$res = $stmt->execute($args);
|
||||
$ret = [];
|
||||
if ($res) {
|
||||
$ret = [];
|
||||
foreach ($stmt->fetchAll(PDO::FETCH_OBJ) as $_) {
|
||||
if(!$_->device_id){
|
||||
continue;
|
||||
}
|
||||
if ( ! isset($ret[$_->device_id])) {
|
||||
$ret[$_->device_id] = [];
|
||||
}
|
||||
$ret[$_->device_id][] = $_;
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public static function makePositions(string $device_id = '',string $from = '', string $to='')
|
||||
{
|
||||
$data = self::get($device_id, $from, $to);
|
||||
$tracks = [];
|
||||
if ($data) {
|
||||
foreach ($data as $device_id => $resultset) {
|
||||
if(!isset($tracks[$device_id])){$tracks[$device_id] = [];}
|
||||
|
||||
foreach ($resultset as $res) {
|
||||
$raw = json_decode($res->raw);
|
||||
list($lat,$lon) = static::decodePayload($raw, $human);
|
||||
$tracks[$device_id][] = ['received_at' => $raw->received_at, 'lat' => $lat, 'lon' => $lon,];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return [$tracks, $human];
|
||||
|
||||
}
|
||||
|
||||
public static function makeGPX(string $device_id = '', string $from = '', string $to = ''): string
|
||||
{
|
||||
$root = '<?xml version="1.0" encoding="UTF-8" standalone="no" ?>'
|
||||
. '<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="Holguin" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
|
||||
. 'xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">'
|
||||
. '<metadata><name>Track - %s bis %s</name><desc>Track halt</desc><author><name>Holguin</name></author></metadata>'
|
||||
. '%s'
|
||||
. '</gpx>';
|
||||
$track = '<trk><name>Trackname %s</name><desc>Trackbeschreibung %s</desc>'
|
||||
. '<trkseg>'
|
||||
. '%s'
|
||||
. '</trkseg>'
|
||||
. '</trk>';
|
||||
$data = self::get($device_id, $from, $to);
|
||||
$tracks = [];
|
||||
if ($data) {
|
||||
foreach ($data as $device_id => $resultset) {
|
||||
|
||||
$inner = [];
|
||||
foreach ($resultset as $res) {
|
||||
$raw = json_decode($res->raw);
|
||||
list($lat,$lon) = static::decodePayload($raw);
|
||||
# $inner[] = sprintf('<trkpt lat="%s" lon="%s"><ele>%s</ele><time>%s</time></trkpt>', $res->latitude, $res->longitude, $res->altitude, $res->time);
|
||||
$inner[] = sprintf('<trkpt lat="%s" lon="%s"><ele>%s</ele><time>%s</time></trkpt>', $lat, $lon, 0, $raw->received_at);
|
||||
}
|
||||
$tracks[] = sprintf($track, $device_id, $device_id, join("\n", $inner));
|
||||
}
|
||||
|
||||
return sprintf($root,$from, $to, join("\n", $tracks));
|
||||
}
|
||||
return '';
|
||||
}
|
||||
public static function decodePayload($raw, &$human=[])
|
||||
{
|
||||
$payload=$raw->uplink_message->frm_payload;
|
||||
$human = file_get_contents('https://1m2m.eu/services/GETPAYLOAD?Human=0&PL='.bin2hex(base64_decode($payload)));
|
||||
$human = json_decode($human);
|
||||
if(isset($human->Lat) && isset($human->Lon)){
|
||||
return [str_replace(',','.',$human->Lat),str_replace(',','.',$human->Lon)];
|
||||
}
|
||||
return [0,0];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class Logging
|
||||
{
|
||||
public static function info($type, ...$_)
|
||||
{
|
||||
global $verbose;
|
||||
if ($verbose || $type == 'error') {
|
||||
file_put_contents("/tmp/track-$type.log", json_encode($_) . "\n", FILE_APPEND);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! function_exists('getallheaders')) {
|
||||
function getallheaders(): array
|
||||
{
|
||||
$headers = [
|
||||
'Content-type' => 'application/json',
|
||||
"X-Tts-Domain" => '',
|
||||
];
|
||||
foreach ($_SERVER as $name => $value) {
|
||||
if ($name != 'HTTP_MOD_REWRITE' && (substr($name, 0, 5) == 'HTTP_' || $name == 'CONTENT_LENGTH' || $name == 'CONTENT_TYPE')) {
|
||||
$name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', str_replace('HTTP_', '', $name)))));
|
||||
if ($name == 'Content-Type') {
|
||||
$name = 'Content-type';
|
||||
}
|
||||
$headers[$name] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $headers;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user