Api.php 47 KB

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