IndexAction.class.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php
  2. class IndexAction extends Action {
  3. private $connpool;
  4. /*
  5. 参数说明:
  6. connection:
  7. */
  8. private function onClose($connection){
  9. log_debug('onClose:' . $connection->imei. ' closed');
  10. //移除长连接
  11. $this->removePool($connection);
  12. }
  13. /*
  14. 参数说明:
  15. connection:
  16. */
  17. private function onConnect($connection){
  18. log_debug($connection->imei . ' connected');
  19. $connection->m_packet = '';
  20. }
  21. /*
  22. 参数说明:
  23. connection:
  24. data:
  25. */
  26. private function onMessage($connection, $data){
  27. log_debug("raw:" . bin2hex($data));
  28. $connection->m_packet .= $data;
  29. //检查\0结束符,检查到就是一段命令结束
  30. $lastchar = substr($data,-1);
  31. if( ord($lastchar) != 0 ){
  32. return;
  33. }
  34. $packet = trim($connection->m_packet);
  35. $connection->m_packet = ''; //长连接,必须清空字符串
  36. //解码请求消息
  37. log_debug('packet: '. $packet);
  38. $req = json_decode( trim($packet));
  39. if(!$req){
  40. log_error('decode failed ' . $packet);
  41. $connection->close();
  42. return;
  43. }
  44. log_debug('decode success - ' . $packet);
  45. //处理不同的协议
  46. if($req->method == "appLogin"){ //app请求登录
  47. $this->onAppLogin($req,$connection);
  48. $connection->request = $req;
  49. }else if($req->method == "heartBeat"){ //长链接时要检查心跳
  50. $this->onProtoHeartbeat($req,$connection);
  51. $connection->request->msgid = $req->msgid;
  52. }else if($req->method == "appSendRealTimeDeviceData"){ //app发送实时数据
  53. }else if($req->method == "sendControl"){ //手动控制
  54. }else if($req->method == "ModifyAutoControlInfo"){ //自动控制
  55. }else{
  56. log_error('unknown req method ' . $req->method);
  57. }
  58. }
  59. /*
  60. */
  61. public function index(){
  62. Vendor('Workerman.Autoloader');
  63. $worker = new Workerman\Worker("tcp://0.0.0.0:1024");
  64. //$worker->count = 4;
  65. $worker->onWorkerStart = function($worker){
  66. //$this->onWorkerStart($worker);
  67. };
  68. $worker->onWorkerStop = function($worker) {
  69. $this->onWorkerStop($worker);
  70. };
  71. $worker->onConnect = function($connection){
  72. //$this->onConnect($connection);
  73. };
  74. $worker->onMessage = function($connection,$data){
  75. $this->onMessage($connection,$data);
  76. };
  77. $worker->onClose = function($connection){
  78. $this->onClose($connection);
  79. };
  80. $worker->onBufferFull = function($connection){
  81. //$this->onBufferFull($connection);
  82. };
  83. $worker->onBufferDrain = function($connection){
  84. //$this->onBufferDrain($connection);
  85. };
  86. $worker->onError = function($connection, $code, $msg){
  87. $this->onError($connection, $code, $msg);
  88. };
  89. Workerman\Worker::runAll();
  90. }
  91. /*
  92. 参数说明:
  93. req:
  94. connection:
  95. */
  96. private function onAppLogin($req, $connection){
  97. //检查imei地址
  98. if(!$req->imei){
  99. log_error('$req->imei is empty. ' . json_encode($req));
  100. $connection->close();
  101. return;
  102. }
  103. //通过登录验证,加入连接池
  104. $this->addPool($req->imei,$connection);
  105. log_debug('login success. should put into connection pool. imei = ' . $req->imei);
  106. // 将数据更新到数据表中
  107. $data = $req->channel;
  108. $device_id = inputDeviceInfo($req->imei);
  109. $channel = inputChannel($device_id,$data);
  110. }
  111. /*
  112. 参数说明:
  113. req:
  114. connection:
  115. */
  116. private function onProtoHeartbeat($req, $connection){
  117. }
  118. /*
  119. 参数说明:
  120. connection:
  121. code:
  122. msg:
  123. */
  124. private function onError($connection, $code, $msg){
  125. log_error("onError:" . $connection->imei . $msg);
  126. }
  127. /*
  128. 参数说明:
  129. worker:
  130. */
  131. private function onWorkerStop($worker){
  132. }
  133. /*
  134. */
  135. public function test(){
  136. $i = 0;
  137. while (1) {
  138. $model = M("jzgl_station");
  139. $model->count() . "\n";
  140. echo memory_get_usage() . "\n";
  141. $i++;
  142. if ($i > 10) break;
  143. }
  144. }
  145. /*
  146. 参数说明:
  147. imei:设备imei
  148. connection:链接
  149. */
  150. private function addPool($imei, $connection){
  151. $connection->imei = $imei;
  152. $this->connections[$imei] = $connection;
  153. }
  154. /*
  155. 参数说明:
  156. connection:
  157. */
  158. private function removePool($connection){
  159. //获取连接
  160. $imei = $connection->imei;
  161. //从所有连接中移除连接
  162. unset( $this->connections[$imei]);
  163. }
  164. }