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 = ''
. ''
. 'Track - %s bis %sTrack haltHolguin'
. '%s'
. '';
$track = 'Trackname %sTrackbeschreibung %s'
. ''
. '%s'
. ''
. '';
$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('%s', $res->latitude, $res->longitude, $res->altitude, $res->time);
$inner[] = sprintf('%s', $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;
}
}