VM暫存
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8 년 전
8 년 전
8 년 전
8 년 전
8 년 전
8 년 전
8 년 전
8 년 전
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. /*
  3. file: pks.php 車位在席模組
  4. IVS -> 車號, 影像
  5. 鼎高IVS傳送車號及影像檔
  6. http://203.75.167.89/pks.html/cameras/sno/12112/ivsno/3/pksno/2016/io/KI/type/C/lpr/ABC1234/color/red/sq/5236
  7. http://203.75.167.89/pks.html/cameras/sno/12119/ivsno/3/pksno/195/io/KO/type/C/lpr/NONE/color/red/sq/5236
  8. sno: 場站編號(新北市圖書館:12118)
  9. ivsno: ivs編號, 每一支都是獨立編號(序號)
  10. pksno: 車位編號
  11. io: KI:進車格, KO:出車格, KL:車牌
  12. type: C:汽車, H:重機, M:機車
  13. lpr: ABC1234(車號), 無:NONE
  14. color: red(紅色), 若無請用NONE(4個字)
  15. sq: 序號(查詢時參考用)
  16. http設定說明:
  17. method: POST
  18. 上傳圖檔名英數字, 副檔名為gif/jpg/png均可
  19. 上傳圖檔欄位名稱為cars
  20. */
  21. require_once(MQ_CLASS_FILE);
  22. class Pks extends CI_Controller
  23. {
  24. var $vars = array(); // 共用變數
  25. function __construct()
  26. {
  27. // $this->time_start = microtime(true);
  28. parent::__construct();
  29. ignore_user_abort(); // 接受client斷線, 繼續run
  30. $method_name = $this->router->fetch_method();
  31. if ($method_name == 'cameras')
  32. {
  33. ob_end_clean();
  34. ignore_user_abort();
  35. ob_start();
  36. header('Connection: close');
  37. header('Content-Length: ' . ob_get_length());
  38. ob_end_flush();
  39. flush();
  40. }
  41. $this->vars['date_time'] = date('Y-m-d H:i:s'); // 格式化時間(2015-10-12 14:36:21)
  42. $this->vars['time_num'] = str_replace(array('-', ':', ' '), '', $this->vars['date_time']); //數字化時間(20151012143621)
  43. $this->vars['date_num'] = substr($this->vars['time_num'], 0, 8); // 數字化日期(20151012)
  44. $this->vars['station_no'] = STATION_NO; // 本站編號
  45. // ----- 程式開發階段log設定 -----
  46. if (@ENVIRONMENT == 'development')
  47. {
  48. ini_set('display_errors', '1');
  49. //error_reporting(E_ALL ^ E_NOTICE);
  50. error_reporting(E_ALL);
  51. }
  52. set_error_handler(array($this, 'error_handler'), E_ALL); // 資料庫異動需做log
  53. /*
  54. // mqtt subscribe
  55. $this->vars['mqtt'] = new phpMQTT(MQ_HOST, MQ_PORT, uniqid());
  56. if(!$this->vars['mqtt']->connect()){ die ('Could not connect mqtt'); }
  57. */
  58. // ----- 定義常數(路徑, cache秒數) -----
  59. define('APP_VERSION', '100'); // 版本號
  60. define('MAX_AGE', 604800); // cache秒數, 此定義1個月
  61. define('APP_NAME', 'pks'); // 應用系統名稱
  62. define('PAGE_PATH', APP_BASE.'ci_application/views/'.APP_NAME.'/'); // path of views
  63. define('SERVER_URL', 'http://'.(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost').'/'); // URL
  64. define('APP_URL', SERVER_URL.APP_NAME.'.html/'); // controller路徑
  65. define('WEB_URL', SERVER_URL.APP_NAME.'/'); // 網頁路徑
  66. define('WEB_LIB', SERVER_URL.'/libs/'); // 網頁lib
  67. define('BOOTSTRAPS', WEB_LIB.'bootstrap_sb/'); // bootstrap lib
  68. define('LOG_PATH', FILE_BASE.APP_NAME.'/logs/'); // log path name
  69. define('LOG_FILE', FILE_BASE.APP_NAME.'/logs/pks.'); // log file name
  70. // 共用記憶體
  71. $this->vars['mcache'] = new Memcache;
  72. $this->vars['mcache']->pconnect(MEMCACHE_HOST, MEMCACHE_PORT); // or die ('Could not connect memcache');
  73. // mqtt subscribe
  74. $this->load->model('sync_data_model');
  75. $this->sync_data_model->init($this->vars); // for memcache
  76. $station_setting = $this->sync_data_model->station_setting_query();
  77. $mqtt_ip = isset($station_setting['mqtt_ip']) ? $station_setting['mqtt_ip'] : MQ_HOST;
  78. $mqtt_port = isset($station_setting['mqtt_port']) ? $station_setting['mqtt_port'] : MQ_PORT;
  79. //$this->vars['mqtt'] = new phpMQTT($mqtt_ip, $mqtt_port, uniqid());
  80. //$this->vars['mqtt']->connect();
  81. $this->vars['mqtt_ip'] = $mqtt_ip;
  82. $this->vars['mqtt_port'] = $mqtt_port;
  83. // init sync model
  84. $this->sync_data_model->init($this->vars);
  85. // init pks model
  86. $this->load->model('pks_model');
  87. $this->pks_model->init($this->vars);
  88. }
  89. // 發生錯誤時集中在此處理
  90. public function error_handler($errno, $errstr, $errfile, $errline, $errcontext)
  91. {
  92. $log_msg = explode('://', $errstr);
  93. if (count($log_msg) > 1)
  94. {
  95. $log_file = $log_msg[0];
  96. $str = date('H:i:s')."|{$log_msg[1]}|{$errfile}|{$errline}|{$errno}\n";
  97. }
  98. else
  99. {
  100. $log_file = APP_NAME;
  101. $str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n";
  102. }
  103. error_log($str, 3, LOG_PATH.$log_file . '.' . date('Ymd').'.log.txt'); // 3代表參考後面的檔名
  104. }
  105. // 顯示靜態網頁(html檔)
  106. protected function show_page($page_name, &$data = null)
  107. {
  108. $page_file = PAGE_PATH.$page_name.'.php';
  109. $last_modified_time = filemtime($page_file);
  110. // 若檔案修改時間沒有異動, 或版本無異動, 通知瀏覽器使用cache, 不再下傳網頁
  111. // header('Cache-Control:max-age='.MAX_AGE); // cache 1個月
  112. header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_modified_time).' GMT');
  113. header('Etag: '. APP_VERSION);
  114. header('Cache-Control: public');
  115. if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == APP_VERSION && @strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time)
  116. {
  117. header('HTTP/1.1 304 Not Modified');
  118. }
  119. else
  120. {
  121. $this->load->view(APP_NAME.'/'.$page_name, $data);
  122. }
  123. }
  124. public function parked()
  125. {
  126. $data['group_id'] = $this->uri->segment(3);
  127. $data['init_value'] = $this->uri->segment(4);
  128. // $data['client_id'] = uniqid();
  129. // $data['mqtt_ip'] = '192.168.10.201';
  130. // $data['port_no'] = 8000;
  131. $this->load->view(APP_NAME.'/parked', $data);
  132. }
  133. // 樓層平面圖
  134. // http://203.75.167.89/parkingquery.html/floor_map
  135. public function floor_map()
  136. {
  137. /*
  138. header('Access-Control-Allow-Origin: *');
  139. header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
  140. header('Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept');
  141. */
  142. $this->load->view("parkingquery/floor_map");
  143. }
  144. // response http
  145. protected function http_return($return_code, $type)
  146. {
  147. if ($type == 'text') echo $return_code;
  148. else echo json_encode($return_code, JSON_UNESCAPED_UNICODE);
  149. }
  150. // 顯示logs
  151. public function show_logs()
  152. {
  153. $lines = $this->uri->segment(3); // 顯示行數
  154. if (empty($lines)) $lines = 40; // 無行數參數, 預設為40行
  155. // echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><pre style="white-space: pre-wrap;">';
  156. echo '<html lang="zh-TW"><body><pre style="white-space: pre-wrap;">';
  157. if (PHP_OS == 'Linux')
  158. passthru('/usr/bin/tail -n ' . $lines . ' ' . LOG_FILE); // 利用linux指令顯示倒數幾行的logs內容
  159. else
  160. passthru('d:/afiles/bin/unix_cmd/tail.exe -n ' . $lines . ' ' . LOG_FILE);
  161. echo "\n----- " . LOG_FILE . ' -----';
  162. echo '</pre></body></html>';
  163. }
  164. // IVS -> 車號, 影像
  165. /*
  166. IVS -> 車號, 影像
  167. 鼎高IVS傳送車號及影像檔
  168. http://203.75.167.89/pks.html/cameras/sno/12119/ivsno/3/pksno/102/io/KI/type/C/lpr/ABC1234/color/red/sq/5236
  169. sno: 場站編號(新北市圖書館:12118)
  170. ivsno: ivs編號, 每一支都是獨立編號(序號)
  171. pksno: 車位編號
  172. io: KI:進車格, KO:出車格, KL:車牌辨識
  173. type: C:汽車, H:重機, M:機車
  174. lpr: ABC1234(車號)
  175. color: red(紅色), 若無請用NONE(4個字)
  176. sq: 序號(查詢時參考用)
  177. http設定說明:
  178. method: POST
  179. 上傳圖檔名英數字, 副檔名為gif/jpg/png均可
  180. 上傳圖檔欄位名稱為cars
  181. */
  182. public function cameras()
  183. {
  184. $parms = $this->uri->uri_to_assoc(3);
  185. // 調整 pksno 為 pks 格式
  186. if (strpos($parms['pksno'], 'B') !== false)
  187. $parms['pksno'] = '9' . intval(preg_replace('/[^0-9\-]/', '', $parms['pksno'])); // 地下 B
  188. else
  189. $parms['pksno'] = intval(preg_replace('/[^0-9\-]/', '', $parms['pksno']));
  190. trigger_error('在席參數傳入:'.print_r($parms, true));
  191. // array_map('unlink', glob(PKS_PIC."pks-{$parms['pksno']}-*"));
  192. /*
  193. // 車入格後的車牌辨識(lpr), 傅送圖檔
  194. if ($parms['io'] == 'KL')
  195. {
  196. array_map('unlink', glob(PKS_PIC."pks-{$parms['pksno']}-*.jpg")); // 刪除舊照片
  197. $config['upload_path'] = PKS_PIC;
  198. $config['allowed_types'] = 'gif|jpg|png';
  199. // ex. pks-2016-1625AB-1-2015080526.jpg -> pks-車位編號-車號-設備編號-時間.jpg
  200. $config['file_name'] = "pks-{$parms['pksno']}-{$parms['lpr']}-{$parms['ivsno']}-{$this->vars['time_num']}.jpg";
  201. $this->load->library('upload', $config);
  202. $parms['pic_name'] = $config['file_name'];
  203. if($this->upload->do_upload('cars'))
  204. {
  205. // 若無錯誤,則上傳檔案
  206. $file = $this->upload->data('cars');
  207. }
  208. else
  209. {
  210. trigger_error('入席傳檔錯誤:'. print_r($parms, true));
  211. }
  212. }
  213. */
  214. $this->pks_model->pksio($parms); // 車輛進出車格資料庫處理
  215. $this->pks_model->stop();
  216. exit;
  217. }
  218. // 重新計算
  219. // http://203.75.167.89/pks.html/reculc/
  220. public function reculc()
  221. {
  222. $this->pks_model->reculc();
  223. $this->pks_model->stop();
  224. }
  225. // 取得所有車位狀態資訊
  226. // http://203.75.167.89/pks.html/query_station_status/12112
  227. public function query_station_status()
  228. {
  229. $station_no = $this->uri->segment(3);
  230. $data = $this->pks_model->query_station_status($station_no);
  231. $this->pks_model->stop();
  232. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  233. }
  234. // 取得車位資訊
  235. // http://203.75.167.89/pks.html/query_station_pks/12112/2021
  236. public function query_station_pks(){
  237. $station_no = $this->uri->segment(3);
  238. $pksno = $this->uri->segment(4);
  239. $data = $this->pks_model->query_station_pks($station_no, $pksno);
  240. $this->pks_model->stop();
  241. echo json_encode($data, JSON_UNESCAPED_UNICODE);
  242. }
  243. // 車位狀態資訊圖
  244. // http://203.75.167.89/pks.html/status_map
  245. public function status_map()
  246. {
  247. $this->show_page("status_map");
  248. }
  249. }