rfid_proto->tcp_unpack_msg($packet); if(! $result['Success'] ){ $this->rfid_proto->decode_error_log('unpack_fail','unpack packet failed ,result : '.json_encode($result)); return; } //记录从redis获取到的基站数据包 $this->rfid_proto->decode_packet_log($result['StationCode'],$result['StationCode'].' => '.$packet_text); //获取一条车辆标签(电子标签编码) $FirstLabelNumber = $result['VehicleList'][0]['VehicleNumber']; //tcp_log('tcp packet received. station code= ' . $result['StationCode'] . ', label_number= ' . $FirstLabelNumber); //未入库基站,缓存命中,直接返回 $not_exit_station_key = 'not_exit_station_'.$result['StationCode']; $not_exit_station = \Jiaruan\StaticCache::get($not_exit_station_key); if( \Jiaruan\StaticCache::ishit($not_exit_station) ){ decode_error_log('not_existed_station', 'station not existed,cath is hit, station_code = ' . $result['StationCode']); return; } //已开局基站,缓存一小时基站信息,避免频繁查询 $station_key = 'station_info_'.$result['StationCode']; $station_info = \Jiaruan\StaticCache::get($station_key); if( !\Jiaruan\StaticCache::ishit($station_info) ){ try{ //获取基站信息 $cond = array('DeviceCode' => $result['StationCode']); //排除指定字段,防止旧系统查询不存在的字段时报错 $station_info = M('jms_station')->where($cond)->field('IsDuplicate,ChargerId,PhotoUrl,SimCardNo,DeviceType,AddTime,InstallationTime,OpenSucessTime,OnlineTime,Comment,IsRecycled,PoliceId,MoveStationLeader,MoveStationPhone,ManufactType',true)->find(); //$station_info = M('jms_station')->where($cond)->field('ID,StationNumericId,FirstLabelNumber,InstallationStatus,CityId,Longitude,Latitude,Address,StationType,DeviceNumber,DeviceName,')->find(); }catch (Exception $e){ $msg = 'get_station_info ,cach exception!! error_code = '.$e->getCode().', error_msg = '.$e->getMessage().', station_code = '.$result['StationCode']; decode_error_log('get_station_conn_mysql_exception',$msg); } //不存在的基站,缓存十分钟,并返回 if(!$station_info){ decode_error_log('not_existed_station', 'station not existed, station_code = ' . $result['StationCode']); \Jiaruan\StaticCache::set($not_exit_station_key,true,600); return; } if ( $station_info['InstallationStatus'] == C('开局状态_已成功') ){ \Jiaruan\StaticCache::set($station_key,$station_info,3600); } } //对数据包进行日志记录 /* $data = array( 'StationId' => $station_info['ID'] ? : 0, 'StationCode' => $result['StationCode'], 'PacketData' => $packet_text, 'AddTime' => date('Y-m-d H:i:s') ); */ $data = array( 'StationId' => $station_info['StationNumericId'] ? : ($station_info['ID']?:0),//兼容旧版本 'StationCode' => $result['StationCode'], 'PacketData' => $packet_text, 'AddTime' => date('Y-m-d H:i:s') ); //原始包存到表格存储 $rawData = $data;//tablestore $rawData['StationCode'] = $station_info['DeviceNumber'];//tablestore $this->routeStore->addRawPacket($station_info['CityId'], $rawData); //移动基站,过大的数据包,跳过处理 if($station_info['StationType']==C('基站类型_移动基站')&&$result['body_length']>1000){ decode_error_log('too_big_packet_move_station','move_station packet too big, skip decode; station_code => '.$result['StationCode']); return; } //普通基站,过大的数据包,记录一下,但继续处理 if($station_info['StationType']==C('基站类型_普通基站')&&$result['body_length']>1000){ decode_error_log('too_big_packet_normal_station','normal_station packet too big, station_code => '.$result['StationCode']); } /* $start = microtime(true); if( ! M('jms_rpacket')->createAdd($data) ){ decode_error_log('add_rpacket_fail','add rpacket to jms_rpacket fail, error_message:'.M('jms_rpacket')->getLastSql().', data: '.json_encode($data)); return; } echo '************time0: '.use_microtime($start).PHP_EOL; */ //更新基站信息(已开局基站,间隔一分钟更新一次,避免频繁更新) $station_key_update_time = 'station_key_update_time_'. $result['StationCode']; $station_update_time = \Jiaruan\StaticCache::get($station_key_update_time); if( !\Jiaruan\StaticCache::ishit($station_update_time) && $FirstLabelNumber && !is_mock_route($FirstLabelNumber) ){ $data = array(); if(!$station_info['FirstLabelNumber'] && $FirstLabelNumber) $data['FirstLabelNumber'] = $FirstLabelNumber; if( $station_info['InstallationStatus'] == C('开局状态_开局中') ){ $data['InstallationStatus'] = C('开局状态_已成功'); $data['OpenSucessTime'] = date('Y-m-d H:i:s'); } //异常基站跳过更新基站状态 $cond = array('DeviceCode' => $result['StationCode']); $station_status = M('jms_station')->where($cond)->getField('DeviceStatus'); if($station_status != C('基站状态_异常')){ $data['DeviceStatus'] = C('基站状态_在线'); } $data['OnlineTime'] = date('Y-m-d H:i:s'); $start = microtime(true); try{ $cond = array('ID'=>$station_info['ID']); if(! M('jms_station')->where($cond)->save($data) ){ decode_error_log('update_station_info',"update station info failed. sql = " . M('jms_station')->getLastSql().',db_error = '. M('jms_station')->getDbError()); } }catch (Exception $e) { $msg = 'update_station_info ,cach exception!! error_code = '.$e->getCode().', error_msg = '.$e->getMessage().', station_code = '.$result['StationCode']; decode_error_log('update_station_conn_mysql_exception',$msg); } echo '************time1:'.use_microtime($start).PHP_EOL; //已开局基站,缓存更新时间 if( $station_info['InstallationStatus'] == C('开局状态_已成功') ){ \Jiaruan\StaticCache::set($station_key_update_time,time(),60); } } //还没有指定城市,跳过 if(! $station_info['CityId'] ){ decode_error_log('cityid_empty','station cityid not existed, station_code: '.$result['StationCode']); return; } //还没有开局成功,跳过 if($station_info['InstallationStatus'] != C('开局状态_已成功') ){ decode_error_log('not_kaiju','station not kaiju, station_code: '.$result['StationCode']); return; } /* //检测基站近一分钟内是否更新过,更新过的跳过 if($this->check_station_is_cathed($station_info['DeviceNumber'])){ echo 'skip update station vehicle route;station_code: '.$station_info['DeviceCode'].PHP_EOL; return; }*/ //保存到车辆表 foreach($result['VehicleList'] as $key=>$row){ $result['VehicleList'][$key]['StationCode'] = $result['StationCode']; $result['VehicleList'][$key]['CityId'] = $station_info['CityId']; $start = microtime(true); $not_exist_key = 'not_exist_key_'.$row['VehicleNumber']; $not_exist = \Jiaruan\StaticCache::get($not_exist_key); // 未入库的标签缓存命中就跳过 if( \Jiaruan\StaticCache::ishit($not_exist) ){ continue; } try{ $cond = array('DeviceNumber'=> $row['VehicleNumber'] ); $vehicle_info = M('jms_vehicle')->where($cond)->field('ID,VehicleNumericId,UserId,StationCode,DeviceStatus,LicensePlate')->find(); }catch (Exception $e){ $msg = 'get_vehicle_info ,cach exception!! error_code = '.$e->getCode().', error_msg = '.$e->getMessage().', vehicle_no = '.$row['VehicleNumber']; decode_error_log('get_vehicle_conn_mysql_exception',$msg); continue; } //获取未入库标签,缓存十分钟,避免频繁查询 if(!$vehicle_info){ $result['VehicleList'][$key]['VehicleId'] = 0; $result['VehicleList'][$key]['VehicleStatus'] = -1; //-1表示不存在的车辆标签 //tcp_log( 'skip save vehicle (not exists) '. $row['VehicleNumber'] ); decode_error_log('not_exist_vehicles','skip save vehicle (not exists) '. $row['VehicleNumber'].',station_code:'.$result['StationCode']); \Jiaruan\StaticCache::get($not_exist_key,true,600); continue; } $row['StationCode'] = $result['StationCode']; $row['Longitude'] = $station_info['Longitude']; $row['Latitude'] = $station_info['Latitude']; $row['Address'] = $station_info['Address']; $start = microtime(true); $result['VehicleList'][$key]['VehicleId'] = $vehicle_info['VehicleNumericId'] ? : ($vehicle_info['ID']?:0);//兼容旧版本 $result['VehicleList'][$key]['LastStationCode'] = $vehicle_info['StationCode']; $result['VehicleList'][$key]['VehicleStatus'] = $vehicle_info['DeviceStatus']; $result['VehicleList'][$key]['LicensePlate'] = $vehicle_info['LicensePlate']; $notkaihu_key = 'cach_notkaihu_'.$row['VehicleNumber']; $not_kaihu = \Jiaruan\StaticCache::get($notkaihu_key); //获取未开户标签缓存命中,跳过 if( \Jiaruan\StaticCache::ishit($not_kaihu) ){ echo 'no kaihu , cach is hit, skip,vehicle_no = '.$row['VehicleNumber'].PHP_EOL; continue; } //模拟轨迹数据,跳过更新车辆信息 if(is_mock_route($row['VehicleNumber'])){ echo 'mock_route,skip update jms_vehicle'.PHP_EOL; continue; } //未开户车辆,缓存十分钟,避免频繁查询 if(!$vehicle_info['UserId']){ echo 'no kaihu skip '.PHP_EOL; echo '************time: '.use_microtime($start).PHP_EOL; \Jiaruan\StaticCache::set($notkaihu_key,true,600); continue; } //移动基站跳过更新 if($station_info['StationType']==C('基站类型_移动基站')){ echo 'skip move station route '.PHP_EOL; continue; } try{ if( M('jms_vehicle')->createSave($cond,$row) ){ decode_log( 'save vehicle ok '. $row['VehicleNumber'] ); echo '************time2:'.use_microtime($start).PHP_EOL; }else{ decode_error_log( 'update_vehicle_info ', 'update_vehicle_info failed,vehicle_no = '. $row['VehicleNumber'] . ', sql = ' .M('jms_vehicle')->getLastSql().',db_error = '. M('jms_vehicle')->getDbError() ); } }catch (Exception $e) { $msg = 'update_vehicle_info ,cach exception!! error_code = '.$e->getCode().', error_msg = '.$e->getMessage().', vehicle_no = '.$row['VehicleNumber']; decode_error_log('update_vehicle_conn_mysql_exception',$msg); } } /* //如果是移动基站,轨迹保存到临时监控轨迹表中 if($station_info['StationType']==C('基站类型_移动基站')){ $this->add_monitor_sroute($result,$station_info); }else{ $this->add_normal_sroute($result,$station_info); } */ //添加解包日志 vehicle_route_log('decode',$result); station_route_log('decode',$result); //推送车辆轨迹信号到redis $this->push_redis_vsignal($result['VehicleList']); // tablestore if (C("是否支持表格存储")) { //if (!in_array($station_info['CityId'], [1, 28])) {//28义乌 1鹿邑 // return; //} //$this->TsAddRawPacket($station_info['CityId'], $rawData); if ($station_info['StationType'] == C('基站类型_移动基站')) { $this->add_monitor_tablestore_sroute($result, $station_info); } else { $this->add_normal_tablsestore_sroute($result, $station_info); } } } /* */ public function index(){ $redis_raw_packet = Redis("fdqu_raw_packet","queue"); //实例化信号处理类 $this->rfid_proto = new Rlgs\Proto\RfidStation2(); $start_time = time(); do{ //query one record $packet_text = $redis_raw_packet->pop(); if(!$packet_text){ echo 'no raw packet.'.PHP_EOL; sleep(1); continue; } //parse packet $packet = $this->rfid_proto->tcp_str2bin($packet_text); if(!$packet){ $this->rfid_proto->decode_error_log('parse_fail','parse packet failed ,packet_text : '.$packet_text); continue; } $this->import($packet,$packet_text); }while(time()-$start_time<60); } /* 参数说明: signal_list: */ private function push_redis_vsignal($signal_list){ foreach($signal_list as $key=>$row){ if($row['IsOnline']){ $data = array( 'CityId' => $row['CityId'], 'VehicleNumber'=>$row['VehicleNumber'], 'StationCode'=> $row['StationCode'], 'OnlineTime' => $row['OnlineTime'], 'Timestamp' => $row['Timestamp'], 'SignalCount' => $row['SignalCount'], 'AddTime' => date('Y-m-d H:i:s'), ); $r = Redis("fdqu_vehicle_signal","queue"); $r->push($data); echo '成功添加一条轨迹信号到redis'. PHP_EOL; } } } /* 参数说明: result: station_info: */ private function add_monitor_sroute($result, $station_info){ /* //先删除该移动基站2天以前的轨迹 $cond = array( 'StationId'=>$station_info['ID'], 'OnlineTime' => array( 'lt',date('Y-m-d 00:00:00',strtotime("-2 day")) ) ); if(M('jms_monitor_sroute')->where($cond)->find()){ $result = M('jms_monitor_sroute')->where($cond)->delete(); tcp_log( 'success delete 2 days ago data count : '.$result.PHP_EOL ); }*/ //添加车辆轨迹到临时表 $addTime = date('Y-m-d H:i:s'); foreach($result['VehicleList'] as $row){ $row['StationCode'] = $result['StationCode']; if(!$row['VehicleId']){ decode_log( '[not found]skip add route '. $row['StationName'] . ' '. $row['VehicleNumber'] ); continue; } $start = microtime(true); //不接收所有标签数据的基站,要检查车辆是否已开户 if(!$station_info['IsReceiveAll']){ $cond = array('DeviceNumber'=>$row['VehicleNumber']); if(!M('jms_vehicle')->where($cond)->getField('UserId')){ $end = microtime(true); decode_log( 'not kaihu , skip add monitor route '. $row['VehicleNumber']); continue; } } echo '************time1:'.use_microtime($start).PHP_EOL; if($row['IsOnline']){ //查看车辆最近一个基站是否这个基站 $row['CityId'] = $station_info['CityId']; $row['StationId'] = $station_info['StationNumericId']?:$station_info['ID']; $row['StationName'] = $station_info['DeviceName']; $row['Longitude'] = $station_info['Longitude']; $row['Latitude'] = $station_info['Latitude']; $row['Address'] = $station_info['Address']; $row['AddTime'] = $addTime; //如果是被盗状态车辆,轨迹同时保存到固定基站轨迹表 $cond = array('DeviceNumber'=>$row['VehicleNumber']); $vehicle_status = M('jms_vehicle')->where($cond)->getField('DeviceStatus'); $start = microtime(true); if($vehicle_status == C('车辆状态_被盗')){ if( M('jms_sroute')->createAdd($row) ){ decode_log( 'stolen monitor_route add to sroute ok '. $row['StationName'] . ' '. $row['VehicleNumber']); } else{ decode_log( 'stolen monitor_route add to sroute fail '. $row['StationName'] . ' '. $row['VehicleNumber'] . ' sql-' .M('jms_sroute')->getLastSql()); } echo '************time2:'.use_microtime($start).PHP_EOL; } $start = microtime(true); if( M('jms_monitor_sroute')->createAdd($row) ) decode_log( 'add monitor_sroute ok '. $row['StationName'] . ' '. $row['VehicleNumber'] .' OnlineTime: '.$row['OnlineTime'].' ,AddTime: '.$addTime.' ,timestamp: '.$row['time']); else decode_log( 'add monitor_sroute fail '. $row['StationName'] . ' '. $row['VehicleNumber'] . ' sql-' .M('jms_sroute_tmp')->getLastSql()); echo '************time3:'.use_microtime($start).PHP_EOL; } else{ decode_log( '[offline]skip monitor_sroute add route '. $row['StationName'] . ' '. $row['VehicleNumber'] ); } } } /* 参数说明: result: station_info: */ private function add_normal_sroute($result, $station_info){ //保存到轨迹表 $addTime = date('Y-m-d H:i:s'); foreach($result['VehicleList'] as $row){ if(!$row['Timestamp']){ decode_error_log('time_stamp_empty','skip update(time_stamp is empty),vehicle: '. $row['VehicleNumber'].',station_code: '.$result['StationCode']); continue; } $cond = array('DeviceNumber'=>$row['VehicleNumber']); if(!M('jms_vehicle')->where($cond)->getField('UserId')){ decode_log( 'not kaihu , skip add route ' .$row['VehicleNumber'] ); continue; } $row['StationCode'] = $result['StationCode']; if(! $row['VehicleId']){ decode_log( '[not found]skip add route '. $row['StationName'] . ' '. $row['VehicleNumber'] ); continue; } if($row['IsOnline']){ //查看车辆最近一个基站是否这个基站 if($result['StationCode'] != $result['LastStationCode']){ //不是的话,是个新的轨迹 $row['CityId'] = $station_info['CityId']; //分表轨迹数据要,stationid要用整数类型,不能用guid类型 $row['StationId'] = $station_info['StationNumericId']?:($station_info['ID']?:0);//兼容旧版本 $row['StationName'] = $station_info['DeviceName']; $row['Longitude'] = $station_info['Longitude']; $row['Latitude'] = $station_info['Latitude']; $row['Address'] = $station_info['Address']; $row['AddTime'] = $addTime; $start = microtime(true); if( M('jms_vroute')->createAdd($row) ) decode_log( 'add vroute ok '. $row['StationName'] . ' '. $row['VehicleNumber'] ); else decode_log( 'add vroute fail '. $row['StationName'] . ' '. $row['VehicleNumber'] . ' sql-' .M('jms_route')->getLastSql()); echo '************time2:'.use_microtime($start).PHP_EOL; $start = microtime(true); if( M('jms_sroute')->createAdd($row) ) decode_log( 'add sroute ok '. $row['StationName'] . ' '. $row['VehicleNumber'] ); else decode_log( 'add sroute fail '. $row['StationName'] . ' '. $row['VehicleNumber'] . ' sql-' .M('jms_route')->getLastSql()); echo '************time3:'.use_microtime($start).PHP_EOL; //如果是被盗状态车辆,轨迹同时保存到监控轨迹表 $cond = array('DeviceNumber'=>$row['VehicleNumber']); $vehicle_status = M('jms_vehicle')->where($cond)->getField('DeviceStatus'); if($vehicle_status == C('车辆状态_被盗')){ $row['StationType'] = C('基站类型_普通基站'); $start = microtime(true); if( M('jms_monitor_sroute')->createAdd($row) ){ decode_log( 'add monitor_sroute ok '. $row['StationName'] . ' '. $row['VehicleNumber'] ); } else{ decode_log( 'add monitor_sroute fail '. $row['StationName'] . ' '. $row['VehicleNumber'] . ' sql-' .M('jms_monitor_sroute')->getLastSql()); } echo '************time1:'.use_microtime($start).PHP_EOL; } } else{ decode_log( '[same-station]skip add route '. $row['StationName'] . ' '. $row['VehicleNumber'] ); } } else{ decode_log( '[offline]skip add route '. $row['StationName'] . ' '. $row['VehicleNumber'] ); } } } /* */ public function delete_monitor_route(){ //先删除该移动基站2天以前的轨迹 $cond = array( 'OnlineTime' => array( 'lt',date('Y-m-d 00:00:00',strtotime("-2 day")) ) ); if(M('jms_monitor_sroute')->where($cond)->find()){ echo 'start to delete '.PHP_EOL; $result = M('jms_monitor_sroute')->where($cond)->delete(); echo 'finished to delete '.PHP_EOL; decode_log( 'success delete 2 days ago data result : '.$result.PHP_EOL ); }else{ echo 'no data to delete '.PHP_EOL; } exit; } /* 参数说明: station_no:基站标签 */ private function check_station_is_cathed($station_no){ $cache=S('is_cached_station_'.$station_no); if(!$cache){ S('is_cached_station_'.$station_no,1,60); return false; }else{ return true; } } /* 参数说明: result: station_info: */ public function add_normal_tablsestore_sroute($result, $station_info){ //保存到轨迹表 $addTime = date('Y-m-d H:i:s'); $monitorRows = []; // tablestore $normalRows = []; // tablestore foreach($result['VehicleList'] as $row){ $cond = array('DeviceNumber'=>$row['VehicleNumber']); if(!M('jms_vehicle')->where($cond)->getField('UserId')){ continue; } $row['StationCode'] = $result['StationCode']; if(! $row['VehicleId']){ continue; } if($row['IsOnline']){ //查看车辆最近一个基站是否这个基站 if($result['StationCode'] != $result['LastStationCode']){ //不是的话,是个新的轨迹 $row['StationType'] = C('基站类型_普通基站');//tablestore $row['CityId'] = $station_info['CityId']; //分表轨迹数据要,stationid要用整数类型,不能用guid类型 $row['StationId'] = $station_info['StationNumericId']?:($station_info['ID']?:0);//兼容旧版本 $row['StationName'] = $station_info['DeviceName']; $row['Longitude'] = $station_info['Longitude']; $row['Latitude'] = $station_info['Latitude']; $row['Address'] = $station_info['Address']; $row['AddTime'] = $addTime; //如果是被盗状态车辆,轨迹同时保存到监控轨迹表 $cond = array('DeviceNumber'=>$row['VehicleNumber']); $vehicle_status = M('jms_vehicle')->where($cond)->getField('DeviceStatus'); if($vehicle_status == C('车辆状态_被盗')){ $row['StationType'] = C('基站类型_普通基站'); $row['StationCode'] = $station_info['DeviceNumber'];// tablestore $monitorRows[] = $row; // tablestore } else { $row['StationCode'] = $station_info['DeviceNumber'];// tablestore } $normalRows[] = $row; // tablestore } } } $this->routeStore->addMonitorRoute($monitorRows); // tablestore $this->routeStore->addNormalRoute($normalRows); // tablestore } /* 参数说明: result: station_info: */ public function add_monitor_tablestore_sroute($result, $station_info){ /* //先删除该移动基站2天以前的轨迹 $cond = array( 'StationId'=>$station_info['ID'], 'OnlineTime' => array( 'lt',date('Y-m-d 00:00:00',strtotime("-2 day")) ) ); if(M('jms_monitor_sroute')->where($cond)->find()){ $result = M('jms_monitor_sroute')->where($cond)->delete(); tcp_log( 'success delete 2 days ago data count : '.$result.PHP_EOL ); }*/ //添加车辆轨迹到临时表 $monitorRows = []; // tablestore $mobileRows = []; // tablestore $addTime = date('Y-m-d H:i:s'); foreach($result['VehicleList'] as $row){ $row['StationCode'] = $result['StationCode']; if(!$row['VehicleId']){ // tcp_log( '[not found]skip add route '. $row['StationName'] . ' '. $row['VehicleNumber'] ); continue; } $start = microtime(true); //不接收所有标签数据的基站,要检查车辆是否已开户 if(!$station_info['IsReceiveAll']){ $cond = array('DeviceNumber'=>$row['VehicleNumber']); if(!M('jms_vehicle')->where($cond)->getField('UserId')){ $end = microtime(true); // tcp_log( 'not kaihu , skip add monitor route '. $row['VehicleNumber']); continue; } } echo '************time1:'.use_microtime($start).PHP_EOL; if($row['IsOnline']){ //查看车辆最近一个基站是否这个基站 $row['StationType'] = C('基站类型_移动基站');// tablestore $row['CityId'] = $station_info['CityId']; $row['StationId'] = $station_info['StationNumericId']?:$station_info['ID']; $row['StationName'] = $station_info['DeviceName']; $row['Longitude'] = $station_info['Longitude']; $row['Latitude'] = $station_info['Latitude']; $row['Address'] = $station_info['Address']; $row['AddTime'] = $addTime; //如果是被盗状态车辆,轨迹同时保存到固定基站轨迹表 $cond = array('DeviceNumber'=>$row['VehicleNumber']); $vehicle_status = M('jms_vehicle')->where($cond)->getField('DeviceStatus'); $start = microtime(true); if($vehicle_status == C('车辆状态_被盗')){ // if( M('jms_sroute')->createAdd($row) ){ // tcp_log( 'stolen monitor_route add to sroute ok '. $row['StationName'] . ' '. $row['VehicleNumber']); // } // else{ // tcp_log( 'stolen monitor_route add to sroute fail '. $row['StationName'] . ' '. $row['VehicleNumber'] . ' sql-' .M('jms_sroute')->getLastSql()); // } // echo '************time2:'.use_microtime($start).PHP_EOL; $row['StationCode'] = $station_info['DeviceNumber'];// tablestore $monitorRows[] = $row; // tablestore } else { $row['StationCode'] = $station_info['DeviceNumber'];// tablestore } $mobileRows[] = $row; // tablestore // $start = microtime(true); // if( M('jms_monitor_sroute')->createAdd($row) ) // tcp_log( 'add monitor_sroute ok '. $row['StationName'] . ' '. $row['VehicleNumber'] .' OnlineTime: '.$row['OnlineTime'].' ,AddTime: '.$addTime.' ,timestamp: '.$row['time']); // else // tcp_log( 'add monitor_sroute fail '. $row['StationName'] . ' '. $row['VehicleNumber'] . ' sql-' .M('jms_sroute_tmp')->getLastSql()); // echo '************time3:'.use_microtime($start).PHP_EOL; } else{ // tcp_log( '[offline]skip monitor_sroute add route '. $row['StationName'] . ' '. $row['VehicleNumber'] ); } } //移动基站的数据全部添加到移动表里面 //$this->routeStore->addMonitorRoute($monitorRows); // tablestore $this->routeStore->addMobileRoute($mobileRows); // tablestore } /* */ public function index_test(){ /* 在cli模式下,用手工生成的数据,测试解码程序使用 例子:php index.php decode/index_test '9c bc 01 31 00 ca 00 20 88 88 ' */ //$redis_raw_packet = Redis("fdqu_raw_packet","queue"); $start_time = time(); if (C("是否支持表格存储")) { //C("是否支持表格存储", false); $this->routeStore = new \Jiaruan\RouteStore();// tablestore $this->routeStore->reAddTimeoutInfo(); } do{ //query one record //$packet_text = $redis_raw_packet->pop(); global $argv; if (count($argv) != 3 || strpos($argv[2], "9c bc") !==0) { echo "参数错误"; exit(); } $packet_text = $argv[2];//'9c bc 01 31 00 cd 00 10 88 88 cd 88 88 ca 01 01 00 5a 54 68 cb 58 00 01'; if(!$packet_text){ echo 'no raw packet.'.PHP_EOL; sleep(1); break; continue; } //parse packet $packet = tcp_str2bin($packet_text); if(!$packet){ echo 'parse packet failed.'.PHP_EOL; decode_error_log('parse_fail','parse packet failed ,packet_text : '.$packet_text); break; continue; } $this->import($packet,$packet_text); break; }while(time()-$start_time<60); } /* 参数说明: cityId: data: */ private function TsAddRawPacket($cityId, $data){ $tableName = 'yiwushi_28_rpacket';//\Jiaruan\ClTableStoreGridTp::getCountyTableName($cityId, "rpacket"); $model = new OtsModel($tableName); $addTime = strtotime($data['AddTime']); $stationMac = strtoupper(substr(md5($data['StationCode']), 0, 2)) . '-' . $data['StationCode'] . '-' . date('ymd', $addTime); $micro = str_pad(explode(' ', microtime())[0] * 1000000, 6, 0, STR_PAD_LEFT); $onlineTime = $addTime . "." . $micro; $ret = $model->add(['StationMac' => $stationMac, 'OnlineTime' => $onlineTime, 'PacketData' => $data['PacketData']]); if ($ret == false || $ret != 1) { echo $model->getError(); $error = $model->getDbError(); if (strpos($error, "cURL error 28:") !== false) {//received超时 记录到日志里面 需要重试 } else { } echo $error; } } }