123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- <?php
- class IndexAction extends Action {
- private $connpool;
- /*
- 参数说明:
- connection:
- */
- private function onClose($connection){
- log_debug('onClose:' . $connection->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]);
- }
- }
|