| @@ -0,0 +1,373 @@ | |||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Base Site URL | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | URL to your CodeIgniter root. Typically this will be your base URL, | |||||
| | WITH a trailing slash: | |||||
| | | |||||
| | http://example.com/ | |||||
| | | |||||
| | If this is not set then CodeIgniter will guess the protocol, domain and | |||||
| | path to your installation. | |||||
| | | |||||
| */ | |||||
| $config['base_url'] = "http://{$_SERVER['SERVER_NAME']}/"; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | HMVC modules folder location | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| */ | |||||
| $config['modules_locations'] = array( | |||||
| APPPATH.'modules/' => '../modules/', | |||||
| ); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Index File | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Typically this will be your index.php file, unless you've renamed it to | |||||
| | something else. If you are using mod_rewrite to remove the page set this | |||||
| | variable so that it is blank. | |||||
| | | |||||
| */ | |||||
| $config['index_page'] = 'ci_index.php'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | URI PROTOCOL | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This item determines which server global should be used to retrieve the | |||||
| | URI string. The default setting of 'AUTO' works for most servers. | |||||
| | If your links do not seem to work, try one of the other delicious flavors: | |||||
| | | |||||
| | 'AUTO' Default - auto detects | |||||
| | 'PATH_INFO' Uses the PATH_INFO | |||||
| | 'QUERY_STRING' Uses the QUERY_STRING | |||||
| | 'REQUEST_URI' Uses the REQUEST_URI | |||||
| | 'ORIG_PATH_INFO' Uses the ORIG_PATH_INFO | |||||
| | | |||||
| */ | |||||
| $config['uri_protocol'] = 'AUTO'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | URL suffix | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This option allows you to add a suffix to all URLs generated by CodeIgniter. | |||||
| | For more information please see the user guide: | |||||
| | | |||||
| | http://codeigniter.com/user_guide/general/urls.html | |||||
| */ | |||||
| $config['url_suffix'] = ''; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Default Language | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This determines which set of language files should be used. Make sure | |||||
| | there is an available translation if you intend to use something other | |||||
| | than english. | |||||
| | | |||||
| */ | |||||
| $config['language'] = 'english'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Default Character Set | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This determines which character set is used by default in various methods | |||||
| | that require a character set to be provided. | |||||
| | | |||||
| */ | |||||
| $config['charset'] = 'UTF-8'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Enable/Disable System Hooks | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | If you would like to use the 'hooks' feature you must enable it by | |||||
| | setting this variable to TRUE (boolean). See the user guide for details. | |||||
| | | |||||
| */ | |||||
| $config['enable_hooks'] = FALSE; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Class Extension Prefix | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This item allows you to set the filename/classname prefix when extending | |||||
| | native libraries. For more information please see the user guide: | |||||
| | | |||||
| | http://codeigniter.com/user_guide/general/core_classes.html | |||||
| | http://codeigniter.com/user_guide/general/creating_libraries.html | |||||
| | | |||||
| */ | |||||
| $config['subclass_prefix'] = 'CC_'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Allowed URL Characters | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This lets you specify with a regular expression which characters are permitted | |||||
| | within your URLs. When someone tries to submit a URL with disallowed | |||||
| | characters they will get a warning message. | |||||
| | | |||||
| | As a security measure you are STRONGLY encouraged to restrict URLs to | |||||
| | as few characters as possible. By default only these are allowed: a-z 0-9~%.:_- | |||||
| | | |||||
| | Leave blank to allow all characters -- but only if you are insane. | |||||
| | | |||||
| | DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! | |||||
| | | |||||
| */ | |||||
| $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Enable Query Strings | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | By default CodeIgniter uses search-engine friendly segment based URLs: | |||||
| | example.com/who/what/where/ | |||||
| | | |||||
| | By default CodeIgniter enables access to the $_GET array. If for some | |||||
| | reason you would like to disable it, set 'allow_get_array' to FALSE. | |||||
| | | |||||
| | You can optionally enable standard query string based URLs: | |||||
| | example.com?who=me&what=something&where=here | |||||
| | | |||||
| | Options are: TRUE or FALSE (boolean) | |||||
| | | |||||
| | The other items let you set the query string 'words' that will | |||||
| | invoke your controllers and its functions: | |||||
| | example.com/index.php?c=controller&m=function | |||||
| | | |||||
| | Please note that some of the helpers won't work as expected when | |||||
| | this feature is enabled, since CodeIgniter is designed primarily to | |||||
| | use segment based URLs. | |||||
| | | |||||
| */ | |||||
| $config['allow_get_array'] = TRUE; | |||||
| $config['enable_query_strings'] = FALSE; | |||||
| $config['controller_trigger'] = 'c'; | |||||
| $config['function_trigger'] = 'm'; | |||||
| $config['directory_trigger'] = 'd'; // experimental not currently in use | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Error Logging Threshold | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | If you have enabled error logging, you can set an error threshold to | |||||
| | determine what gets logged. Threshold options are: | |||||
| | You can enable error logging by setting a threshold over zero. The | |||||
| | threshold determines what gets logged. Threshold options are: | |||||
| | | |||||
| | 0 = Disables logging, Error logging TURNED OFF | |||||
| | 1 = Error Messages (including PHP errors) | |||||
| | 2 = Debug Messages | |||||
| | 3 = Informational Messages | |||||
| | 4 = All Messages | |||||
| | | |||||
| | For a live site you'll usually only enable Errors (1) to be logged otherwise | |||||
| | your log files will fill up very fast. | |||||
| | | |||||
| */ | |||||
| $config['log_threshold'] = 0; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Error Logging Directory Path | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Leave this BLANK unless you would like to set something other than the default | |||||
| | application/logs/ folder. Use a full server path with trailing slash. | |||||
| | | |||||
| */ | |||||
| $config['log_path'] = ''; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Date Format for Logs | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Each item that is logged has an associated date. You can use PHP date | |||||
| | codes to set your own date formatting | |||||
| | | |||||
| */ | |||||
| $config['log_date_format'] = 'Y-m-d H:i:s'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Cache Directory Path | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Leave this BLANK unless you would like to set something other than the default | |||||
| | system/cache/ folder. Use a full server path with trailing slash. | |||||
| | | |||||
| */ | |||||
| $config['cache_path'] = ''; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Encryption Key | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | If you use the Encryption class or the Session class you | |||||
| | MUST set an encryption key. See the user guide for info. | |||||
| | | |||||
| */ | |||||
| $config['encryption_key'] = '123456'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Session Variables | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | 'sess_cookie_name' = the name you want for the cookie | |||||
| | 'sess_expiration' = the number of SECONDS you want the session to last. | |||||
| | by default sessions last 7200 seconds (two hours). Set to zero for no expiration. | |||||
| | 'sess_expire_on_close' = Whether to cause the session to expire automatically | |||||
| | when the browser window is closed | |||||
| | 'sess_encrypt_cookie' = Whether to encrypt the cookie | |||||
| | 'sess_use_database' = Whether to save the session data to a database | |||||
| | 'sess_table_name' = The name of the session database table | |||||
| | 'sess_match_ip' = Whether to match the user's IP address when reading the session data | |||||
| | 'sess_match_useragent' = Whether to match the User Agent when reading the session data | |||||
| | 'sess_time_to_update' = how many seconds between CI refreshing Session Information | |||||
| | | |||||
| */ | |||||
| $config['sess_cookie_name'] = 'ci_session'; | |||||
| $config['sess_expiration'] = 7200; | |||||
| $config['sess_expire_on_close'] = FALSE; | |||||
| $config['sess_encrypt_cookie'] = FALSE; | |||||
| $config['sess_use_database'] = FALSE; | |||||
| $config['sess_table_name'] = 'ci_sessions'; | |||||
| $config['sess_match_ip'] = FALSE; | |||||
| $config['sess_match_useragent'] = TRUE; | |||||
| $config['sess_time_to_update'] = 300; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Cookie Related Variables | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | 'cookie_prefix' = Set a prefix if you need to avoid collisions | |||||
| | 'cookie_domain' = Set to .your-domain.com for site-wide cookies | |||||
| | 'cookie_path' = Typically will be a forward slash | |||||
| | 'cookie_secure' = Cookies will only be set if a secure HTTPS connection exists. | |||||
| | | |||||
| */ | |||||
| $config['cookie_prefix'] = ""; | |||||
| $config['cookie_domain'] = ""; | |||||
| $config['cookie_path'] = "/"; | |||||
| $config['cookie_secure'] = FALSE; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Global XSS Filtering | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Determines whether the XSS filter is always active when GET, POST or | |||||
| | COOKIE data is encountered | |||||
| | | |||||
| */ | |||||
| $config['global_xss_filtering'] = FALSE; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Cross Site Request Forgery | |||||
| |-------------------------------------------------------------------------- | |||||
| | Enables a CSRF cookie token to be set. When set to TRUE, token will be | |||||
| | checked on a submitted form. If you are accepting user data, it is strongly | |||||
| | recommended CSRF protection be enabled. | |||||
| | | |||||
| | 'csrf_token_name' = The token name | |||||
| | 'csrf_cookie_name' = The cookie name | |||||
| | 'csrf_expire' = The number in seconds the token should expire. | |||||
| */ | |||||
| $config['csrf_protection'] = FALSE; | |||||
| $config['csrf_token_name'] = 'csrf_test_name'; | |||||
| $config['csrf_cookie_name'] = 'csrf_cookie_name'; | |||||
| $config['csrf_expire'] = 7200; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Output Compression | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Enables Gzip output compression for faster page loads. When enabled, | |||||
| | the output class will test whether your server supports Gzip. | |||||
| | Even if it does, however, not all browsers support compression | |||||
| | so enable only if you are reasonably sure your visitors can handle it. | |||||
| | | |||||
| | VERY IMPORTANT: If you are getting a blank page when compression is enabled it | |||||
| | means you are prematurely outputting something to your browser. It could | |||||
| | even be a line of whitespace at the end of one of your scripts. For | |||||
| | compression to work, nothing can be sent before the output buffer is called | |||||
| | by the output class. Do not 'echo' any values with compression enabled. | |||||
| | | |||||
| */ | |||||
| $config['compress_output'] = FALSE; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Master Time Reference | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Options are 'local' or 'gmt'. This pref tells the system whether to use | |||||
| | your server's local time as the master 'now' reference, or convert it to | |||||
| | GMT. See the 'date helper' page of the user guide for information | |||||
| | regarding date handling. | |||||
| | | |||||
| */ | |||||
| $config['time_reference'] = 'local'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Rewrite PHP Short Tags | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | If your PHP installation does not have short tag support enabled CI | |||||
| | can rewrite the tags on-the-fly, enabling you to utilize that syntax | |||||
| | in your view files. Options are TRUE or FALSE (boolean) | |||||
| | | |||||
| */ | |||||
| $config['rewrite_short_tags'] = FALSE; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Reverse Proxy IPs | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | If your server is behind a reverse proxy, you must whitelist the proxy IP | |||||
| | addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR | |||||
| | header in order to properly identify the visitor's IP address. | |||||
| | Comma-delimited, e.g. '10.0.1.200,10.0.1.201' | |||||
| | | |||||
| */ | |||||
| $config['proxy_ips'] = ''; | |||||
| /* End of file config.php */ | |||||
| /* Location: ./application/config/config.php */ | |||||
| @@ -2,73 +2,12 @@ | |||||
| /* | /* | ||||
| file: carpark.php 停車管理 | file: carpark.php 停車管理 | ||||
| */ | */ | ||||
| if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | |||||
| require_once(MQ_CLASS_FILE); | |||||
| // ----- 定義常數(路徑, cache秒數) ----- | |||||
| define('APP_VERSION', '100'); // 版本號 | |||||
| define('MAX_AGE', 604800); // cache秒數, 此定義1個月 | |||||
| define('APP_NAME', 'carpark'); // 應用系統名稱 | |||||
| define('PAGE_PATH', APP_BASE.'ci_application/views/'.APP_NAME.'/'); // path of views | |||||
| //define('SERVER_URL', 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost').'/'); // URL | |||||
| define('SERVER_URL', 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost') . ($_SERVER['SERVER_PORT'] != 60123 ? ':' . $_SERVER['SERVER_PORT'] : '') .'/'); // URL | |||||
| define('APP_URL', SERVER_URL.APP_NAME.'.html/'); // controller路徑 | |||||
| define('WEB_URL', SERVER_URL.APP_NAME.'/'); // 網頁路徑 | |||||
| define('WEB_LIB', SERVER_URL.'libs/'); // 網頁lib | |||||
| define('BOOTSTRAPS', WEB_LIB.'bootstrap_sb/'); // bootstrap lib | |||||
| define('LOG_PATH', FILE_BASE.APP_NAME.'/logs/'); // log path | |||||
| class Carpark extends CI_Controller | |||||
| class Carpark extends CC_Controller | |||||
| { | { | ||||
| var $vars = array(); // 共用變數 | |||||
| function __construct() | function __construct() | ||||
| { | { | ||||
| parent::__construct(); | |||||
| // ----- 程式開發階段log設定 ----- | |||||
| if (@ENVIRONMENT == 'development') | |||||
| { | |||||
| ini_set('display_errors', '1'); | |||||
| //error_reporting(E_ALL ^ E_NOTICE); | |||||
| error_reporting(E_ALL); | |||||
| } | |||||
| set_error_handler(array($this, 'error_handler'), E_ALL); // 資料庫異動需做log | |||||
| // 共用記憶體 | |||||
| $this->vars['mcache'] = new Memcache; | |||||
| $this->vars['mcache']->connect(MEMCACHE_HOST, MEMCACHE_PORT) or die ('Could not connect memcache'); | |||||
| /* | |||||
| // mqtt subscribe | |||||
| $this->vars['mqtt'] = new phpMQTT(MQ_HOST, MQ_PORT, uniqid()); | |||||
| //if(!$this->vars['mqtt']->connect()){ die ('Could not connect mqtt'); } | |||||
| $this->vars['mqtt']->connect(); | |||||
| */ | |||||
| $this->load->model('carpark_model'); | |||||
| $this->carpark_model->init($this->vars); | |||||
| // 資料介接模組 | |||||
| $this->load->model('sync_data_model'); | |||||
| $this->sync_data_model->init($this->vars); // for memcache | |||||
| // mqtt subscribe | |||||
| $station_setting = $this->sync_data_model->station_setting_query(); | |||||
| $mqtt_ip = isset($station_setting['mqtt_ip']) ? $station_setting['mqtt_ip'] : MQ_HOST; | |||||
| $mqtt_port = isset($station_setting['mqtt_port']) ? $station_setting['mqtt_port'] : MQ_PORT; | |||||
| $this->vars['mqtt'] = new phpMQTT($mqtt_ip, $mqtt_port, uniqid()); | |||||
| $this->vars['mqtt']->connect(); | |||||
| // init again | |||||
| $this->sync_data_model->init($this->vars); // for mqtt | |||||
| // 產生 excel 報表 | |||||
| $this->load->model('excel_model'); | |||||
| $this->excel_model->init($this->vars); | |||||
| parent::__construct('carpark'); | |||||
| // [START] 2016/06/03 登入 | |||||
| $this->load->model('user_model'); | |||||
| // load library | // load library | ||||
| $this->load->library(array('form_validation','session')); | $this->load->library(array('form_validation','session')); | ||||
| // load helpers | // load helpers | ||||
| @@ -77,73 +16,14 @@ class Carpark extends CI_Controller | |||||
| define('RESULT_SUCCESS', 'ok'); | define('RESULT_SUCCESS', 'ok'); | ||||
| define('RESULT_FORM_VALIDATION_FAIL', '-1'); | define('RESULT_FORM_VALIDATION_FAIL', '-1'); | ||||
| define('RESULE_FAIL', 'gg'); | define('RESULE_FAIL', 'gg'); | ||||
| // [START] 2016/06/03 登入 | |||||
| } | } | ||||
| // 發生錯誤時集中在此處理 | |||||
| public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) | |||||
| { | |||||
| // ex: car_err://message.... | |||||
| $log_msg = explode('://', $errstr); | |||||
| if (count($log_msg) > 1) | |||||
| { | |||||
| $log_file = LOG_PATH.$log_msg[0]; | |||||
| $str = date('H:i:s')."|{$log_msg[1]}|{$errfile}|{$errline}|{$errno}\n"; | |||||
| } | |||||
| else | |||||
| { | |||||
| $log_file = LOG_PATH.APP_NAME; | |||||
| $str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n"; | |||||
| } | |||||
| //$str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n"; | |||||
| error_log($str, 3, $log_file . '.' . date('Ymd').'.log.txt'); // 3代表參考後面的檔名 | |||||
| } | |||||
| // 顯示靜態網頁(html檔) | |||||
| protected function show_page($page_name, &$data = null) | |||||
| { | |||||
| $page_file = PAGE_PATH.$page_name.'.php'; | |||||
| $last_modified_time = filemtime($page_file); | |||||
| // 若檔案修改時間沒有異動, 或版本無異動, 通知瀏覽器使用cache, 不再下傳網頁 | |||||
| // header('Cache-Control:max-age='.MAX_AGE); // cache 1個月 | |||||
| header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_modified_time).' GMT'); | |||||
| header('Etag: '. APP_VERSION); | |||||
| header('Cache-Control: public'); | |||||
| // 20170921 | |||||
| header("cache-Control: no-store, no-cache, must-revalidate"); | |||||
| header("cache-Control: post-check=0, pre-check=0", false); | |||||
| header("Pragma: no-cache"); | |||||
| header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); | |||||
| if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == APP_VERSION && @strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time) | |||||
| { | |||||
| header('HTTP/1.1 304 Not Modified'); | |||||
| } | |||||
| else | |||||
| { | |||||
| $this->load->view(APP_NAME.'/'.$page_name, $data); | |||||
| } | |||||
| } | |||||
| // ------------------------------------------------ | // ------------------------------------------------ | ||||
| // | // | ||||
| // CRM (START) | // CRM (START) | ||||
| // | // | ||||
| // ------------------------------------------------ | // ------------------------------------------------ | ||||
| // [test] ACTI crm alert | |||||
| public function gen_test_alert() | |||||
| { | |||||
| echo 'test_alert'; | |||||
| } | |||||
| // [test] zzz | // [test] zzz | ||||
| public function gen_test_case() | public function gen_test_case() | ||||
| { | { | ||||
| @@ -203,11 +83,8 @@ class Carpark extends CI_Controller | |||||
| trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true)); | trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true)); | ||||
| // 載入模組 | |||||
| $this->load->model('cars_model'); | |||||
| $this->cars_model->init($this->vars); | |||||
| $this->cars_model->lprio($parms); | |||||
| // 執行 | |||||
| $this->app_model('cars')->lprio($parms); | |||||
| echo 'ok'; | echo 'ok'; | ||||
| exit; | exit; | ||||
| } | } | ||||
| @@ -229,11 +106,11 @@ class Carpark extends CI_Controller | |||||
| trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true)); | trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true)); | ||||
| // 載入模組 | |||||
| $this->load->model('cars_model'); | |||||
| $this->cars_model->init($this->vars); | |||||
| $this->cars_model->opendoor_lprio($parms); | |||||
| // 初始 mqtt | |||||
| $this->init_mqtt(); | |||||
| // 執行 | |||||
| $this->app_model('cars')->opendoor_lprio($parms); | |||||
| echo 'ok'; | echo 'ok'; | ||||
| exit; | exit; | ||||
| } | } | ||||
| @@ -255,22 +132,22 @@ class Carpark extends CI_Controller | |||||
| trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true)); | trigger_error($LOG_FLAG . __FUNCTION__ . '..' . print_r($parms, true)); | ||||
| // 載入模組 | |||||
| $this->load->model('cars_model'); | |||||
| $this->cars_model->init($this->vars); | |||||
| // 初始 mqtt | |||||
| $this->init_mqtt(); | |||||
| // 判斷會員身份 | // 判斷會員身份 | ||||
| $rows = $this->cars_model->get_member($lpr); | |||||
| $cars_model = $this->app_model('cars'); | |||||
| $rows = $cars_model->get_member($lpr); | |||||
| if ($rows['member_no'] == 0) | if ($rows['member_no'] == 0) | ||||
| { | { | ||||
| $parms['ck'] = $this->cars_model->gen_opendoor_ck($parms, 'temp_opendoors'); // 臨停訊號 | |||||
| $this->cars_model->do_temp_opendoor($parms); | |||||
| $parms['ck'] = $cars_model->gen_opendoor_ck($parms, 'temp_opendoors'); // 臨停訊號 | |||||
| $cars_model->do_temp_opendoor($parms); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| $parms['ck'] = $this->cars_model->gen_opendoor_ck($parms, 'member_opendoors'); // 月租訊號 | |||||
| $this->cars_model->do_member_opendoor($parms); | |||||
| $parms['ck'] = $cars_model->gen_opendoor_ck($parms, 'member_opendoors'); // 月租訊號 | |||||
| $cars_model->do_member_opendoor($parms); | |||||
| } | } | ||||
| echo 'ok'; | echo 'ok'; | ||||
| @@ -301,8 +178,10 @@ class Carpark extends CI_Controller | |||||
| if($topic == 'altob.888.mqtt') | if($topic == 'altob.888.mqtt') | ||||
| { | { | ||||
| $data_model = $this->data_model(); | |||||
| // 第一個場站編號 先不管場站 | // 第一個場站編號 先不管場站 | ||||
| $station_setting = $this->sync_data_model->station_setting_query(); | |||||
| $station_setting = $data_model->station_setting_query(); | |||||
| $station_no_arr = explode(SYNC_DELIMITER_ST_NO, $station_setting['station_no']); | $station_no_arr = explode(SYNC_DELIMITER_ST_NO, $station_setting['station_no']); | ||||
| $first_station_no = $station_no_arr[0]; | $first_station_no = $station_no_arr[0]; | ||||
| @@ -325,7 +204,7 @@ class Carpark extends CI_Controller | |||||
| $msg_arr = explode(',', $msg); | $msg_arr = explode(',', $msg); | ||||
| $group_id = isset($msg_arr[1]) && $msg_arr[1] == 2 ? 'M888' : 'C888'; | $group_id = isset($msg_arr[1]) && $msg_arr[1] == 2 ? 'M888' : 'C888'; | ||||
| $value = isset($msg_arr[2]) ? $msg_arr[2] : 0; | $value = isset($msg_arr[2]) ? $msg_arr[2] : 0; | ||||
| $result = $this->sync_data_model->force_sync_888($first_station_no, $group_id, $value); | |||||
| $result = $data_model->force_sync_888($first_station_no, $group_id, $value); | |||||
| trigger_error($LOG_FLAG . __FUNCTION__ . "..{$first_station_no}|{$group_id}|{$value}..result..{$result}.."); | trigger_error($LOG_FLAG . __FUNCTION__ . "..{$first_station_no}|{$group_id}|{$value}..result..{$result}.."); | ||||
| } | } | ||||
| @@ -338,9 +217,11 @@ class Carpark extends CI_Controller | |||||
| { | { | ||||
| $reload = $this->input->post('reload', true); | $reload = $this->input->post('reload', true); | ||||
| $data_model = $this->data_model(); | |||||
| if(isset($reload) && $reload > 0) | if(isset($reload) && $reload > 0) | ||||
| { | { | ||||
| $station_setting = $this->sync_data_model->station_setting_query(true); // 強制重新載入 | |||||
| $station_setting = $data_model->station_setting_query(true); // 強制重新載入 | |||||
| trigger_error(__FUNCTION__ . '..station_setting: '. print_r($station_setting, true)); | trigger_error(__FUNCTION__ . '..station_setting: '. print_r($station_setting, true)); | ||||
| if(!$station_setting) | if(!$station_setting) | ||||
| @@ -352,30 +233,30 @@ class Carpark extends CI_Controller | |||||
| usleep(300000); // 0.3 sec delay | usleep(300000); // 0.3 sec delay | ||||
| // 費率資料同步 | // 費率資料同步 | ||||
| $result = $this->sync_data_model->sync_price_plan(array('station_no_arr' => $station_setting['station_no'])); | |||||
| $result = $data_model->sync_price_plan(array('station_no_arr' => $station_setting['station_no'])); | |||||
| trigger_error(__FUNCTION__ . '..sync_price_plan: '. $result); | trigger_error(__FUNCTION__ . '..sync_price_plan: '. $result); | ||||
| usleep(300000); // 0.3 sec delay | usleep(300000); // 0.3 sec delay | ||||
| // 會員資料同步 | // 會員資料同步 | ||||
| $result = $this->sync_data_model->sync_members(array('station_no_arr' => $station_setting['station_no_list'])); // 20171116 upd | |||||
| $result = $data_model->sync_members(array('station_no_arr' => $station_setting['station_no_list'])); // 20171116 upd | |||||
| trigger_error(__FUNCTION__ . '..sync_members: '. $result); | trigger_error(__FUNCTION__ . '..sync_members: '. $result); | ||||
| usleep(300000); // 0.3 sec delay | usleep(300000); // 0.3 sec delay | ||||
| // 歐pa卡同步 | // 歐pa卡同步 | ||||
| $result = $this->sync_data_model->sync_allpa_user(array('station_no_arr' => $station_setting['station_no'])); | |||||
| $result = $data_model->sync_allpa_user(array('station_no_arr' => $station_setting['station_no'])); | |||||
| trigger_error(__FUNCTION__ . '..sync_allpa_user: '. $result); | trigger_error(__FUNCTION__ . '..sync_allpa_user: '. $result); | ||||
| usleep(300000); // 0.3 sec delay | usleep(300000); // 0.3 sec delay | ||||
| // 在席資料同步 | // 在席資料同步 | ||||
| $result = $this->sync_data_model->sync_pks_groups_reload($station_setting); | |||||
| $result = $data_model->sync_pks_groups_reload($station_setting); | |||||
| trigger_error(__FUNCTION__ . '..sync_pks_groups_reload: '. $result); | trigger_error(__FUNCTION__ . '..sync_pks_groups_reload: '. $result); | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| $station_setting = $this->sync_data_model->station_setting_query(false); | |||||
| $station_setting = $data_model->station_setting_query(false); | |||||
| if(!$station_setting) | if(!$station_setting) | ||||
| { | { | ||||
| @@ -414,24 +295,26 @@ class Carpark extends CI_Controller | |||||
| } | } | ||||
| } | } | ||||
| $data_model = $this->data_model(); | |||||
| // 0. 取得場站設定 | // 0. 取得場站設定 | ||||
| $station_setting = $this->sync_data_model->station_setting_query(false); | |||||
| $station_setting = $data_model->station_setting_query(false); | |||||
| trigger_error(__FUNCTION__ . '..station_setting: '. print_r($station_setting, true)); | trigger_error(__FUNCTION__ . '..station_setting: '. print_r($station_setting, true)); | ||||
| $station_no_arr = array('station_no_arr' => $station_setting['station_no']); | $station_no_arr = array('station_no_arr' => $station_setting['station_no']); | ||||
| // 1. 月租系統 | // 1. 月租系統 | ||||
| $result = $this->sync_data_model->sync_members($station_no_arr); | |||||
| $result = $data_model->sync_members($station_no_arr); | |||||
| trigger_error(__FUNCTION__ . '..sync_members: '. $result); | trigger_error(__FUNCTION__ . '..sync_members: '. $result); | ||||
| // 2. 同步車牌更換 | // 2. 同步車牌更換 | ||||
| if(!empty($switch_lpr_arr)) | if(!empty($switch_lpr_arr)) | ||||
| { | { | ||||
| $this->sync_data_model->sync_switch_lpr($switch_lpr_arr); | |||||
| $data_model->sync_switch_lpr($switch_lpr_arr); | |||||
| } | } | ||||
| // 3. 歐pa卡同步 (TODO: 暫時放在這) | // 3. 歐pa卡同步 (TODO: 暫時放在這) | ||||
| $result = $this->sync_data_model->sync_allpa_user($station_no_arr); | |||||
| $result = $data_model->sync_allpa_user($station_no_arr); | |||||
| trigger_error(__FUNCTION__ . '..sync_allpa_user: '. $result); | trigger_error(__FUNCTION__ . '..sync_allpa_user: '. $result); | ||||
| } | } | ||||
| @@ -452,7 +335,7 @@ class Carpark extends CI_Controller | |||||
| exit; | exit; | ||||
| } | } | ||||
| $data = $this->sync_data_model->get_last_unbalanced_cario($lpr, $station_no); | |||||
| $data = $this->data_model()->get_last_unbalanced_cario($lpr, $station_no); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | echo json_encode($data, JSON_UNESCAPED_UNICODE); | ||||
| } | } | ||||
| @@ -476,48 +359,17 @@ class Carpark extends CI_Controller | |||||
| } | } | ||||
| // 臨停繳費 | // 臨停繳費 | ||||
| $this->load->model('carpayment_model'); | |||||
| echo $this->carpayment_model->p2payed(array('seqno' => $cario_no, 'lpr' => $lpr, 'amt' => $amt), true); | |||||
| echo $this->app_model('carpayment')->p2payed(array('seqno' => $cario_no, 'lpr' => $lpr, 'amt' => $amt), true); | |||||
| exit; | exit; | ||||
| //echo 'ok'; | |||||
| } | |||||
| // 驗証 IP | |||||
| function is_ip_valid() | |||||
| { | |||||
| $client_ip = $this->my_ip(); | |||||
| if(!in_array($client_ip, array('61.219.172.11', '61.219.172.82'))) | |||||
| { | |||||
| trigger_error('..block..from:'.$client_ip.'..unknown network..'); | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| // 取得 IP | |||||
| function my_ip() | |||||
| { | |||||
| if (getenv('HTTP_X_FORWARDED_FOR')) | |||||
| { | |||||
| $ip = getenv('HTTP_X_FORWARDED_FOR'); | |||||
| } | |||||
| elseif (getenv('HTTP_X_REAL_IP')) | |||||
| { | |||||
| $ip = getenv('HTTP_X_REAL_IP'); | |||||
| } | |||||
| else { | |||||
| $ip = $_SERVER['REMOTE_ADDR']; | |||||
| } | |||||
| return $ip; | |||||
| } | } | ||||
| // 同步 (由排程呼叫) | // 同步 (由排程呼叫) | ||||
| public function sync_minutely() | public function sync_minutely() | ||||
| { | { | ||||
| $this->sync_data_model->sync_pks_groups(); // 同步在席現況 | |||||
| $this->data_model()->sync_pks_groups(); // 同步在席現況 | |||||
| } | } | ||||
| /* | |||||
| // 20170816 手動新增入場資料 | // 20170816 手動新增入場資料 | ||||
| public function gen_carin() | public function gen_carin() | ||||
| { | { | ||||
| @@ -546,6 +398,7 @@ class Carpark extends CI_Controller | |||||
| $this->carpark_model->gen_carin($parms); | $this->carpark_model->gen_carin($parms); | ||||
| echo 'ok'; | echo 'ok'; | ||||
| } | } | ||||
| */ | |||||
| // ------------------------------------------------ | // ------------------------------------------------ | ||||
| // | // | ||||
| @@ -602,7 +455,7 @@ class Carpark extends CI_Controller | |||||
| 'pswd' => $this->input->post('pswd', true) | 'pswd' => $this->input->post('pswd', true) | ||||
| ); | ); | ||||
| $result = $this->user_model->user_login($data); | |||||
| $result = $this->app_model('user')->user_login($data); | |||||
| if($result) | if($result) | ||||
| { | { | ||||
| @@ -636,29 +489,14 @@ class Carpark extends CI_Controller | |||||
| /* | |||||
| // response http | // response http | ||||
| protected function http_return($return_code, $type) | protected function http_return($return_code, $type) | ||||
| { | { | ||||
| if ($type == 'text') echo $return_code; | if ($type == 'text') echo $return_code; | ||||
| else echo json_encode($return_code, JSON_UNESCAPED_UNICODE); | else echo json_encode($return_code, JSON_UNESCAPED_UNICODE); | ||||
| } | |||||
| // 送出html code | |||||
| public function get_html() | |||||
| { | |||||
| /* | |||||
| $data = array | |||||
| ( | |||||
| 'company_no' => $this->input->post('company_no', true), // 場站統編 | |||||
| 'hq_company_no' => '80682490' | |||||
| ); | |||||
| $this->load->view(APP_NAME.'/'.$this->input->post('tag_name', true), $data); | |||||
| */ | |||||
| $this->load->view(APP_NAME.'/'.$this->input->post('tag_name', true), array()); | |||||
| } | |||||
| } | |||||
| // 讀取cookie內容 | // 讀取cookie內容 | ||||
| protected function get_cookie($cookie_name) | protected function get_cookie($cookie_name) | ||||
| @@ -667,7 +505,6 @@ class Carpark extends CI_Controller | |||||
| return(json_decode($_COOKIE[$cookie_name], true)); | return(json_decode($_COOKIE[$cookie_name], true)); | ||||
| } | } | ||||
| // 儲存cookie內容 | // 儲存cookie內容 | ||||
| protected function save_cookie($cookie_name, $cookie_info) | protected function save_cookie($cookie_name, $cookie_info) | ||||
| { | { | ||||
| @@ -692,7 +529,6 @@ class Carpark extends CI_Controller | |||||
| $data = $this->carpark_model->available_set(); | $data = $this->carpark_model->available_set(); | ||||
| $this->http_return($data, 'json'); | $this->http_return($data, 'json'); | ||||
| } | } | ||||
| // 剩餘車位數更新 | // 剩餘車位數更新 | ||||
| public function available_update() | public function available_update() | ||||
| @@ -704,7 +540,6 @@ class Carpark extends CI_Controller | |||||
| $this->http_return($this->carpark_model->available_update($station_no, $data), 'json'); | $this->http_return($this->carpark_model->available_update($station_no, $data), 'json'); | ||||
| } | } | ||||
| // 剩餘車位數查核 | // 剩餘車位數查核 | ||||
| public function available_check() | public function available_check() | ||||
| @@ -713,21 +548,6 @@ class Carpark extends CI_Controller | |||||
| $this->http_return($this->carpark_model->available_check($time_point), 'json'); | $this->http_return($this->carpark_model->available_check($time_point), 'json'); | ||||
| } | } | ||||
| // 顯示logs | |||||
| public function show_logs() | |||||
| { | |||||
| $lines = $this->uri->segment(3); // 顯示行數 | |||||
| if (empty($lines)) $lines = 140; // 無行數參數, 預設為40行 | |||||
| if($lines > 1000) $lines = 1000; // 最多 1000行 | |||||
| // echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><pre style="white-space: pre-wrap;">'; | |||||
| echo '<html lang="zh-TW"><body><pre style="white-space: pre-wrap;">'; | |||||
| passthru('/usr/bin/tail -n ' . $lines . ' ' . LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt'); // 利用linux指令顯示倒數幾行的logs內容 | |||||
| echo "\n----- " . LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt' . ' -----'; | |||||
| echo '</pre></body></html>'; | |||||
| } | |||||
| // 顯示logs (cars grep 888) | // 顯示logs (cars grep 888) | ||||
| public function show_888_logs() | public function show_888_logs() | ||||
| @@ -745,8 +565,9 @@ class Carpark extends CI_Controller | |||||
| passthru('/usr/bin/tail -n ' . $lines . ' ' . $target_str); // 利用linux指令顯示倒數幾行的logs內容 | passthru('/usr/bin/tail -n ' . $lines . ' ' . $target_str); // 利用linux指令顯示倒數幾行的logs內容 | ||||
| echo "\n----- " . $target_str . ' -----'; | echo "\n----- " . $target_str . ' -----'; | ||||
| echo '</pre></body></html>'; | echo '</pre></body></html>'; | ||||
| } | |||||
| } | |||||
| // 新增月租資料 | // 新增月租資料 | ||||
| public function member_add() | public function member_add() | ||||
| { | { | ||||
| @@ -783,15 +604,8 @@ class Carpark extends CI_Controller | |||||
| $this->carpark_model->member_add($data); | $this->carpark_model->member_add($data); | ||||
| echo 'ok'; | echo 'ok'; | ||||
| } | } | ||||
| // 查詢月租資料 | |||||
| public function member_query() | |||||
| { | |||||
| $data = $this->carpark_model->member_query(); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | |||||
| } | |||||
| // 刪除月租資料 | // 刪除月租資料 | ||||
| public function member_delete() | public function member_delete() | ||||
| @@ -800,16 +614,7 @@ class Carpark extends CI_Controller | |||||
| $this->carpark_model->member_delete($member_no); | $this->carpark_model->member_delete($member_no); | ||||
| echo 'ok'; | echo 'ok'; | ||||
| } | } | ||||
| // 進出場現況表 | |||||
| public function cario_list() | |||||
| { | |||||
| $data = $this->carpark_model->cario_list(); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | |||||
| } | |||||
| // 進出場事件即時顯示 | // 進出場事件即時顯示 | ||||
| public function cario_event() | public function cario_event() | ||||
| { | { | ||||
| @@ -819,16 +624,7 @@ class Carpark extends CI_Controller | |||||
| } | } | ||||
| } | } | ||||
| // 顯示圖檔(http://url/carpark.html/pics/lpr_ABY8873_O_0_0_C_20150919210022) | |||||
| public function pics() | |||||
| { | |||||
| // ??? | |||||
| readfile(CAR_PIC.$this->uri->segment(3).'/'.str_replace('/', '', $this->uri->segment(4)).'.jpg'); | |||||
| } | |||||
| // 汽車開門 | // 汽車開門 | ||||
| public function opendoors() | public function opendoors() | ||||
| { | { | ||||
| @@ -868,27 +664,7 @@ class Carpark extends CI_Controller | |||||
| echo json_encode($data); | echo json_encode($data); | ||||
| } | } | ||||
| // 車號入場查詢 | |||||
| public function carin_lpr_query() | |||||
| { | |||||
| $lpr = $this->uri->segment(3); | |||||
| $data = $this->carpark_model->carin_lpr_query($lpr); | |||||
| echo json_encode($data); | |||||
| } | |||||
| // 以時間查詢入場資訊 | |||||
| public function carin_time_query() | |||||
| { | |||||
| $time_query = $this->input->post('time_query', true); | |||||
| $minutes_range = $this->input->post('minutes_range', true); | |||||
| $data = $this->carpark_model->carin_time_query($time_query, $minutes_range); | |||||
| echo json_encode($data); | |||||
| } | |||||
| // 調撥車道設定 | |||||
| // 調撥車道設定 | |||||
| public function reversible_lane_set() | public function reversible_lane_set() | ||||
| { | { | ||||
| $lane_no = $this->input->post('lane_no', true); | $lane_no = $this->input->post('lane_no', true); | ||||
| @@ -953,24 +729,64 @@ class Carpark extends CI_Controller | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | echo json_encode($data, JSON_UNESCAPED_UNICODE); | ||||
| } | } | ||||
| */ | |||||
| // 查詢月租資料 | |||||
| public function member_query() | |||||
| { | |||||
| $data = $this->app_model()->member_query(); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | |||||
| } | |||||
| // 進出場現況表 | |||||
| public function cario_list() | |||||
| { | |||||
| $data = $this->app_model()->cario_list(); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | |||||
| } | |||||
| // 顯示圖檔(http://url/carpark.html/pics/lpr_ABY8873_O_0_0_C_20150919210022) | |||||
| public function pics() | |||||
| { | |||||
| readfile(CAR_PIC.$this->uri->segment(3).'/'.str_replace('/', '', $this->uri->segment(4)).'.jpg'); | |||||
| } | |||||
| // 車號入場查詢 | |||||
| public function carin_lpr_query() | |||||
| { | |||||
| $lpr = $this->uri->segment(3); | |||||
| $data = $this->app_model()->carin_lpr_query($lpr); | |||||
| echo json_encode($data); | |||||
| } | |||||
| // 以時間查詢入場資訊 | |||||
| public function carin_time_query() | |||||
| { | |||||
| $time_query = $this->input->post('time_query', true); | |||||
| $minutes_range = $this->input->post('minutes_range', true); | |||||
| $data = $this->app_model()->carin_time_query($time_query, $minutes_range); | |||||
| echo json_encode($data); | |||||
| } | |||||
| // 查詢行動支付記錄 | // 查詢行動支付記錄 | ||||
| public function tx_bill_query() | public function tx_bill_query() | ||||
| { | { | ||||
| $data = $this->carpark_model->tx_bill_query(); | |||||
| $data = $this->app_model()->tx_bill_query(); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | echo json_encode($data, JSON_UNESCAPED_UNICODE); | ||||
| } | } | ||||
| // 查詢月租繳款機記錄 | // 查詢月租繳款機記錄 | ||||
| public function tx_bill_ats_query() | public function tx_bill_ats_query() | ||||
| { | { | ||||
| $data = $this->carpark_model->tx_bill_ats_query(); | |||||
| $data = $this->app_model()->tx_bill_ats_query(); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | echo json_encode($data, JSON_UNESCAPED_UNICODE); | ||||
| } | } | ||||
| // 查詢樓層在席群組 | // 查詢樓層在席群組 | ||||
| public function pks_group_query() | public function pks_group_query() | ||||
| { | { | ||||
| $data = $this->carpark_model->pks_group_query(); | |||||
| $data = $this->app_model()->pks_group_query(); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | echo json_encode($data, JSON_UNESCAPED_UNICODE); | ||||
| } | } | ||||
| @@ -980,7 +796,11 @@ class Carpark extends CI_Controller | |||||
| $group_id = $this->uri->segment(3); // id | $group_id = $this->uri->segment(3); // id | ||||
| $value = $this->uri->segment(4, 0); // value | $value = $this->uri->segment(4, 0); // value | ||||
| $station_no = $this->uri->segment(5); // station_no | $station_no = $this->uri->segment(5); // station_no | ||||
| $data = $this->sync_data_model->pks_availables_update($group_id, $value, true, $station_no); | |||||
| // 初始 mqtt | |||||
| $this->init_mqtt(); | |||||
| $data = $this->data_model()->pks_availables_update($group_id, $value, true, $station_no); | |||||
| echo json_encode($data, JSON_UNESCAPED_UNICODE); | echo json_encode($data, JSON_UNESCAPED_UNICODE); | ||||
| } | } | ||||
| @@ -1002,11 +822,6 @@ class Carpark extends CI_Controller | |||||
| } | } | ||||
| */ | */ | ||||
| public function test() | |||||
| { | |||||
| //echo `whoami`; | |||||
| //echo phpinfo(); | |||||
| } | |||||
| // 博辰測試用 | // 博辰測試用 | ||||
| // http://localhost/carpark.html/test_8068_002/APK7310 | // http://localhost/carpark.html/test_8068_002/APK7310 | ||||
| @@ -1071,14 +886,4 @@ class Carpark extends CI_Controller | |||||
| exit; | exit; | ||||
| } | } | ||||
| // test | |||||
| public function test_phpexcel() | |||||
| { | |||||
| $query_year = 2017; | |||||
| $query_month = 3; | |||||
| //$this->excel_model->export_cario_data($query_year, $query_month); | |||||
| $this->excel_model->export_members(); | |||||
| } | |||||
| } | } | ||||
| @@ -1,62 +1,16 @@ | |||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | |||||
| <?php | |||||
| /* | /* | ||||
| file: cars.php 車輛進出場處理(板車版含感應線圈) | |||||
| URL: | |||||
| http://192.168.10.201/cars.html/ipcam/sno/12119/ivsno/0/io/O/type/C/lpr/4750YC/color/NULL/sq/0/ts/1441051995/sq2/0/etag/ABCD123456789/ant/1 | |||||
| javascript/html從server讀取key/value方式 | |||||
| http://61.220.179.128/jsid.i/ip=ip&uniqid=clientid&mqtt_ip=mqtt_ip | |||||
| 例如: | |||||
| <script src="http://61.220.179.128/jsid.i/ip=ip&uniqid=clientid&mqtt_ip=mqtt_ip"></script> | |||||
| response: | |||||
| var ip='66.249.82.183';var clientid='565162cb67dfb';var mqtt_ip='192.168.51.11'; | |||||
| file: cars.php 車輛進出場處理 | |||||
| */ | */ | ||||
| // ----- 定義常數(路徑, cache秒數) ----- | |||||
| define('APP_VERSION', '100'); // 版本號 | |||||
| define('MAX_AGE', 604800); // cache秒數, 此定義1個月 | |||||
| define('APP_NAME', 'cars'); // 應用系統名稱 | |||||
| define('PAGE_PATH', APP_BASE.'ci_application/views/'.APP_NAME.'/'); // path of views | |||||
| define('SERVER_URL', 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost').'/'); // URL | |||||
| define('APP_URL', SERVER_URL.APP_NAME.'.html/'); // controller路徑 | |||||
| define('WEB_URL', SERVER_URL.APP_NAME.'/'); // 網頁路徑 | |||||
| define('WEB_LIB', SERVER_URL.'/libs/'); // 網頁lib | |||||
| define('BOOTSTRAPS', WEB_LIB.'bootstrap_sb/'); // bootstrap lib | |||||
| define('LOG_PATH', FILE_BASE.APP_NAME.'/logs/'); // log path name | |||||
| define('LOG_FILE', FILE_BASE.APP_NAME.'/logs/cario.'); // log file name | |||||
| require_once(MQ_CLASS_FILE); | |||||
| class Cars extends CI_Controller | |||||
| class Cars extends CC_Controller | |||||
| { | { | ||||
| var $vars = array(); | |||||
| function __construct() | function __construct() | ||||
| { | { | ||||
| // $this->time_start = microtime(true); | |||||
| parent::__construct(); | |||||
| // ----- 程式開發階段log設定 ----- | |||||
| if (@ENVIRONMENT == 'development') | |||||
| { | |||||
| ini_set('display_errors', '1'); | |||||
| //error_reporting(E_ALL ^ E_NOTICE); | |||||
| error_reporting(E_ALL); | |||||
| } | |||||
| set_error_handler(array($this, 'error_handler'), E_ALL); // 資料庫異動需做log | |||||
| $method_name = $this->router->fetch_method(); | |||||
| $request_assoc = $this->uri->uri_to_assoc(3); | |||||
| trigger_error(__FUNCTION__ . '..' . $method_name. '..request start..' . print_r($request_assoc, true)); | |||||
| parent::__construct('cars'); | |||||
| ignore_user_abort(); // 接受client斷線, 繼續run | ignore_user_abort(); // 接受client斷線, 繼續run | ||||
| if(in_array($method_name, array( | |||||
| if(in_array($this->router->fetch_method(), array( | |||||
| 'ipcam', 'ipcam_meta', | 'ipcam', 'ipcam_meta', | ||||
| 'check_lpr_etag', | 'check_lpr_etag', | ||||
| 'opendoor', | 'opendoor', | ||||
| @@ -74,76 +28,6 @@ class Cars extends CI_Controller | |||||
| ob_end_flush(); | ob_end_flush(); | ||||
| flush(); | flush(); | ||||
| } | } | ||||
| $this->vars['date_time'] = date('Y-m-d H:i:s'); // 格式化時間(2015-10-12 14:36:21) | |||||
| $this->vars['time_num'] = str_replace(array('-', ':', ' '), '', $this->vars['date_time']); //數字化時間(20151012143621) | |||||
| $this->vars['date_num'] = substr($this->vars['time_num'], 0, 8); // 數字化日期(20151012) | |||||
| //$this->vars['station_no'] = STATION_NO; // 本站編號 | |||||
| //session_id(ip2long($_SERVER['REMOTE_ADDR'])); // 設定同一device為同一個session | |||||
| //session_start(); | |||||
| // 共用記憶體 | |||||
| $this->vars['mcache'] = new Memcache; | |||||
| $this->vars['mcache']->pconnect(MEMCACHE_HOST, MEMCACHE_PORT); // or die ('Could not connect memcache'); | |||||
| /* | |||||
| // mqtt subscribe | |||||
| $this->vars['mqtt'] = new phpMQTT(MQ_HOST, MQ_PORT, uniqid()); | |||||
| //if(!$this->vars['mqtt']->connect()){ die ('Could not connect mqtt'); } | |||||
| if(!$this->vars['mqtt']->connect()){ trigger_error('..Could not connect mqtt..go on..'); } | |||||
| */ | |||||
| // 資料介接模組 | |||||
| $this->load->model('sync_data_model'); | |||||
| $this->sync_data_model->init($this->vars); // for memcache | |||||
| // mqtt subscribe | |||||
| $station_setting = $this->sync_data_model->station_setting_query(); | |||||
| $mqtt_ip = isset($station_setting['mqtt_ip']) ? $station_setting['mqtt_ip'] : MQ_HOST; | |||||
| $mqtt_port = isset($station_setting['mqtt_port']) ? $station_setting['mqtt_port'] : MQ_PORT; | |||||
| $this->vars['mqtt'] = new phpMQTT($mqtt_ip, $mqtt_port, uniqid()); | |||||
| $this->vars['mqtt']->connect(); | |||||
| // init again | |||||
| $this->sync_data_model->init($this->vars); // for mqtt | |||||
| $this->load->model('cars_model'); | |||||
| $this->cars_model->init($this->vars); | |||||
| } | |||||
| // 發生錯誤時集中在此處理 | |||||
| public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) | |||||
| { | |||||
| $log_msg = explode('://', $errstr); | |||||
| if (count($log_msg) > 1) | |||||
| { | |||||
| $log_file = $log_msg[0]; | |||||
| $str = date('H:i:s')."|{$log_msg[1]}|{$errfile}|{$errline}|{$errno}\n"; | |||||
| } | |||||
| else | |||||
| { | |||||
| $log_file = APP_NAME; | |||||
| $str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n"; | |||||
| } | |||||
| error_log($str, 3, LOG_PATH.$log_file . '.' . date('Ymd').'.log.txt'); // 3代表參考後面的檔名 | |||||
| } | |||||
| // 顯示logs | |||||
| public function show_logs() | |||||
| { | |||||
| $lines = $this->uri->segment(3); // 顯示行數 | |||||
| if (empty($lines)) $lines = 140; // 無行數參數, 預設為40行 | |||||
| // echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><pre style="white-space: pre-wrap;">'; | |||||
| echo '<html lang="zh-TW"><body><pre style="white-space: pre-wrap;">'; | |||||
| passthru('/usr/bin/tail -n ' . $lines . ' ' . LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt'); // 利用linux指令顯示倒數幾行的logs內容 | |||||
| echo "\n----- " . LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt' . ' -----'; | |||||
| echo '</pre></body></html>'; | |||||
| } | } | ||||
| /* | /* | ||||
| @@ -153,9 +37,13 @@ class Cars extends CI_Controller | |||||
| */ | */ | ||||
| public function opendoor() | public function opendoor() | ||||
| { | { | ||||
| // 初始 mqtt | |||||
| $this->init_mqtt(); | |||||
| // 執行 | |||||
| $parms = $this->uri->uri_to_assoc(3); | $parms = $this->uri->uri_to_assoc(3); | ||||
| $parms['lpr'] = urldecode($parms['lpr']); // 中文車牌 | $parms['lpr'] = urldecode($parms['lpr']); // 中文車牌 | ||||
| $this->cars_model->opendoor_lprio($parms); | |||||
| $this->app_model()->opendoor_lprio($parms); | |||||
| } | } | ||||
| // IVS -> 車號, 影像 | // IVS -> 車號, 影像 | ||||
| @@ -179,12 +67,13 @@ http://192.168.10.201/cars.html/ipcam/sno/12119/ivsno/0/io/O/type/C/lpr/4750YC/c | |||||
| 上傳圖檔欄位名稱為cars | 上傳圖檔欄位名稱為cars | ||||
| */ | */ | ||||
| public function ipcam() | public function ipcam() | ||||
| { | |||||
| { | |||||
| // 執行 | |||||
| $parms = $this->uri->uri_to_assoc(3); | $parms = $this->uri->uri_to_assoc(3); | ||||
| $parms['lpr'] = urldecode($parms['lpr']); // 中文車牌 | $parms['lpr'] = urldecode($parms['lpr']); // 中文車牌 | ||||
| // 同步並送出一次出入口 888 | // 同步並送出一次出入口 888 | ||||
| $this->sync_data_model->sync_888($parms); | |||||
| $this->data_model()->sync_888($parms); | |||||
| $pic_folder = CAR_PIC.$this->vars['date_num'].'/'; // 今日資料夾名(yyyymmdd) | $pic_folder = CAR_PIC.$this->vars['date_num'].'/'; // 今日資料夾名(yyyymmdd) | ||||
| if (!file_exists($pic_folder)) mkdir($pic_folder); // 如果資料夾不存在, 建立日期資料夾 | if (!file_exists($pic_folder)) mkdir($pic_folder); // 如果資料夾不存在, 建立日期資料夾 | ||||
| @@ -220,8 +109,22 @@ http://192.168.10.201/cars.html/ipcam/sno/12119/ivsno/0/io/O/type/C/lpr/4750YC/c | |||||
| $parms['curr_time_str'] = $this->vars['date_time']; // 現在時間, 例2015-09-21 15:36:47 | $parms['curr_time_str'] = $this->vars['date_time']; // 現在時間, 例2015-09-21 15:36:47 | ||||
| $parms['pic_name'] = $config['file_name']; // 圖片檔名 | $parms['pic_name'] = $config['file_name']; // 圖片檔名 | ||||
| $this->cars_model->lprio($parms); // 測試eTag | |||||
| } | |||||
| $this->app_model()->lprio($parms); // 測試eTag | |||||
| } | |||||
| /* | |||||
| 出入口 | |||||
| 說明: 特殊方式進出註記 (ex. 悠遊卡) | |||||
| */ | |||||
| public function ipcam_meta() | |||||
| { | |||||
| $parms = $this->uri->uri_to_assoc(3); | |||||
| $parms['lpr'] = urldecode($parms['lpr']); // 中文車牌 | |||||
| // 執行 | |||||
| $this->app_model()->ipcam_meta($parms); | |||||
| } | |||||
| // 用車牌與eTag, 檢查資料庫 | // 用車牌與eTag, 檢查資料庫 | ||||
| public function check_lpr_etag() | public function check_lpr_etag() | ||||
| @@ -229,21 +132,23 @@ http://192.168.10.201/cars.html/ipcam/sno/12119/ivsno/0/io/O/type/C/lpr/4750YC/c | |||||
| $lpr = $this->uri->segment(3); | $lpr = $this->uri->segment(3); | ||||
| $etag = $this->uri->segment(4); | $etag = $this->uri->segment(4); | ||||
| $this->cars_model->check_lpr_etag($lpr, $etag); | |||||
| // 執行 | |||||
| $this->app_model()->check_lpr_etag($lpr, $etag); | |||||
| exit; | exit; | ||||
| } | } | ||||
| // 開門 (臨停) | // 開門 (臨停) | ||||
| public function temp_opendoors() | public function temp_opendoors() | ||||
| { | { | ||||
| $parms['ivsno'] = $this->uri->segment(3); | |||||
| $parms['ivsno'] = $this->uri->segment(3); | |||||
| $parms['lpr'] = $this->uri->segment(4); | $parms['lpr'] = $this->uri->segment(4); | ||||
| $parms['ck'] = $this->uri->segment(5); | $parms['ck'] = $this->uri->segment(5); | ||||
| // 初始 mqtt | |||||
| $this->init_mqtt(); | |||||
| // 載入 | |||||
| $this->load->model('cars_model'); | |||||
| $this->cars_model->init($this->vars); | |||||
| $result = $this->cars_model->do_temp_opendoor($parms); | |||||
| // 執行 | |||||
| $result = $this->app_model()->do_temp_opendoor($parms); | |||||
| trigger_error(__FUNCTION__ . "..{$result}.." . print_r($parms, true)); | trigger_error(__FUNCTION__ . "..{$result}.." . print_r($parms, true)); | ||||
| exit; | exit; | ||||
| } | } | ||||
| @@ -255,36 +160,13 @@ http://192.168.10.201/cars.html/ipcam/sno/12119/ivsno/0/io/O/type/C/lpr/4750YC/c | |||||
| $parms['lpr'] = $this->uri->segment(4); | $parms['lpr'] = $this->uri->segment(4); | ||||
| $parms['ck'] = $this->uri->segment(5); | $parms['ck'] = $this->uri->segment(5); | ||||
| // 載入 | |||||
| $this->load->model('cars_model'); | |||||
| $this->cars_model->init($this->vars); | |||||
| $result = $this->cars_model->do_member_opendoor($parms); | |||||
| // 初始 mqtt | |||||
| $this->init_mqtt(); | |||||
| // 執行 | |||||
| $result = $this->app_model()->do_member_opendoor($parms); | |||||
| trigger_error(__FUNCTION__ . "..{$result}.." . print_r($parms, true)); | trigger_error(__FUNCTION__ . "..{$result}.." . print_r($parms, true)); | ||||
| exit; | exit; | ||||
| } | } | ||||
| /* | |||||
| 出入口 | |||||
| 說明: 特殊方式進出註記 (ex. 悠遊卡) | |||||
| */ | |||||
| public function ipcam_meta() | |||||
| { | |||||
| $parms = $this->uri->uri_to_assoc(3); | |||||
| $parms['lpr'] = urldecode($parms['lpr']); // 中文車牌 | |||||
| $this->cars_model->ipcam_meta($parms); | |||||
| } | |||||
| /* | |||||
| public function test_now() | |||||
| { | |||||
| echo date('Y-m-d H:i:s'); | |||||
| } | |||||
| public function test_phpinfo() | |||||
| { | |||||
| phpinfo(); | |||||
| } | |||||
| */ | |||||
| } | } | ||||
| @@ -0,0 +1,171 @@ | |||||
| <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); | |||||
| /* | |||||
| ALTOB base controller | |||||
| */ | |||||
| class CC_Controller extends CI_Controller | |||||
| { | |||||
| public $vars; | |||||
| function __construct($app_name) | |||||
| { | |||||
| parent::__construct(); | |||||
| define('APP_NAME', $app_name); // 應用系統名稱 | |||||
| define('LOG_PATH', FILE_BASE.APP_NAME.'/logs/'); // log path name | |||||
| // ----- 程式開發階段log設定 ----- | |||||
| if (@ENVIRONMENT == 'development') | |||||
| { | |||||
| ini_set('display_errors', '1'); | |||||
| //error_reporting(E_ALL ^ E_NOTICE); | |||||
| error_reporting(E_ALL); | |||||
| } | |||||
| set_error_handler(array($this, 'error_handler'), E_ALL); // 資料庫異動需做log | |||||
| $method_name = $this->router->fetch_method(); | |||||
| $request_assoc = $this->uri->uri_to_assoc(3); | |||||
| trigger_error(__FUNCTION__ . '://..' . $method_name. '..uri_to_assoc..' . print_r($request_assoc, true)); | |||||
| // ----- 常數 ----- | |||||
| define('APP_VERSION', '100'); // 版本號 | |||||
| define('MAX_AGE', 604800); // cache秒數, 此定義1個月 | |||||
| define('SERVER_URL', 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost').'/'); // URL | |||||
| define('WEB_LIB', SERVER_URL.'/libs/'); // 網頁lib | |||||
| define('BOOTSTRAPS', WEB_LIB.'bootstrap_sb/'); // bootstrap lib | |||||
| define('WEB_URL', SERVER_URL.APP_NAME.'/'); // 網頁路徑 | |||||
| define('APP_URL', SERVER_URL.APP_NAME.'.html/'); // controller路徑 | |||||
| define('PAGE_PATH', APP_BASE.'ci_application/views/'.APP_NAME.'/'); // path of views | |||||
| $this->vars = array(); | |||||
| $this->vars['date_time'] = date('Y-m-d H:i:s'); // 格式化時間(2015-10-12 14:36:21) | |||||
| $this->vars['time_num'] = str_replace(array('-', ':', ' '), '', $this->vars['date_time']); // 數字化時間(20151012143621) | |||||
| $this->vars['date_num'] = substr($this->vars['time_num'], 0, 8); // 數字化日期(20151012) | |||||
| // 共用記憶體 | |||||
| $this->vars['mcache'] = new Memcache; | |||||
| if(!$this->vars['mcache']->pconnect(MEMCACHE_HOST, MEMCACHE_PORT)){ trigger_error('..Could not connect mcache..'); } | |||||
| } | |||||
| // 發生錯誤時集中在此處理 | |||||
| public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) | |||||
| { | |||||
| $log_msg = explode('://', $errstr); | |||||
| if (count($log_msg) > 1 && substr($log_msg[0], -4) != 'http') | |||||
| { | |||||
| $log_file = $log_msg[0]; | |||||
| $str = date('H:i:s')."|{$log_msg[1]}|{$errfile}|{$errline}|{$errno}\n"; | |||||
| } | |||||
| else | |||||
| { | |||||
| $log_file = APP_NAME; | |||||
| $str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n"; | |||||
| } | |||||
| error_log($str, 3, LOG_PATH.$log_file . '.' . date('Ymd').'.log.txt'); // 3代表參考後面的檔名 | |||||
| } | |||||
| // 顯示靜態網頁(html檔) | |||||
| public function show_page($page_name, &$data = null) | |||||
| { | |||||
| $page_file = PAGE_PATH.$page_name.'.php'; | |||||
| $last_modified_time = filemtime($page_file); | |||||
| // 若檔案修改時間沒有異動, 或版本無異動, 通知瀏覽器使用cache, 不再下傳網頁 | |||||
| // header('Cache-Control:max-age='.MAX_AGE); // cache 1個月 | |||||
| header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_modified_time).' GMT'); | |||||
| header('Etag: '. APP_VERSION); | |||||
| header('Cache-Control: public'); | |||||
| // 20170921 | |||||
| header("cache-Control: no-store, no-cache, must-revalidate"); | |||||
| header("cache-Control: post-check=0, pre-check=0", false); | |||||
| header("Pragma: no-cache"); | |||||
| header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); | |||||
| if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == APP_VERSION && @strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time) | |||||
| { | |||||
| header('HTTP/1.1 304 Not Modified'); | |||||
| } | |||||
| else | |||||
| { | |||||
| $this->load->view(APP_NAME.'/'.$page_name, $data); | |||||
| } | |||||
| } | |||||
| // 顯示logs | |||||
| public function show_logs() | |||||
| { | |||||
| $lines = $this->uri->segment(3); // 顯示行數 | |||||
| if (empty($lines)) $lines = 140; // 無行數參數, 預設為40行 | |||||
| // echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><pre style="white-space: pre-wrap;">'; | |||||
| echo '<html lang="zh-TW"><body><pre style="white-space: pre-wrap;">'; | |||||
| passthru('/usr/bin/tail -n ' . $lines . ' ' . LOG_PATH . APP_NAME . '.' . date('Ymd').'.log.txt'); // 利用linux指令顯示倒數幾行的logs內容 | |||||
| echo "\n----- " . LOG_PATH . APP_NAME . '.' . date('Ymd').'.log.txt' . ' -----'; | |||||
| echo '</pre></body></html>'; | |||||
| } | |||||
| // 送出html code | |||||
| public function get_html() | |||||
| { | |||||
| $this->load->view(APP_NAME.'/'.$this->input->post('tag_name', true), array()); | |||||
| } | |||||
| // 驗証 IP | |||||
| public function is_ip_valid() | |||||
| { | |||||
| $client_ip = $this->my_ip(); | |||||
| if(!in_array($client_ip, array('127.0.0.1', '61.219.172.11', '61.219.172.82'))) | |||||
| { | |||||
| trigger_error('..block..from:'.$client_ip.'..unknown network..'); | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| // 取得 IP | |||||
| public function my_ip() | |||||
| { | |||||
| if (getenv('HTTP_X_FORWARDED_FOR')) | |||||
| { | |||||
| $ip = getenv('HTTP_X_FORWARDED_FOR'); | |||||
| } | |||||
| elseif (getenv('HTTP_X_REAL_IP')) | |||||
| { | |||||
| $ip = getenv('HTTP_X_REAL_IP'); | |||||
| } | |||||
| else { | |||||
| $ip = $_SERVER['REMOTE_ADDR']; | |||||
| } | |||||
| return $ip; | |||||
| } | |||||
| // 啟動 MQTT | |||||
| public function init_mqtt() | |||||
| { | |||||
| require_once(MQ_CLASS_FILE); | |||||
| $station_setting = $this->data_model()->station_setting_query(); | |||||
| $mqtt_ip = isset($station_setting['mqtt_ip']) ? $station_setting['mqtt_ip'] : MQ_HOST; | |||||
| $mqtt_port = isset($station_setting['mqtt_port']) ? $station_setting['mqtt_port'] : MQ_PORT; | |||||
| $this->vars['mqtt'] = new phpMQTT($mqtt_ip, $mqtt_port, uniqid()); | |||||
| $this->vars['mqtt']->connect(); | |||||
| } | |||||
| // 資料同步模組 | |||||
| public function data_model() | |||||
| { | |||||
| return $this->app_model('sync_data'); | |||||
| } | |||||
| // 啟動模組 | |||||
| public function app_model($app_name='') | |||||
| { | |||||
| $model_name = !empty($app_name) ? $app_name . '_model' : APP_NAME . '_model'; | |||||
| $this->load->model($model_name); | |||||
| $this->$model_name->init($this->vars); | |||||
| return $this->$model_name; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,11 @@ | |||||
| <!DOCTYPE html> | |||||
| <html> | |||||
| <head> | |||||
| <title>403 Forbidden</title> | |||||
| </head> | |||||
| <body> | |||||
| <p>Directory access is forbidden.</p> | |||||
| </body> | |||||
| </html> | |||||
| @@ -5,12 +5,18 @@ file: User_model.php 管理登入系統 | |||||
| class User_model extends CI_Model | class User_model extends CI_Model | ||||
| { | { | ||||
| var $vars = array(); | |||||
| function __construct() | function __construct() | ||||
| { | { | ||||
| parent::__construct(); | parent::__construct(); | ||||
| $this->load->database(); | $this->load->database(); | ||||
| } | } | ||||
| public function init($vars) | |||||
| { | |||||
| $this->vars = $vars; | |||||
| } | |||||
| // 登入 | // 登入 | ||||
| public function user_login($data) | public function user_login($data) | ||||