Api.php 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153
  1. <?php
  2. namespace catchAdmin\api\controller;
  3. use catchAdmin\api\service\dispose;
  4. use catchAdmin\tag_history\model\Access;
  5. use catchAdmin\tag_history\model\Dormitory;
  6. use catchAdmin\tag_history\model\TagHistory;
  7. use catchAdmin\worklocation\model\WorkRecord as ModelWorkRecord;
  8. use catcher\base\CatchRequest as Request;
  9. use catcher\CatchResponse;
  10. use catcher\base\CatchController;
  11. use Exception;
  12. use think\facade\Cache;
  13. use \think\facade\Db;
  14. error_reporting(0);
  15. class Api extends CatchController
  16. {
  17. public function report()
  18. {
  19. $token = $_GET['token'];
  20. if (!$token || $token != '22723927C') {
  21. json_fail('缺少token或者token不对');
  22. }
  23. $param = json_decode(optimize_json(file_get_contents("php://input")), true);
  24. debug_log("上报数据",json_encode($param));
  25. if (json_last_error() != 0) {
  26. json_fail('解析异常', json_last_error_msg());
  27. }
  28. $mac = $param['mac'];
  29. if (empty($mac)) {
  30. json_fail('mac地址不存在');
  31. }
  32. $data = [];
  33. foreach ($param['list'] as $item) {
  34. // $onetime= TagHistory::where("mac",$mac)->where('lable',$item['label'])->order("id","desc")->value("time");
  35. $data[] = [
  36. 'mac' => $mac,
  37. 'lable' => $item['label'],
  38. 'rssi' => $item['rssi'],
  39. 'time' => $item['time'],
  40. 'addTime' => time(),
  41. 'move' => $item['move'],
  42. 'step' => empty($item['step']) ? 0 : $item['step'],
  43. 'temperature' => empty($item['temperature']) ? 0 : $item['temperature'],
  44. //告警
  45. 'temperWarn' => empty($item['temperWarn']) ? 00 : $item['temperWarn'],
  46. // "interval_time"=>empty($onetime) ?0:($item['time']-$onetime)
  47. ];
  48. }
  49. $tage = new TagHistory();
  50. $tage->saveAll($data);
  51. json_success('上传成功');
  52. }
  53. //储存数据到redis
  54. public function redis_to_mysql(){
  55. $ues_redis=Cache::store('redis')->handler();
  56. $dispose = new dispose($ues_redis);
  57. $text=null;
  58. while(1){
  59. $jsonData= $ues_redis->rpop("mqtt_data");
  60. if(empty($jsonData)){
  61. sleep(1);
  62. continue;
  63. }
  64. debug_log("InAndOUT",'数据redis'.$jsonData);
  65. $data=json_decode($jsonData,true);
  66. $time=$data['time'];
  67. $mac=$data['devId'];
  68. //存入基站的最新时间
  69. $dispose->setStations($mac,$time);
  70. $list=[];
  71. $text=$text.$data['cnt'];
  72. if(strlen($text)<24){
  73. continue;
  74. }
  75. while(strlen($text)>=24){
  76. $da=substr($text,0,24);
  77. $t1 = substr($da,8,2)=='00'||substr($da,8,2)=='10'||substr($da,8,2)=='01' ? true:false;
  78. $t2 =substr($da,10,6)=="FFFFFF"||substr($da,10,6)=="000000" ?true:false;
  79. if($t1&&$t2){
  80. $label= substr($da,0,8);
  81. $rssi1= substr($da,16,2);
  82. $rssi2= substr($da,18,2);
  83. $rssi3= substr($da,20,2);
  84. $rssi4= substr($da,22,2);
  85. $DA=[
  86. 'mac' => $mac,
  87. 'label' =>$label,
  88. 'rssi1' => hexdec($rssi1),
  89. 'rssi2' => hexdec($rssi2),
  90. 'rssi3' => hexdec($rssi3),
  91. 'rssi4' => hexdec($rssi4),
  92. 'report_time'=>$time
  93. ];
  94. $vs=false;
  95. $history_status=false;
  96. $DA['other_time']=date("Y-m-d H:i:s",$time);
  97. //打印原始的数据日志
  98. debug_log("label_log","cssh: ".json_encode($DA));
  99. if($DA['rssi1']<=85||$DA['rssi2']<=85||$DA['rssi3']<=85||$DA['rssi4']<=85){
  100. //原始数据只要其中有一条信号小于85 都存入redis 历史数据
  101. $history_status=true;
  102. }
  103. if($DA['rssi1']<=72||$DA['rssi2']<=72||$DA['rssi3']<=72||$DA['rssi4']<=72){
  104. //原始数据只要其中有一条信号小于72 都参与计算
  105. $vs=true;
  106. }
  107. $DA['rssi1']=$DA['rssi1']==255?100:$DA['rssi1'];
  108. $DA['rssi2']=$DA['rssi2']==255?100:$DA['rssi2'];
  109. $DA['rssi3']=$DA['rssi3']==255?100:$DA['rssi3'];
  110. $DA['rssi4']=$DA['rssi4']==255?100:$DA['rssi4'];
  111. $DA["rssi1"]=$DA["rssi1"]<=$DA["rssi3"]?$DA["rssi1"]:$DA["rssi3"];
  112. $DA["rssi2"]=$DA["rssi2"]<=$DA["rssi4"]?$DA["rssi2"]:$DA["rssi4"];
  113. /**
  114. * 缓存到redis中历史数据
  115. */
  116. if(substr($da,8,2)=='01'&&$history_status&&$DA["rssi1"]!=$DA["rssi2"]){
  117. debug_log("label_log","cache: ".json_encode($DA));
  118. $diff= $DA["rssi1"]-$DA["rssi2"];
  119. if(abs($diff)>2){
  120. //历史数据朝前和朝后的信号的差值大于2参与存储
  121. $dispose->set_label_history($DA);
  122. }
  123. debug_log("label_log","cache_diff: ".$diff);
  124. }
  125. /**
  126. * 参与计算的数据
  127. */
  128. if($vs&&(substr($da,8,2)=='01')){
  129. try{
  130. $DA= $dispose->check_data($DA);
  131. //处理的数据参与计算
  132. debug_log("label_log","xsj:".json_encode($DA));
  133. $dispose->computeResout($DA);
  134. }catch(Exception $e){
  135. debug_log("InAndOUT","抛出异常:".$e->getMessage());
  136. }
  137. }
  138. $text=substr($text,24);
  139. }else{
  140. $text=substr($text,1);
  141. }
  142. }
  143. }
  144. }
  145. public function redis_to_mysql2(){
  146. $redis=Cache::store('redis')->handler();
  147. // $dispose = new dispose($redis);
  148. $text=null;
  149. while(1){
  150. $jsonData= $redis->rpop("asset_after_handle");
  151. if(empty($jsonData)){
  152. sleep(1);
  153. continue;
  154. }
  155. //$jsonData='{"devId":"20001001","time":1692605425,"imei":"861714055251247","cnt":"A4A8F901FFFFFFFF52FFFF5DD9CFDD01FFFFFF514A534DEB98D34301FFFFFF584858FF1A6A890301FFFFFF5040494A2E33BD1201FFFFFF5255515734CA3F9C01FFFFFFFF4C4B5152A516F901FFFFFFFF4DFFFF52A49DC901FFFFFF584F59FF52A5453901FFFFFF473E4548EB98490301FFFFFF53495055706319AC01FFFFFFFF51FFFF2E3B90C201FFFFFF5548525352A5501901FFFFFF50454F4D52A4BC2901FFFFFF5950FFFFE2B02B2501FFFFFF4F46554B52A4CBC901FFFFFF51404B501A6A566301FFFFFF584B525152A4AC1901FFFFFF534650FF52A5264901FFFFFFFF50FFFF52A4CFD901FFFFFFFF4A57FF52A51ED901FFFFFFFF52FFFFE2B9D59501FFFFFFFF52FFFFEB98AD5301FFFFFFFF4BFFFFEC327C2301FFFFFF504C5255EA5C309E01FFFFFF504B4F4AEC335A4301FFFFFFFF50FF5421E13A9101FFFFFF4E4E4C5034C5E13C01FFFFFF503B4E4A34ABC1AC01FFFFFF4E3F49425DDE252D01FFFFFF4C4C4B485DD841CD01FFFFFFFF4850522E2F0C4201FFFFFFFF5357FFC639206301FFFFFF55545450E2BFAEE501FFFFFFFF52535021DEDEB101FFFFFF4F494FFF52A4FA5901FFFFFFFF5AFF5752A5505901FFFFFFFFFF5852EC33624301FFFFFFFFFF5757E2B5CE6501FFFFFF5750FF5752A4DB0901FFFFFF524C4F4E52A51E5901FFFFFFFF52FFFF52A5168901FFFFFF594DFFFFE98EEC5B01FFFFFF584EFFFF52A4C05901FFFFFFFF4EFFFF34C39FDC01FFFFFFFF51FFFF52A4F77901FFFFFFFF50FF595DD6741D01FFFFFFFF"}';
  156. //{"devId":"637405","time":1691596816,"imei":"863488051843244","cnt":"FFFFFFFFFF00002CFF0000032000005DD9E37D01FFFFFF4EFFFFFF5DDADB3D01FFFFFFFF4EFFFF5DDDFF1D01FFFFFF4FFFFFFFA7"}
  157. // {
  158. //     "mac": "01396C",
  159. //     "data": [
  160. //         {
  161. //             "label": "230600070007",
  162. //             "time": 1691128972,
  163. //             "ant": 1,
  164. //             "rssi": 19
  165. //         },
  166. //         {
  167. //             "label": "230600070007",
  168. //             "time": 1691128972,
  169. //             "ant": 2,
  170. //             "rssi": 21
  171. //         }
  172. //     ]
  173. // }
  174. $list=json_decode($jsonData,true);
  175. $redis=Cache::store('redis')->handler();
  176. $received_state=$redis->hget('api_receiver_asset_state', 'accessClassReport');
  177. $mac=$list['mac'];
  178. foreach($list['data'] as $val){
  179. $report_data=[
  180. 'mac' => $mac,
  181. 'label' =>$val['label'],
  182. 'rssi' =>$val['rssi'],
  183. 'ant' =>$val['ant'],
  184. 'time'=>$val['time']
  185. ];
  186. // var_dump($report_data);
  187. debug_log("920_redis_data",'mac:'. $mac.' label:'.$val['label'].' ant:'.$val['ant'].' rssi:'.$val['rssi'].' time:'.$val['time']);
  188. if($received_state=='1'){
  189. //如果开启盘点 则有数据就推送
  190. $url="http://localhost:8115/api/assetReceiveReport";
  191. var_dump($report_data);
  192. $postFields = http_build_query($report_data);
  193. $url_res= curl_http_post($postFields,$url,false);
  194. echo 'assetReceiveReport res'.PHP_EOL;
  195. var_dump($url_res);
  196. }
  197. $hashKey='station_access_data';
  198. $key=$mac.'_'.$val['label'];
  199. $old_data=json_decode($redis->hGet($hashKey,$key),true);
  200. if($old_data){
  201. //取出历史数据 对比两次数据变化
  202. if($old_data['ant']==$report_data['ant']){
  203. //相同 则更新时间
  204. $redis->hSet($hashKey,$key,json_encode($report_data));
  205. }else{
  206. //比较数据时间
  207. //默认新数据更晚上报
  208. $send_data=[
  209. "mac"=>$mac,
  210. "label"=>$val['label'],
  211. 'time'=>$val['time'],
  212. ];
  213. if($report_data['ant']>$old_data['ant']){
  214. //1->2 内到外 出
  215. $send_data['dirt']=2;
  216. }else{
  217. //2>1 外到内 进
  218. $send_data['dirt']=1;
  219. }
  220. var_dump($send_data);
  221. //推送数据
  222. $url="http://localhost:8115/api/assetReport";
  223. $postFields = http_build_query($send_data);
  224. $url_res= curl_http_post($postFields,$url,false);
  225. echo 'assetReport res'.PHP_EOL;
  226. var_dump($url_res);
  227. $redis->hSet($hashKey,$key,json_encode($report_data));
  228. }
  229. }else{
  230. $redis->hSet($hashKey,$key,json_encode($report_data));
  231. }
  232. }
  233. }
  234. }
  235. /**
  236. * 清除数据
  237. *
  238. * @return void
  239. */
  240. public function clear_redis(){
  241. //清理超时的标签
  242. while(1){
  243. sleep(1);
  244. $redis=Cache::store('redis')->handler();
  245. $dispose = new dispose($redis);
  246. $keylist= $dispose->getStations();
  247. //获取存储的的基站
  248. debug_log("clear_label","查询数据".json_encode($keylist));
  249. if(empty($keylist)){
  250. continue;
  251. }
  252. foreach($keylist as $station){
  253. //结果key值
  254. $key="res".$station;
  255. //存取旧的数据的reids数据
  256. $catchkey=$station."station";
  257. //获取该基站的所有key
  258. $keys= $redis->hKeys($key);
  259. if(empty($keys)){
  260. continue;
  261. }
  262. foreach($keys as $item){
  263. if( $json_data=$redis->hget($key,$item)){
  264. debug_log("clear_label",'基站'.$station.'获取的数据'.'标签'.$item.$json_data);
  265. $json_data=json_decode($json_data,true);
  266. //列表
  267. $a=$json_data['a'];
  268. //状态
  269. $status=$json_data['status'];
  270. //是否形成进出考勤
  271. $in_and_out=$json_data["in_and_out"];
  272. //总数
  273. $count= count($a);
  274. $time= $dispose->getNowStationTime($station);
  275. debug_log("clear_label","标签最新最新时间". date('Y-m-d H:i:s', $time));
  276. //如果标签间隔超过7s,则超时并判断能否生成进出
  277. if(($time-$json_data["time"])<=7){
  278. debug_log("clear_label", $item.':'. "标签上报间隔没有超过7秒进行跳过");
  279. continue;
  280. }
  281. if($count<5){
  282. //如果信号条数小于等于2条不参与计算,信号条数大于2小于5条,则直接进行判断是否形成进出
  283. if($count>2){
  284. debug_log("clear_label", $item.':'. "标签信号个数等于超过2个,参与计算");
  285. $frist=$a[0]['dirt'];
  286. $end=$a[$count-1]['dirt'];
  287. if($frist!=$end){
  288. debug_log("clear_label", $item.':'. "标签信号个数等于超过2个,参与计算,得出结果:".$frist);
  289. $dispose->network_push($station,$item,$a[$count-1]['time'],$frist==1?1:2);
  290. }else{
  291. debug_log("clear_label", $item.':'. "标签信号个数没有超过2个,全部去清除");
  292. }
  293. }
  294. }else{
  295. //如果信号条数大于5条,则判断最后三条数据的信号强的方向是否和初始方向相反
  296. $front=0;
  297. $back=0;
  298. $res=0;
  299. if($a[$count-3]['dirt']==1){
  300. $front+=1;
  301. }else{
  302. $back+=1;
  303. }
  304. if($a[$count-2]['dirt']==1){
  305. $front+=1;
  306. }else{
  307. $back+=1;
  308. }
  309. if($a[$count-1]['dirt']==1){
  310. $front+=1;
  311. }else{
  312. $back+=1;
  313. }
  314. if($front>$back){
  315. $res=1;
  316. }else{
  317. $res=2;
  318. }
  319. if($status['dirt']!=$res){
  320. //最后三条数据的信号强的方向和初始方向相反,则形成进出考勤
  321. debug_log("clear_label", $item.':'. "最后一个信号,方向相反,得出结果,清除缓存数据");
  322. $dispose->network_push($station,$item,$a[$count-1]['time'],$status['dirt']==1?1:2);
  323. }else{
  324. //最后三条数据的信号强的方向和初始方向不相反,并且在连续的时间内没有生成考勤,则开始第二次判断
  325. if(empty($in_and_out)){
  326. //判断第二次能否生成考勤结果
  327. $res=$dispose->second_create_direction($station,$item);
  328. if(!empty($res)){
  329. //获取该标签的之前最新的考勤,和当前形成考勤时间间隔是否大于10,
  330. //如果大于10则生成考勤结果
  331. $res_time= $dispose->get_time_results($station,$item);
  332. $res_time= empty($res_time)?0:$res_time;
  333. $diff_time=$res['time']-$res_time;
  334. debug_log("clear_label", $item.':'. "间隔时间".$diff_time);
  335. //判断如果结果超过时间
  336. if($diff_time>10){
  337. debug_log("clear_label", $item.':'. "二次生成进出");
  338. $dispose->network_push($station,$item,$res['time'],$res['dirt']);
  339. }
  340. }else{
  341. //二次判断如果也没生成考勤,如果朝前的信号最大强度低于65,
  342. //朝后的信号最大强度也低于65,则记录下来最后的朝向,
  343. //存入没有生成考勤时的初始数据
  344. //获取朝前的最大值
  345. //获取朝后的最大值
  346. $frontMax= $dispose->get_label_history(4,$station,$item);
  347. $backMax= $dispose->get_label_history(5,$station,$item);
  348. $records=false;
  349. if($status['dirt']==1){
  350. $records=$frontMax<65;
  351. }
  352. if($status['dirt']==2){
  353. $records=$backMax<65;
  354. }
  355. if($records){
  356. $dispose->no_check_data($station,$item,$status['dirt'],$a[$count-1]['time'],1);
  357. }
  358. }
  359. }
  360. //二次进出
  361. debug_log("clear_label", $item.':'. "最后一个信号,方向没有变化,清除缓存数据");
  362. }
  363. }
  364. //清除对应的键值对
  365. //清空头部尾部历史
  366. $dispose->get_label_history(3,$station,$item);
  367. $redis->hdel($key,$item);
  368. $redis->hdel($catchkey,$item);
  369. }
  370. }
  371. }
  372. }
  373. }
  374. /**
  375. * 远程推送数据
  376. *
  377. * @return void
  378. */
  379. public function remotePush(){
  380. while(true){
  381. $redis=Cache::store('redis')->handler();
  382. $key="push_data";
  383. $url="http://localhost:8115/api/accessReport";
  384. sleep(2);
  385. while($data=$redis->lPop($key)){
  386. if(!empty($data)){
  387. debug_log($key,"远程推送的数据".$data);
  388. $url_res= curl_http_post($data,$url,false);
  389. $num=1;
  390. while($url_res==false){
  391. $num++;
  392. $url_res= curl_http_post($data,$url,false);
  393. if($num>=3){
  394. debug_log($key,"远程推送的地址".$url);
  395. debug_log($key,"连续推送三次失败,远程推送的数据".$data);
  396. break;
  397. }
  398. }
  399. debug_log($key,"远程返回结果".$url_res);
  400. }
  401. }
  402. }
  403. }
  404. public function redis_to_mysql_parea(){
  405. $ues_redis=Cache::store('redis')->handler();
  406. $text="";
  407. $dispose = new dispose($ues_redis);
  408. while(1){
  409. $jsonData= $ues_redis->rpop("mqtt_data_parea4rssi");
  410. debug_log("pare_InAndOUT",'数据redis'.$jsonData);
  411. if(empty($jsonData)){
  412. debug_log("pare_InAndOUT",'没有数据');
  413. sleep(1);
  414. continue;
  415. }
  416. // debug_log("InAndOUT",$jsonData);
  417. $data=json_decode($jsonData,true);
  418. // debug_log("InAndOUT",$data['cnt']);
  419. $time=$data['time'];
  420. $mac=$data['devId'];
  421. $text=$text.$data['cnt'];
  422. if(strlen($text)<24){
  423. continue;
  424. }
  425. $text = $this->handleMessage($text, $mac, $time, $ues_redis);
  426. }
  427. }
  428. public function redis_to_mysql_indoor(){
  429. $ues_redis=Cache::store('redis')->handler();
  430. $text="";
  431. $dispose = new dispose($ues_redis);
  432. while(1){
  433. $jsonData= $ues_redis->lpop("mqtt_data_indoor4rssi");
  434. debug_log("indoor_InAndOUT",'mqtt数据redis'.$jsonData);
  435. if(!$jsonData){
  436. debug_log("indoor_InAndOUT",'mqtt没有数据');
  437. sleep(1);
  438. continue;
  439. }
  440. // debug_log("InAndOUT",$jsonData);
  441. $data=json_decode($jsonData,true);
  442. // debug_log("InAndOUT",$data['cnt']);
  443. $time=$data['time'];
  444. $mac=$data['devId'];
  445. $text=$text.$data['cnt'];
  446. if(strlen($text)<24){
  447. continue;
  448. }
  449. // var_dump("before",microtime());
  450. $text = $this->handleMessageIndoor($text, $mac, $time, $ues_redis);
  451. // var_dump("after",microtime());
  452. }
  453. }
  454. //打印日志
  455. public function temporary_label_log(){
  456. $redis=Cache::store('redis')->handler();
  457. // $key="temporary_label";
  458. // $list= $redis->HgetAll($key);
  459. // debug_log($key,json_encode($list));
  460. // debug_log($key,"所有的标签");
  461. // foreach($list as $k=>$value){
  462. // debug_log($key,json_encode([$k=>$value]));
  463. // }
  464. // debug_log($key,"所有总数".count($list));
  465. // debug_log($key,"上报的标签");
  466. // $i=0;
  467. // foreach($list as $k=>$value){
  468. // if($value==2){
  469. // debug_log($key,json_encode([$k=>$value]));
  470. // $i++;
  471. // }
  472. // }
  473. // debug_log($key,"正常上报的标签总数".$i);
  474. // debug_log($key,"补出的标签");
  475. // $t=0;
  476. // foreach($list as $k=>$value){
  477. // if($value==3){
  478. // $t++;
  479. // debug_log($key,json_encode([$k=>$value]));
  480. // }
  481. // }
  482. // debug_log($key,"补出的标签总数".$t);
  483. // debug_log($key,"没有上报的的标签");
  484. // $f=0;
  485. // foreach($list as $k=>$value){
  486. // if($value==1){
  487. // debug_log($key,json_encode([$k=>$value]));
  488. // $f++;
  489. // }
  490. // }
  491. // debug_log($key,"没有上报的的标签总数".$f);
  492. // // $redis->del($key);
  493. $dis= new dispose($redis);
  494. $dis->analysisLog();
  495. }
  496. // public function temporary_label($redis,$label,$type){
  497. // $key="temporary_label";
  498. // if($type==1){
  499. // $res= $redis->hGet($key,$label);
  500. // if($res==false){
  501. // $redis->hSet($key,$label,1);
  502. // }
  503. // }else{
  504. // $redis->hSet($key,$label,3);
  505. // }
  506. // }
  507. //消息处理--重点区域
  508. public function handleMessage($text, $mac, $time, $ues_redis){
  509. while(strlen($text)>=24){
  510. $da=substr($text,0,24);
  511. $t1 = substr($da,8,2)=='00'||substr($da,8,2)=='10'||substr($da,8,2)=='01' ? true:false;
  512. $t2 =substr($da,10,6)=="FFFFFF"||substr($da,10,6)=="000000" ?true:false;
  513. if($t1&&$t2){
  514. // var_dump($text);
  515. $rfid= substr($da,0,8);
  516. $rssi1= hexdec(substr($da,16,2));
  517. $rssi2= hexdec(substr($da,18,2));
  518. $rssi3= hexdec(substr($da,20,2));
  519. $rssi4= hexdec(substr($da,22,2));
  520. // $rc1 = ($rssi1 == 255 ? 0 : 1);
  521. // $rc2 = ($rssi2 == 255 ? 0 : 1);
  522. // $rc3 = ($rssi3 == 255 ? 0 : 1);
  523. // $rc4 = ($rssi4 == 255 ? 0 : 1);
  524. $DA=[
  525. 'mac' => $mac,
  526. 'label' =>$rfid,
  527. 'rssi1' => $rssi1,
  528. 'rssi2' => $rssi2,
  529. 'rssi3' => $rssi3,
  530. 'rssi4' => $rssi4,
  531. 'report_time'=>$time
  532. ];
  533. $field = $mac."_".$rfid;
  534. $info = $ues_redis->hget("parea_rfidinfos",$field);
  535. debug_log("pare_InAndOUT","数据:".json_encode($DA,true));
  536. if($rssi1 ==255 && $rssi2 == 255 && $rssi3 == 255 && $rssi4 == 255){
  537. debug_log("pare_InAndOUT","无效数据:".json_encode($DA,true));
  538. }else{
  539. if(!$info){
  540. $info = [
  541. "mac" => $mac,
  542. "id" => $rfid,
  543. "firs_time" => $time,
  544. "time" => $time,
  545. "status" => 2,//2出状态,1进状态
  546. "rssi" => [
  547. [
  548. "front" => $rssi1,
  549. "behind" => $rssi2,
  550. "left" => $rssi3,
  551. "right" => $rssi4,
  552. "time" => $time
  553. ]
  554. ]
  555. ];
  556. $ues_redis->hset("parea_rfidinfos",$field, json_encode($info,true));
  557. debug_log("parea_rfidinfos_redis_set_record","redis更新记录".json_encode($info,true));
  558. }else{
  559. $info = json_decode($info,true);
  560. $config = $ues_redis->hget("anbang_four_wire", $info["mac"]);
  561. if (!$config) {
  562. # code...
  563. $config = [
  564. "front_in" => 80,
  565. "behind_in" => 80,
  566. "left_in" => 80,
  567. "right_in" => 80,
  568. "front_out" => 255,
  569. "behind_out" => 255,
  570. "left_out" => 255,
  571. "right_out" => 255,
  572. "expInt" => 12,
  573. "effSigNum" => 6
  574. ];
  575. }else{
  576. $config = json_decode($config,true);
  577. }
  578. // var_dump("+++++++++++++++++",$config);
  579. $info["time"] = $time;
  580. $newRssi = [
  581. "front" => $rssi1,
  582. "behind" => $rssi2,
  583. "left" => $rssi3,
  584. "right" => $rssi4,
  585. "time" => $time
  586. ];
  587. $rssisArr = $info["rssi"];
  588. // var_dump("+++++++++++++++++", $time, $newRssi["time"]);
  589. foreach ($rssisArr as $k => $v) {
  590. # code...
  591. if( ($time - $v["time"] ) > $config['expInt'] ){
  592. unset($rssisArr[$k]);
  593. }
  594. }
  595. // var_dump("+++++++++++++++++",$rssisArr);
  596. if(count($rssisArr) == $config['effSigNum']){
  597. array_shift($rssisArr);
  598. array_push($rssisArr, $newRssi);
  599. }else{
  600. array_push($rssisArr, $newRssi);
  601. }
  602. $rssisArr =array_values($rssisArr);
  603. // var_dump("+++++++++++++++++",$rssisArr);
  604. $info["rssi"] = $rssisArr;
  605. // var_dump("------------",$info["rssi"]);
  606. $cacCount = count($rssisArr);
  607. // if($cacCount > $EFF_SIG_NUM){
  608. $sum1 = 0;
  609. $sum2 = 0;
  610. $sum3 = 0;
  611. $sum4 = 0;
  612. foreach ($rssisArr as $k => $v) {
  613. # code...
  614. $sum1 += ($v["front"] == 255 ? 90 : $v["front"]);
  615. $sum2 += ($v["behind"] == 255 ? 90 : $v["behind"]);
  616. $sum3 += ($v["left"] == 255 ? 90 : $v["left"]);
  617. $sum4 += ($v["right"] == 255 ? 90 : $v["right"]);
  618. }
  619. $info["avg"] = [
  620. "front" => number_format( $sum1/$cacCount, 2 ),
  621. "behind" => number_format( $sum2/$cacCount, 2 ),
  622. "left" => number_format( $sum3/$cacCount, 2 ),
  623. "right" => number_format( $sum4/$cacCount, 2 ),
  624. ];
  625. // var_dump($cacCount, $EFF_SIG_NUM, "dddddddd");
  626. if ($cacCount == $config['effSigNum']) {
  627. # code...
  628. $info = $this->compAndPush($info ,$config, $ues_redis);
  629. }
  630. $ues_redis->hset("parea_rfidinfos",$field, json_encode($info,true));
  631. debug_log("parea_rfidinfos_redis_set_record","redis更新记录".json_encode($info,true));
  632. }
  633. }
  634. $text=substr($text,24);
  635. }else{
  636. $text=substr($text,1);
  637. }
  638. }
  639. return $text ?$text : "";
  640. }
  641. //消息处理--室内
  642. public function handleMessageIndoor($text, $mac, $time, $ues_redis){
  643. while(strlen($text)>=24){
  644. $da=substr($text,0,24);
  645. $t1 = substr($da,8,2)=='00'||substr($da,8,2)=='10'||substr($da,8,2)=='01' ? true:false;
  646. $t2 =substr($da,10,6)=="FFFFFF"||substr($da,10,6)=="000000" ?true:false;
  647. if($t1&&$t2){
  648. // var_dump($text);
  649. $rfid= substr($da,0,8);
  650. $rssi1= hexdec(substr($da,16,2));
  651. $rssi2= hexdec(substr($da,18,2));
  652. $rssi3= hexdec(substr($da,20,2));
  653. $rssi4= hexdec(substr($da,22,2));
  654. $DA=[
  655. 'mac' => $mac,
  656. 'label' =>$rfid,
  657. 'rssi1' => $rssi1,
  658. 'rssi2' => $rssi2,
  659. 'rssi3' => $rssi3,
  660. 'rssi4' => $rssi4,
  661. 'report_time'=>$time
  662. ];
  663. $field = $mac."_".$rfid;
  664. $info = $ues_redis->hget("indoor_rfidinfos",$field);
  665. debug_log("indoor_InAndOUT","数据:".json_encode($DA,true));
  666. if($rssi1 ==255 && $rssi2 == 255 && $rssi3 == 255 && $rssi4 == 255){
  667. debug_log("indoor_InAndOUT","无效数据:".json_encode($DA,true));
  668. }else{
  669. if(!$info){
  670. $info = [
  671. "mac" => $mac,
  672. "id" => $rfid,
  673. "first_time" => $time,
  674. "time" => $time,
  675. "status" => 2,//2出状态,1进状态
  676. "rssi" => [
  677. [
  678. "front" => $rssi1,
  679. "behind" => $rssi2,
  680. "left" => $rssi3,
  681. "right" => $rssi4,
  682. "time" => $time
  683. ]
  684. ]
  685. ];
  686. $ues_redis->hset("indoor_rfidinfos",$field, json_encode($info,true));
  687. debug_log("indoor_rfidinfos_redis_set_record","redis更新记录".json_encode($info,true));
  688. }else{
  689. $info = json_decode($info,true);
  690. $config = $ues_redis->hget("anbang_four_wire", $info["mac"]);
  691. if (!$config) {
  692. # code...
  693. $config = [
  694. "front_in" => 80,
  695. "behind_in" => 80,
  696. "left_in" => 80,
  697. "right_in" => 80,
  698. "front_out" => 255,
  699. "behind_out" => 255,
  700. "left_out" => 255,
  701. "right_out" => 255,
  702. "expInt" => 12,
  703. "effSigNum" => 6
  704. ];
  705. }else{
  706. $config = json_decode($config,true);
  707. }
  708. // var_dump("+++++++++++++++++",$config);
  709. $info["time"] = $time;
  710. $newRssi = [
  711. "front" => $rssi1,
  712. "behind" => $rssi2,
  713. "left" => $rssi3,
  714. "right" => $rssi4,
  715. "time" => $time
  716. ];
  717. $rssisArr = $info["rssi"];
  718. // var_dump("+++++++++++++++++", $time, $newRssi["time"]);
  719. foreach ($rssisArr as $k => $v) {
  720. # code...
  721. if( ($time - $v["time"] ) > $config['expInt'] ){
  722. unset($rssisArr[$k]);
  723. }
  724. }
  725. // var_dump("+++++++++++++++++",$rssisArr);
  726. if(count($rssisArr) == $config['effSigNum']){
  727. array_shift($rssisArr);
  728. array_push($rssisArr, $newRssi);
  729. }else{
  730. array_push($rssisArr, $newRssi);
  731. }
  732. $rssisArr =array_values($rssisArr);
  733. // var_dump("+++++++++++++++++",$rssisArr);
  734. $info["rssi"] = $rssisArr;
  735. // var_dump("------------",$info["rssi"]);
  736. $cacCount = count($rssisArr);
  737. // if($cacCount > $EFF_SIG_NUM){
  738. $sum1 = 0;
  739. $sum2 = 0;
  740. $sum3 = 0;
  741. $sum4 = 0;
  742. foreach ($rssisArr as $k => $v) {
  743. # code...
  744. $sum1 += ($v["front"] == 255 ? 90 : $v["front"]);
  745. $sum2 += ($v["behind"] == 255 ? 90 : $v["behind"]);
  746. $sum3 += ($v["left"] == 255 ? 90 : $v["left"]);
  747. $sum4 += ($v["right"] == 255 ? 90 : $v["right"]);
  748. }
  749. $info["avg"] = [
  750. "front" => number_format( $sum1/$cacCount, 2 ),
  751. "behind" => number_format( $sum2/$cacCount, 2 ),
  752. "left" => number_format( $sum3/$cacCount, 2 ),
  753. "right" => number_format( $sum4/$cacCount, 2 ),
  754. ];
  755. // var_dump($cacCount, $EFF_SIG_NUM, "dddddddd");
  756. if ($cacCount == $config['effSigNum']) {
  757. # code...
  758. $info = $this->compAndPushIndoor($info ,$config, $ues_redis);
  759. }
  760. $ues_redis->hset("indoor_rfidinfos",$field, json_encode($info,true));
  761. debug_log("indoor_rfidinfos_redis_set_record","redis更新记录".json_encode($info,true));
  762. }
  763. }
  764. $text=substr($text,24);
  765. }else{
  766. $text=substr($text,1);
  767. }
  768. }
  769. return $text ?$text : "";
  770. }
  771. //判断进出和推送--室内考勤
  772. public function compAndPushIndoor($info, $config, $ues_redis){
  773. //标签多,数据多时候,判断完成后放入redis,异步推送,当前暂时直接推
  774. // $config = $ues_redis->hget("anbang_four_wire", $info["mac"]);
  775. //{"front_in":44,"front_out":44,"behind_in":50,"behind_out":50,"left_in":55,"left_out":55,"right_out":44,"right_out":44}
  776. $avg = $info['avg'];
  777. $status = $info['status'];
  778. $flagIn = $avg["front"] < $config["front_in"] || $avg["behind"] < $config["behind_in"] || $avg["left"] < $config["left_in"] || $avg["right"] < $config["right_in"];
  779. $flagOut = $avg["front"] > $config["front_out"] && $avg["behind"] > $config["behind_out"] && $avg["left"] > $config["left_out"] && $avg["right"] > $config["right_out"];
  780. $url="http://localhost:8115/api/api/accessClassReport";
  781. // $url="http://61.175.203.188:10001/api/accessClassReport";
  782. // if($flagIn && $status == 2){
  783. if($flagIn){
  784. if ($info["pushTime"] && (time()-$info['pushTime']) < 120 ) {
  785. # code...
  786. return $info;
  787. }
  788. //推送进
  789. $info['status'] = 1;
  790. $url_data = [
  791. "mac" => $info["mac"],
  792. "data" => [
  793. [
  794. "label" => $info["id"],
  795. "time" => $info["time"],
  796. "dirt" => 1,
  797. "rssi" => $info["rssi"],//数组 [{"front":72,"behind":255,"left":255,"right":255,"time":1685067709},{"front":76,"behind":255,"left":255,"right":255,"time":1685067710}]
  798. "avg" => $info["avg"] //{"front":"77.17","behind":"90.00","left":"90.00","right":"90.00"}
  799. ]
  800. ]
  801. ];
  802. $ues_redis->lpush("indoor_inoutres_push", json_encode($url_data));
  803. $info['pushTime'] = time();
  804. // debug_log("push_indoor_res","进推送依赖:".json_encode($info));
  805. // $url_res= curl_http_post(json_encode($url_data),$url,false);
  806. // debug_log("push_indoor_res","远程返回结果".$url_res);
  807. }
  808. // if($info['id'] == "E2B15AD5"){
  809. // var_dump($flagIn, $flagOut, $status, $avg["front"],$avg["behind"],$avg["left"], $avg["right"]);
  810. // }
  811. if($flagOut && $status == 1){
  812. if ($info["pushTime"] && (time()-$info['pushTime']) < 5 ) {
  813. # code...
  814. return $info;
  815. }
  816. //推送出
  817. $info['status'] = 2;
  818. $url_data = [
  819. "mac" => $info["mac"],
  820. "data" => [
  821. [
  822. "label" => $info["id"],
  823. "time" => $info["time"],
  824. "dirt" => 2,
  825. "rssi" => $info["rssi"],//数组 [{"front":72,"behind":255,"left":255,"right":255,"time":1685067709},{"front":76,"behind":255,"left":255,"right":255,"time":1685067710}]
  826. "avg" => $info["avg"] //{"front":"77.17","behind":"90.00","left":"90.00","right":"90.00"}
  827. ]
  828. ]
  829. ];
  830. $ues_redis->lpush("indoor_inoutres_push", json_encode($url_data));
  831. // debug_log("push_indoor_res","出推送依赖:".json_encode($info));
  832. // $url_res= curl_http_post(json_encode($url_data),$url,false);
  833. $info['pushTime'] = time();
  834. // debug_log("push_indoor_res","远程返回结果".$url_res);
  835. }
  836. return $info;
  837. }
  838. //判断进出和推送
  839. public function compAndPush($info, $config,$ues_redis){
  840. //标签多,数据多时候,判断完成后放入redis,异步推送,当前暂时直接推
  841. $avg = $info['avg'];
  842. $status = $info['status'];
  843. $flagIn = $avg["front"] < $config["front_in"] || $avg["behind"] < $config["behind_in"] || $avg["left"] < $config["left_in"] || $avg["right"] < $config["right_in"];
  844. $flagOut = $avg["front"] > $config["front_out"] && $avg["behind"] > $config["behind_out"] && $avg["left"] > $config["left_out"] && $avg["right"] > $config["right_out"];
  845. if($flagIn && $status == 2){
  846. // if($flagIn){
  847. $inoutIntFilter = $ues_redis->hget("anbang_four_wire", "anbang_4rssi_intFilter");
  848. $inoutIntFilter = $inoutIntFilter ? $inoutIntFilter : 20;
  849. if ($info["pushTime"] && (time()-$info['pushTime']) < $inoutIntFilter ) {
  850. # code...
  851. return $info;
  852. }
  853. //推送进
  854. $info['status'] = 1;
  855. $url_data = [
  856. "mac" => $info["mac"],
  857. "data" => [
  858. [
  859. "label" => $info["id"],
  860. "time" => $info["time"],
  861. "first_time" => $info["first_time"],
  862. "dirt" => 1,
  863. "rssi" => $info["rssi"],//数组 [{"front":72,"behind":255,"left":255,"right":255,"time":1685067709},{"front":76,"behind":255,"left":255,"right":255,"time":1685067710}]
  864. "avg" => $info["avg"] //{"front":"77.17","behind":"90.00","left":"90.00","right":"90.00"}
  865. ]
  866. ]
  867. ];
  868. // debug_log("pushPareaRes","进推送依赖:".json_encode($info));
  869. // $url_res= curl_http_post(json_encode($url_data),$url,false);
  870. $ues_redis->lpush("parea_inoutres_push", json_encode($url_data));
  871. $info['pushTime'] = time();
  872. // debug_log("pushPareaRes","远程返回结果".$url_res);
  873. }
  874. // if($info['id'] == "E2B15AD5"){
  875. // var_dump($flagIn, $flagOut, $status, $avg["front"],$avg["behind"],$avg["left"], $avg["right"]);
  876. // }
  877. if($flagOut && $status == 1){
  878. if ($info["pushTime"] && (time()-$info['pushTime']) < 5 ) {
  879. # code...
  880. return $info;
  881. }
  882. //推送出
  883. $info['status'] = 2;
  884. $url_data = [
  885. "mac" => $info["mac"],
  886. "data" => [
  887. [
  888. "label" => $info["id"],
  889. "time" => $info["time"],
  890. "dirt" => 2,
  891. "rssi" => $info["rssi"],//数组 [{"front":72,"behind":255,"left":255,"right":255,"time":1685067709},{"front":76,"behind":255,"left":255,"right":255,"time":1685067710}]
  892. "avg" => $info["avg"] //{"front":"77.17","behind":"90.00","left":"90.00","right":"90.00"}
  893. ]
  894. ]
  895. ];
  896. // debug_log("pushPareaRes","出推送依赖:".json_encode($info));
  897. // $url_res= curl_http_post(json_encode($url_data),$url,false);
  898. $ues_redis->lpush("parea_inoutres_push", json_encode($url_data));
  899. $info['pushTime'] = time();
  900. // debug_log("pushPareaRes","远程返回结果".$url_res);
  901. }
  902. if($flagIn && $info['status'] == 1){
  903. $inoutIntFilter = $ues_redis->hget("anbang_four_wire", "anbang_4rssi_intFilter");
  904. $inoutIntFilter = $inoutIntFilter ? $inoutIntFilter : 20;
  905. if ($info["camPushTime"] && (time()-$info['camPushTime']) < $inoutIntFilter ) {
  906. # code...
  907. return $info;
  908. }
  909. //推送进
  910. $url_data = [
  911. "mac" => $info["mac"],
  912. "first_time" => $info["first_time"],
  913. "data" => [
  914. [
  915. "label" => $info["id"],
  916. "time" => $info["time"],
  917. "dirt" => 1,
  918. "rssi" => $info["rssi"],//数组 [{"front":72,"behind":255,"left":255,"right":255,"time":1685067709},{"front":76,"behind":255,"left":255,"right":255,"time":1685067710}]
  919. "avg" => $info["avg"] //{"front":"77.17","behind":"90.00","left":"90.00","right":"90.00"}
  920. ]
  921. ]
  922. ];
  923. $ues_redis->lpush("parea_inoutres_push", json_encode($url_data));
  924. $info["camPushTime"] = time();
  925. }
  926. return $info;
  927. }
  928. public function test(){
  929. try{
  930. $ues_redis=Cache::store('redis')->handler();
  931. $jsonData= $ues_redis->rpop("mqtt_data");
  932. debug_log("InAndOUT","1212");
  933. }catch(Exception $e){
  934. var_dump($e->getMessage());
  935. }
  936. }
  937. /**
  938. * 删除前1天的数据
  939. *
  940. * @return void
  941. */
  942. public function deleteHistory()
  943. {
  944. while(true)
  945. {
  946. $where[] = ['addTime','<',strtotime("-1 day")];
  947. Db::name('tag_history')->where($where)->delete();
  948. sleep(60*60*24);
  949. }
  950. }
  951. /**
  952. * 检测小程序版本版本 function
  953. *
  954. * @return void
  955. */
  956. public function detectionVersion(){
  957. $token = $_GET['token'];
  958. if (!$token || $token != '444333d3') {
  959. json_fail('缺少token或者token不对');
  960. }
  961. $data["url"]="http://116.62.220.88:8112/static/app/蓝牙小程序/1.1.1/rl-release.apk";
  962. $data["version"]="1.1.1";
  963. json_success("查询版本成功",$data);
  964. }
  965. }