imei. ' closed'); //移除长连接 $this->removePool($connection); } /* 参数说明: connection: */ private function onConnect($connection){ log_debug($connection->imei . ' connected'); $connection->m_packet = ''; } /* 参数说明: connection: data: */ private function onMessage($connection, $data){ log_debug("raw:" . bin2hex($data)); $connection->m_packet .= $data; //检查\0结束符,检查到就是一段命令结束 $lastchar = substr($data,-1); if( ord($lastchar) != 0 ){ return; } $packet = trim($connection->m_packet); $connection->m_packet = ''; //长连接,必须清空字符串 //解码请求消息 log_debug('packet: '. $packet); $req = json_decode( trim($packet)); if(!$req){ log_error('decode failed ' . $packet); $connection->close(); return; } log_debug('decode success - ' . $packet); //处理不同的协议 if($req->method == "appLogin"){ //app请求登录 $this->onAppLogin($req,$connection); $connection->request = $req; }else if($req->method == "heartBeat"){ //长链接时要检查心跳 $this->onProtoHeartbeat($req,$connection); $connection->request->msgid = $req->msgid; }else if($req->method == "appSendRealTimeDeviceData"){ //app发送实时数据 }else if($req->method == "sendControl"){ //手动控制 }else if($req->method == "ModifyAutoControlInfo"){ //自动控制 }else{ log_error('unknown req method ' . $req->method); } } /* */ public function index(){ Vendor('Workerman.Autoloader'); $worker = new Workerman\Worker("tcp://0.0.0.0:1024"); //$worker->count = 4; $worker->onWorkerStart = function($worker){ //$this->onWorkerStart($worker); }; $worker->onWorkerStop = function($worker) { $this->onWorkerStop($worker); }; $worker->onConnect = function($connection){ //$this->onConnect($connection); }; $worker->onMessage = function($connection,$data){ $this->onMessage($connection,$data); }; $worker->onClose = function($connection){ $this->onClose($connection); }; $worker->onBufferFull = function($connection){ //$this->onBufferFull($connection); }; $worker->onBufferDrain = function($connection){ //$this->onBufferDrain($connection); }; $worker->onError = function($connection, $code, $msg){ $this->onError($connection, $code, $msg); }; Workerman\Worker::runAll(); } /* 参数说明: req: connection: */ private function onAppLogin($req, $connection){ //检查imei地址 if(!$req->imei){ log_error('$req->imei is empty. ' . json_encode($req)); $connection->close(); return; } //通过登录验证,加入连接池 $this->addPool($req->imei,$connection); log_debug('login success. should put into connection pool. imei = ' . $req->imei); // 将数据更新到数据表中 $data = $req->channel; $device_id = inputDeviceInfo($req->imei); $channel = inputChannel($device_id,$data); } /* 参数说明: req: connection: */ private function onProtoHeartbeat($req, $connection){ } /* 参数说明: connection: code: msg: */ private function onError($connection, $code, $msg){ log_error("onError:" . $connection->imei . $msg); } /* 参数说明: worker: */ private function onWorkerStop($worker){ } /* */ public function test(){ $i = 0; while (1) { $model = M("jzgl_station"); $model->count() . "\n"; echo memory_get_usage() . "\n"; $i++; if ($i > 10) break; } } /* 参数说明: imei:设备imei connection:链接 */ private function addPool($imei, $connection){ $connection->imei = $imei; $this->connections[$imei] = $connection; } /* 参数说明: connection: */ private function removePool($connection){ //获取连接 $imei = $connection->imei; //从所有连接中移除连接 unset( $this->connections[$imei]); } }