Skip to content
Snippets Groups Projects
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);
        }
    }
}