|
@@ -0,0 +1,256 @@
|
|
|
+<?php
|
|
|
+namespace catchAdmin\api\service;
|
|
|
+
|
|
|
+use catchAdmin\tag_history\model\Dormitory;
|
|
|
+
|
|
|
+class dispose
|
|
|
+{
|
|
|
+ private $redis;
|
|
|
+ public function __construct($redis){
|
|
|
+
|
|
|
+ $this->redis=$redis;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public function computeData($data){
|
|
|
+ debug_log("InAndOUT","基站:".$data['mac'] .' label :'.$data['label']);
|
|
|
+
|
|
|
+ $hashKey=$data['mac'].'station';
|
|
|
+ $key=$data['label'];
|
|
|
+ $list=[];
|
|
|
+ $length=0;
|
|
|
+ $res= $this->selectHash($hashKey,$key);
|
|
|
+
|
|
|
+ if($res==false){
|
|
|
+ debug_log("InAndOUT","redis没有数据");
|
|
|
+ array_push($list,$data);
|
|
|
+ debug_log("InAndOUT","存入数据".$data);
|
|
|
+ }else{
|
|
|
+ debug_log("InAndOUT","redis初始数据",json_encode($res));
|
|
|
+ $list=$res;
|
|
|
+ debug_log("InAndOUT","上次上报的数据 :".json_encode($list[count($list)-1],true));
|
|
|
+ debug_log("InAndOUT","存入数据".$data);
|
|
|
+ if(($data['report_time']-$list[count($list)-1]['report_time'])>=120){
|
|
|
+ debug_log("InAndOUT","上报次数间隔超过120s,清空redis缓存,从新存入数据");
|
|
|
+ $list=[];
|
|
|
+ array_push($list,$data);
|
|
|
+ }else{
|
|
|
+ $list=$res;
|
|
|
+ array_push($list,$data);
|
|
|
+ if(count($list)>5){
|
|
|
+ debug_log("InAndOUT","数据长度大于5,剔除一条");
|
|
|
+ debug_log("InAndOUT","剔除的一条数据为:".json_encode($list[0]));
|
|
|
+ array_shift($list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ //数据
|
|
|
+ debug_log("InAndOUT","新数据长度 :".json_encode($list));
|
|
|
+ //现在的数据长度
|
|
|
+ $count=count($list);
|
|
|
+ debug_log("InAndOUT","新数据长度 :".$count);
|
|
|
+ //获取配置
|
|
|
+ $config= $this->selectHash("anbang_four_wire",$data['mac']);
|
|
|
+
|
|
|
+
|
|
|
+ if(empty($config)){
|
|
|
+ debug_log("InAndOUT","没有配置");
|
|
|
+ }else{
|
|
|
+ debug_log("InAndOUT","配置参数为:".json_encode($config));
|
|
|
+
|
|
|
+ }
|
|
|
+ $len01=0;
|
|
|
+ $len02=0;
|
|
|
+ $len03=0;
|
|
|
+ $len04=0;
|
|
|
+ $rssi1=0;
|
|
|
+ $rssi2=0;
|
|
|
+ $rssi3=0;
|
|
|
+ $rssi4=0;
|
|
|
+ foreach($list as $item){
|
|
|
+ if(!empty($config)){
|
|
|
+ if($config['front']&&$config['front']>$item["rssi1"]){
|
|
|
+ $rssi1+=$item["rssi1"];
|
|
|
+ $len01+=1;
|
|
|
+ }
|
|
|
+ if($config['behind']&&$config['behind']>$item["rssi2"]){
|
|
|
+ $rssi2+=$item["rssi2"];
|
|
|
+ $len02+=1;
|
|
|
+ }
|
|
|
+ if($config['left']&&$config['left']>$item["rssi3"]){
|
|
|
+ $rssi3+=$item["rssi3"];
|
|
|
+ $len03+=1;
|
|
|
+ }
|
|
|
+ if($config['right']&&$config['right']>$item["rssi4"]){
|
|
|
+ $rssi4+=$item["rssi4"];
|
|
|
+ $len04+=1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }else{
|
|
|
+ $rssi1=$rssi1+$item["rssi1"];
|
|
|
+ $rssi2=$rssi2+$item["rssi2"];
|
|
|
+ $rssi3=$rssi3+$item["rssi3"];
|
|
|
+ $rssi4=$rssi4+$item["rssi4"];
|
|
|
+ $len01+=1;
|
|
|
+ $len02+=1;
|
|
|
+ $len03+=1;
|
|
|
+ $len04+=1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ $data["rssi1"]=number_format($rssi1/$len01,'2');
|
|
|
+ $data["rssi2"]=number_format($rssi2/$len02,'2');
|
|
|
+ $data["rssi3"]=number_format($rssi3/$len03,'2');
|
|
|
+ $data["rssi4"]=number_format($rssi4/$len04,'2');
|
|
|
+ debug_log("InAndOUT","计算出的平均数据 :".json_encode($data));
|
|
|
+ //保存到hash中
|
|
|
+ $this->setHash($hashKey,$key,$list);
|
|
|
+ return $data;
|
|
|
+ }
|
|
|
+ //计算结果设计
|
|
|
+ public function computeResout($data){
|
|
|
+ //前后左右$arr=[$data['resi1'],$data['resi2'],$data['resi3'],$data['resi4']];
|
|
|
+ //前后
|
|
|
+
|
|
|
+ // $redis=$this->redis;
|
|
|
+ // $arr=[$data['resi1'],$data['resi2']];
|
|
|
+ // sort($arr);
|
|
|
+
|
|
|
+ $res=0;
|
|
|
+ if($data['rssi1']==$data['rssi2']){
|
|
|
+
|
|
|
+ debug_log("InAndOUT","前后信号相等则进行过滤掉");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if($data['rssi1']<$data['rssi2']){
|
|
|
+ $res=1;
|
|
|
+ }
|
|
|
+ if($data['rssi1']>$data['rssi2']){
|
|
|
+ $res=2;
|
|
|
+ }
|
|
|
+ debug_log("InAndOUT","信号强度 :".$res);
|
|
|
+ $hashkey='res'.$data['mac'];
|
|
|
+ $key=$data['label'];
|
|
|
+ $json_list= $this->selectHash($hashkey,$key);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if(!$json_list){
|
|
|
+
|
|
|
+ $arr=[
|
|
|
+ "a"=>[['time'=>$data['report_time'],'dirt'=>$res]],
|
|
|
+ 'status'=> ['time'=>null,'dirt'=>null]
|
|
|
+ ];
|
|
|
+ debug_log("InAndOUT","数据不存在,直接存储新数据".json_encode($arr));
|
|
|
+ $this->setHash($hashkey,$key,$arr);
|
|
|
+
|
|
|
+
|
|
|
+ return;
|
|
|
+ }else{
|
|
|
+
|
|
|
+ $resArray=['time'=>$data['report_time'],'dirt'=>$res];
|
|
|
+ debug_log("InAndOUT","当前的新数据".json_encode($resArray));
|
|
|
+ debug_log("InAndOUT","缓存的数据".json_encode($json_list));
|
|
|
+ $s=$json_list;
|
|
|
+ //数据列表
|
|
|
+ $list=$s['a'];
|
|
|
+ //状态
|
|
|
+ $status=$s['status'];
|
|
|
+ //判断时间间隔超过2分钟,则从新计算
|
|
|
+ if(($resArray['time']-$list[count($list)-1]['time'])>120){
|
|
|
+ //时间超过两分钟,进行重置
|
|
|
+ debug_log("InAndOUT","时间超过两分钟,清空数据,载入当前数据");
|
|
|
+ $list=[];
|
|
|
+ $status= ['time'=>null,'dirt'=>null];
|
|
|
+ }
|
|
|
+ array_push($list,$resArray);
|
|
|
+ if(count($list)>5){
|
|
|
+ debug_log("InAndOUT","数据超过五条,剔除一条旧数据");
|
|
|
+ array_shift($list);
|
|
|
+ }
|
|
|
+ debug_log("InAndOUT","时间超过两分钟,清空数据,载入当前数据");
|
|
|
+ debug_log("InAndOUT","当前队列数据",json_encode($list));
|
|
|
+ $front=0;
|
|
|
+ $back=0;
|
|
|
+ if(count($list)>2){
|
|
|
+ //
|
|
|
+ debug_log("InAndOUT","当前队列超过两条可以计算前后:".count($list));
|
|
|
+ //校验权柄
|
|
|
+ foreach($list as $item){
|
|
|
+ if($item['dirt']==1){
|
|
|
+ $front+=1;
|
|
|
+ }
|
|
|
+ if($item['dirt']==2){
|
|
|
+ $back+=1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $res=$front>=$back?1:2;
|
|
|
+ if(empty($status['dirt'])){
|
|
|
+ $status['dirt']= $res;
|
|
|
+ $status['time']= $resArray['time'];
|
|
|
+ debug_log("InAndOUT","无初始化状态,则进行初始化");
|
|
|
+ debug_log("InAndOUT","初始化数据为:".json_encode($resArray));
|
|
|
+ debug_log("InAndOUT","初始化数据为:".json_encode($status));
|
|
|
+ }else{
|
|
|
+ //进行保存
|
|
|
+ if($res!=$status['dirt']){
|
|
|
+ $arr=[
|
|
|
+ 'mac'=> $data['mac'],
|
|
|
+ 'label'=>$data['label'],
|
|
|
+ "begin_time"=>$status['time'],
|
|
|
+ "end_time"=>$resArray['time'],
|
|
|
+ 'dir'=> $status['dirt']==1?1:2
|
|
|
+ ];
|
|
|
+ // $dor=new Dormitory();
|
|
|
+ // $dor->save($arr);
|
|
|
+ debug_log("InAndOUT","得出计算结果",json_encode($arr));
|
|
|
+ $status['dirt']= $res;
|
|
|
+ $status['time']= $resArray['time'];
|
|
|
+ }else{
|
|
|
+ debug_log("InAndOUT","无计算结果",json_encode($status));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $arr=array(
|
|
|
+ "a"=>$list,
|
|
|
+ 'status'=>$status
|
|
|
+ );
|
|
|
+ debug_log("InAndOUT","存入缓存中",json_encode($arr));
|
|
|
+
|
|
|
+ $this->setHash($hashkey,$key,$arr);
|
|
|
+ debug_log("InAndOUT",'操作结束');
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ //查询key hash
|
|
|
+ public function selectHash($hashKey,$key){
|
|
|
+ $res= $this->redis->hGet($hashKey,$key);
|
|
|
+ if(empty($res)){
|
|
|
+ return false;
|
|
|
+ }else{
|
|
|
+ return json_decode($res,true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public function setHash($hashKey,$key,$data){
|
|
|
+ $this->redis->hSet($hashKey,$key,json_encode($data));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|