SmartAPI.php 12.83 KiB
<?php
namespace SmartData\SmartAPI
{
require_once( __DIR__ . '/Logger.php');
require_once( __DIR__ . '/Backend.php');
require_once( __DIR__ . '/Packer.php');
use SmartData\SmartAPI\Internals\{JsonAPI, BinaryAPI};
use SmartData\Exception\{BadRequestException, RequestFailedException, InsertionFailedException, CreationFailedException};
use SmartData\{Series, SmartData, Backend, Logger};
use SmartData\Utility\{Pack,Unpack};
function health_check()
{
return Backend::health_check();
}
function get($content)
{
$json = json_decode($content, false, 512, JSON_BIGINT_AS_STRING);
if (json_last_error() === JSON_ERROR_NONE)
list($credentials,$series,$aggregator,$options) = JsonAPI::parse_get($json);
else
list($credentials,$series,$aggregator,$options) = BinaryAPI::parse_get($content);
if ($series instanceof Series) {
$backend = new Backend($credentials);
switch($series->version) {
case SmartData::STATIC_VERSION:
$return = $backend->query($series,$aggregator,$options);
break;
case SmartData::MOBILE_VERSION:
$return = $backend->track($series,$aggregator,$options);
break;
default:
throw new \Exception("Unsupported SmartData version [{$ver}]");
return null;
}
if($return != NULL){
$return = json_encode($return);
$return = preg_replace('/:"([0-9]*)"/',':$1',$return);
} else {
throw new RequestFailedException("Error processing request: null return");
}
} else {
throw new BadRequestException("Error parsing content request: invalid series");
}
return $return;
}
function put($content)
{
$json = json_decode($content, false, 512, JSON_BIGINT_AS_STRING);
if (json_last_error() === JSON_ERROR_NONE)
list($credentials,$smartdata_array,$params) = JsonAPI::parse_put($json);
else
list($credentials,$smartdata_array,$params) = BinaryAPI::parse_put($content);
$backend = new Backend($credentials);
foreach($smartdata_array as $smartdata) {
//if(REQUEST_CERT == 'A7B64D415BD3E97B' && $smartdata->unit()->is_digital())
//Logger::debug('smartlisha: '.$smartdata, true);
//if($smartdata->unit == 2224466212)
// Logger::debug('vibration: '.$smartdata, true);
//if($smartdata->unit == 2224199972)
// Logger::debug('sound: '.$smartdata, true);
if($smartdata->unit == 6488072){
//Logger::debug('mmmmmm: '.$smartdata, true);
//Logger::var_dump($smartdata->value, true);
//$value = $json->smartdata[0]->value;
//Logger::debug('json: '.$value, true);
//$value = base64_decode($value);
//Logger::debug('decoded: '.$value, true);
//Logger::debug('hex: '.bin2hex($value), true);
//Logger::debug('uint: '.Unpack::d64($value), true);
//$v = Unpack::d64($smartdata->value);
//Logger::debug('::'.$v, true);
}
//if($smartdata->unit == 196612)
// Logger::debug('CARD_READER::: '.$smartdata, true);
//else if($smartdata->unit == 2224180004 && false)
// Logger::debug('POWER::: '.$smartdata, true);
//else if($smartdata->unit == 262148)
// Logger::debug('DOOR::: '.$smartdata, true);
//else if(false)
// Logger::debug('SmartData: '.$smartdata, true);
//Logger::time_elapsed(true);
if(!$backend->insert($smartdata, ...$params)) {
throw new InsertionFailedException("Insertion Failed");
}
//Logger::time_elapsed();
}
}
function create($content)
{
$json = json_decode($content, false, 512, JSON_BIGINT_AS_STRING);
if (json_last_error() === JSON_ERROR_NONE)
list($credentials,$series,$params) = JsonAPI::parse_create($json);
else
list($credentials,$series,$params) = BinaryAPI::parse_create($content);
if ($series instanceof Series) {
Logger::debug("series ".$series, true);
$backend = new Backend($credentials);
if(!$backend->create($series, ...$params)){
throw new CreationFailedException("Creation Failed");
}
} else {
throw new BadRequestException("Error parsing content request: invalid series");
}
}
function attach($content)
{
$json = json_decode($content, false, 512, JSON_BIGINT_AS_STRING);
if (json_last_error() === JSON_ERROR_NONE)
list($credentials,$series,$params) = JsonAPI::parse_attach($json);
else
list($credentials,$series,$params) = BinaryAPI::parse_attach($content);
if ($series instanceof Series) {
$backend = new Backend($credentials);
if(!$backend->attach($series, ...$params)){
throw new CreationFailedException("Attachment Failed");
}
} else {
throw new BadRequestException("Error parsing content request: invalid series");
}
}
function batch($content)
{
$json = json_decode($content, false, 512, JSON_BIGINT_AS_STRING);
if (json_last_error() === JSON_ERROR_NONE)
throw new Exception\NotImplementedException("JSON-based import in batch has not been implemented yet");
else{
//list($credentials,$smartdata_array,$params) = BinaryAPI::parse_put($content);
$binary = $content;
$credentials = null;
if(!REQUEST_CERT){
$credentials = Credentials::unpack($binary);
if(!$credentials){
throw new BadRequestException("!CERT > Credentials cannot be null");
}
Logger::debug("sem CRT", true);
}else{
Logger::debug("com CRT", true);
}
$series = Series::unpack($binary);
$csdf = array();
$smartdata_array = array();
while($binary) {
$smartdata = SmartData::unpack($binary, $csdf);
//Logger::debug($smartdata, true);
if($smartdata instanceof SmartData)
array_push($smartdata_array, $smartdata);
}
$params = array();
$backend = new Backend($credentials);
if(!$backend->insertBatch($series, ...$smartdata_array)) {
Logger::debug("failure", true);
throw new Exception\InsertionFailedException("Insertion Failed");
}
}
}
}
namespace SmartData\SmartAPI\Internals
{
use SmartData\{Series,SmartData,Credentials,Logger};
trait JsonAPI
{
public function parse_get($json)
{
$credentials = null;
if(isset($json->credentials))
$credentials = Credentials::fromJson($json->credentials);
$series = Series::fromJson($json->series);
$aggregator = $json->aggregator ?? null;
$options = $json->options?? null;
return array($credentials, $series, $aggregator, $options);
}
public function parse_put($json)
{
////Logger::debug('JsonAPI', true);
$credentials = null;
$params = $smartdata_array = array();
if(isset($json->credentials))
$credentials = Credentials::fromJson($json->credentials);
$smartdata_set = $json->smartdata;
foreach($smartdata_set as $smartdata_fields) {
$smartdata = SmartData::fromJson($smartdata_fields);
if($smartdata instanceof SmartData)
array_push($smartdata_array, $smartdata);
}
return array($credentials, $smartdata_array, $params);
}
public function parse_create($json)
{
////Logger::debug('JsonAPI', true);
$credentials = null;
$params = array();
if(isset($json->credentials))
$credentials = Credentials::fromJson($json->credentials);
$series = Series::fromJson($json->series);
$aggregator = array($json->aggregator??null);
return array($credentials, $series, $params);
}
public function parse_attach($json)
{
////Logger::debug('JsonAPI', true);
$credentials = null;
$params = array();
if(isset($json->credentials))
$credentials = Credentials::fromJson($json->credentials);
$series = Series::fromJson($json->series);
$aggregator = array($json->aggregator??null);
return array($credentials, $series, $params);
}
}
}
namespace SmartData\SmartAPI\Internals
{
use SmartData\Exception\{BadRequestException};
use SmartData\{Series,SmartData,Credentials,Logger};
use SmartData\Utility\{Unpack};
trait BinaryAPI
{
public function parse_get($binary)
{
//Logger::debug('BinaryAPI', true);
$credentials = null;
$series = Series::unpack($binary);
$params = array();
$options = array();
return array($credentials, $series, $params, $options);
}
public function parse_put($binary)
{
//Logger::debug('BinaryAPI', true);
$credentials = null;
if(!REQUEST_CERT){
$credentials = Credentials::unpack($binary);
if(!$credentials){
throw new BadRequestException("!CERT > Credentials cannot be null");
}
}
// Common SmartData Fields Bitmap
// ------7-----------6-----------5-----------4-----------3-----------2-----------1-----------0-------
// | version | unit | error | confidence | x | y | z | dev |
// --< 1 bit >---< 1 bit >---< 1 bit >---< 1 bit >---< 1 bit >---< 1 bit >---< 1 bit >---< 1 bit >---
$csdf = array();
if(isset($_GET['csdf'])){
$csdf_bitmap = intval($_GET['csdf']);
if(($csdf_bitmap & (0b1 << 7)) != 0) $csdf = array_merge($csdf, array('version' => Unpack::uInt8($binary, true)));
if(($csdf_bitmap & (0b1 << 6)) != 0) $csdf = array_merge($csdf, array('unit' => Unpack::uInt32($binary, true)));
if(($csdf_bitmap & (0b1 << 5)) != 0) $csdf = array_merge($csdf, array('error' => Unpack::uInt8($binary, true)));
if(($csdf_bitmap & (0b1 << 4)) != 0) $csdf = array_merge($csdf, array('confidence' => Unpack::uInt8($binary, true)));
if(($csdf_bitmap & (0b1 << 3)) != 0) $csdf = array_merge($csdf, array('x' => Unpack::int32($binary, true)));
if(($csdf_bitmap & (0b1 << 2)) != 0) $csdf = array_merge($csdf, array('y' => Unpack::int32($binary, true)));
if(($csdf_bitmap & (0b1 << 1)) != 0) $csdf = array_merge($csdf, array('z' => Unpack::int32($binary, true)));
if(($csdf_bitmap & (0b1 << 0)) != 0) $csdf = array_merge($csdf, array('dev' => Unpack::uint32($binary, true)));
}
$smartdata_array = array();
while($binary) {
$smartdata = SmartData::unpack($binary, $csdf);
if($smartdata instanceof SmartData)
array_push($smartdata_array, $smartdata);
}
$params = array();
return array($credentials, $smartdata_array, $params);
}
public function parse_create($binary)
{
//Logger::debug('BinaryAPI', true);
$credentials = null;
if(!REQUEST_CERT){
$credentials = Credentials::unpack($binary);
if(!$credentials){
throw new BadRequestException("!CERT > Credentials cannot be null");
}
}
$series = Series::unpack($binary);
$params = array();
return array($credentials, $series, $params);
}
public function parse_attach($binary)
{
//Logger::debug('BinaryAPI', true);
$credentials = null;
if(!REQUEST_CERT){
$credentials = Credentials::unpack($binary);
if(!$credentials){
throw new BadRequestException("!CERT > Credentials cannot be null");
}
}
$series = Series::unpack($binary);
$params = array();
return array($credentials, $series, $params);
}
}
}