VM暫存
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

179 lignes
5.9KB

  1. <?php
  2. // 博辰設備對接
  3. // php //home/bigbang/apps/coworker/parktron2server.php
  4. require_once '/home/bigbang/libs/Workerman/Autoloader.php';
  5. use Workerman\Worker;
  6. Worker::$logFile = '/dev/null'; // 不記錄log file
  7. //Worker::$pidFile = '/tmp/run/'.basename(__FILE__).'.pid';
  8. // 傳送主機資料
  9. $ch = curl_init();
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  11. curl_setopt($ch, CURLOPT_POST, true); // 啟用POST
  12. // 建立一個Worker監聽8068埠,不使用任何應用層協定
  13. $tcp_worker = new Worker("tcp://0.0.0.0:8068");
  14. // 啟動N個進程對外提供服務
  15. $tcp_worker->count = 6;
  16. $tcp_worker->onConnect = function($connection)
  17. {
  18. echo "New Connection\n";
  19. };
  20. $tcp_worker->onClose = function($connection)
  21. {
  22. echo "Connection closed\n";
  23. };
  24. // 當用戶端發來數據(主程式)
  25. $tcp_worker->onMessage = function($connection, $tcp_in)
  26. {
  27. global $ch, $last_lpr;
  28. // echo 'start time:'.date('Y-m-d H:i:s');
  29. list(, $seq, $cmd, $data) = explode(chr(28), $tcp_in); // 0x1C tcp欄位分隔
  30. // echo "data_in:[{$seq}|{$cmd}|{$data}|]\n";
  31. switch($cmd)
  32. {
  33. case '001': // 車輛入場
  34. list($devno, $token, $lpr, $in_time, $last_field) = explode(chr(31), $data); // 0x1F data欄位分隔
  35. $type = substr($last_field, 0, -2);
  36. echo "{$devno}|{$token}|{$lpr}|{$in_time}|{$type}|\n";
  37. $connection->send('OK');
  38. break;
  39. case '002': // APS詢問車牌入場時間
  40. list($token, $lpr, $last_field) = explode(chr(31), $data); // 0x1F data欄位分隔
  41. $lpr = str_replace('%', '', $lpr);
  42. $last_lpr = $lpr;
  43. $in_time = substr($last_field, 0, -2);
  44. // echo "cmd_002:[{$token}|{$lpr}|{$in_time}|]/n";
  45. $data = array('lpr' => $lpr);
  46. curl_setopt($ch, CURLOPT_URL, 'http://localhost/carpayment.html/query_in_fuzzy/');
  47. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
  48. $jdata = curl_exec($ch);
  49. $results = json_decode($jdata, true);
  50. $connection->send(tcp_data_fuzzy($results['count'], $results['results'], '001', '002'));
  51. break;
  52. case '003': // 繳費完成
  53. list($ticket_no, $lpr, $in_time, $pay_time, $last_field) = explode(chr(31), $data); // 0x1F data欄位分隔
  54. $pay_type = 0; //substr($last_field, 0, -2);
  55. // echo "{$ticket_no}|{$lpr}|{$in_time}|{$pay_time}|{$pay_type}|/n";
  56. $connection->send('OK');
  57. if ($lpr == '*******') {$err_lpr = '***';}
  58. else
  59. { $err_lpr = '+++';}
  60. // 傳送繳費資料
  61. $data = array
  62. (
  63. 'ticket_no' => $ticket_no, // 票卡號碼
  64. 'lpr' => $lpr, // 車號
  65. 'in_time' => $in_time, // 入場時間
  66. 'pay_time' => $pay_time, // 繳款時間
  67. 'pay_type' => $pay_type // 繳款方式(0:現金, 1:月票, 2:多卡通)
  68. );
  69. curl_setopt($ch, CURLOPT_URL, 'http://localhost/carpayment.html/p2payed/');
  70. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
  71. $results = curl_exec($ch);
  72. $data['last_field'] = $last_field;
  73. file_put_contents('/tmp/aps.log.txt', date('Y-m-d H:i:s').":{$err_lpr}\n".print_r($data, true)."\n\n", FILE_APPEND);
  74. break;
  75. }
  76. // echo 'end_time:'.date('Y-m-d H:i:s');
  77. };
  78. function tcp_data_fuzzy($records_count, $records, $seq, $cmdid)
  79. {
  80. $STX = 0x02; // STX:封包起始碼(0x02)
  81. $ETX = 0x03; // ETX:封包結束碼(0x03)
  82. $CRC = 0x80; // CRC:封包檢查碼
  83. $S1 = 0x1c; // 分隔碼
  84. $D1 = 0x1f; // 資料每個欄位分隔碼為0x1F
  85. $seq = '00001';
  86. $cmdid = '002';
  87. // 0 筆
  88. if($records_count == 0)
  89. {
  90. $count = 0;
  91. $data = pack('aC', "{$count}", $D1); // 20170928 為了和舊版一致尾巴都補上 0x1f
  92. $data_len = strlen($data);
  93. $socket_len = $data_len + 16;
  94. $send_data =
  95. pack("CCCCa5Ca3C",
  96. $STX,
  97. $socket_len / 0x0100,
  98. $socket_len % 0x0100, $S1,
  99. $seq, $S1,
  100. $cmdid, $S1).
  101. $data.
  102. pack("CC", $CRC, $ETX);
  103. return $send_data;
  104. }
  105. // 1. create data
  106. $packcontent_arr = array();
  107. foreach ($records as $idx => $rows)
  108. {
  109. array_push($packcontent_arr, pack('A7', $records[$idx]['lpr']));
  110. array_push($packcontent_arr, pack('a7', $records[$idx]['seat_no']));
  111. array_push($packcontent_arr, pack('a', $records[$idx]['ticket']));
  112. array_push($packcontent_arr, pack('a19', $records[$idx]['in_time']));
  113. array_push($packcontent_arr, pack('a'. strlen($records[$idx]['in_pic_name']) , $records[$idx]['in_pic_name']));
  114. array_push($packcontent_arr, pack('a19', $records[$idx]['pay_time']));
  115. array_push($packcontent_arr, pack('a10', $records[$idx]['start_date']));
  116. array_push($packcontent_arr, pack('a10', $records[$idx]['end_date']));
  117. array_push($packcontent_arr, pack('a5', $records[$idx]['start_time']));
  118. array_push($packcontent_arr, pack('a5', $records[$idx]['end_time']));
  119. array_push($packcontent_arr, pack('a1', $records[$idx]['area_code']));
  120. }
  121. // gen packcontent
  122. $packcontent = implode(pack('C', $D1), $packcontent_arr);
  123. // gen data
  124. $data = pack("aC", count($records), $D1) . $packcontent . pack("C", $D1); // 20170928 為了和舊版一致尾巴都補上 0x1f
  125. // get data length
  126. $data_len = strlen($data);
  127. $socket_len = $data_len + 16;
  128. // gen send_data
  129. $send_data =
  130. pack("CCCCa5Ca3C",
  131. $STX,
  132. $socket_len / 0x0100,
  133. $socket_len % 0x0100, $S1,
  134. $seq, $S1,
  135. $cmdid, $S1).
  136. $data.
  137. pack("CC", $CRC, $ETX);
  138. return $send_data;
  139. }
  140. // 執行worker
  141. Worker::runAll();