RcgjfwIndexAction.class.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. <?php
  2. class RcgjfwIndexAction extends Action {
  3. public function index( ){
  4. if (!C('rcgjfw.人车标签_允许的最大时间差')){
  5. echo '常量【人车标签_允许的最大时间差】未定义'.PHP_EOL;
  6. return;
  7. }
  8. if (!C('rcgjfw.被盗告警_间隔时间')){
  9. echo '常量【被盗告警_间隔时间】未定义'.PHP_EOL;
  10. return;
  11. }
  12. if (!C('rcgjfw.车辆标签_rssi阀值')){
  13. echo '常量【车辆标签_rssi阀值】未定义'.PHP_EOL;
  14. return;
  15. }
  16. if (!C('rcgjfw.车主标签_rssi阀值')){
  17. echo '常量【车辆标签_rssi阀值】未定义'.PHP_EOL;
  18. return;
  19. }
  20. Vendor('Workerman352.Autoloader');
  21. $tcp_worker = new Workerman\Worker("tcp://0.0.0.0:20160");
  22. $tcp_worker->count = 1;
  23. $tcp_worker->onWorkerStart = function($worker){
  24. };
  25. $tcp_worker->onConnect = function($connection){
  26. $this->onConnect($connection);
  27. };
  28. $tcp_worker->onMessage = function($connection,$data){
  29. $this->onMessage($connection,$data);
  30. };
  31. $tcp_worker->onClose = function($connection){
  32. $this->onClose($connection);
  33. };
  34. //实例化信号处理类
  35. $this->rfid_proto = new Rlgs\Proto\RfidStation2();
  36. $this->rchy_alarm_list = Redis("rchy_alarm_list","queue");
  37. $this->redis_vsignal = Redis("rchy_vsignal_{no}","zset")->prefix('rchy_vsignal_');
  38. //$this->cache = \Rchy\Cache\RedisCache::getInstance();
  39. Workerman\Worker::runAll();//保持运行
  40. }
  41. private function onMessage( $connection, $data ){
  42. $connection->m_packet .= $data;
  43. }
  44. private function onConnect( $connection ){
  45. echo PHP_EOL . $connection->id . ' connected'. PHP_EOL;
  46. }
  47. private function onClose( $connection ){
  48. //记录数据包文本
  49. $packet_text = $this->rfid_proto->tcp_hex2str($connection->m_packet,true) ;
  50. //$this->rfid_proto->tcp_log($connection->id . ' closed ' . $packet_text);
  51. //echo 'packet_text => '.$packet_text.PHP_EOL;
  52. //解析消息体
  53. $packet = $this->rfid_proto->tcp_str2bin($packet_text);
  54. $result = $this->rfid_proto->tcp_unpack_msg($packet);
  55. if(! $result['Success'] ){
  56. echo 'unpack packet failed'.PHP_EOL;
  57. $this->rfid_proto->decode_error_log('unpack_fail','unpack packet failed ,result : '.json_encode($result));
  58. return;
  59. }
  60. //echo 'decode_data => '.json_encode($result).PHP_EOL;
  61. //记录基站数据包
  62. //$this->rfid_proto->decode_packet_log($result['StationCode'],$result['StationCode'].' => '.$packet_text);
  63. if (!$result['StationCode']){
  64. echo 'StationCode is empty!'.PHP_EOL;
  65. $this->rfid_proto->decode_error_log('unpack_fail','StationCode is empty! ');
  66. return false;
  67. }
  68. if (!$result['VehicleList']){
  69. echo 'VehicleList is empty!'.PHP_EOL;
  70. return ;
  71. }
  72. //检查是否有效基站
  73. $station_info = \Rchy\Cache\RedisCache::getStationInfo($result['StationCode']);
  74. if(!$station_info){
  75. $this->rfid_proto->decode_error_log('unpack_fail','getStationInfo failed ,StationCode : '.$result['StationCode']);
  76. return false;
  77. }
  78. //更新车主标签时间
  79. echo '======= updateRfidTime start ======='.$connection->id.PHP_EOL;
  80. $this->updateRfidTime($result);
  81. echo '======= updateRfidTime over ======='.$connection->id.PHP_EOL;
  82. //添加报警
  83. echo '======= addAlarm start ======='.$connection->id.PHP_EOL;
  84. $this->addAlarm($result);
  85. echo '======= addAlarm over ======='.$connection->id.PHP_EOL;
  86. /*
  87. //轨迹包redis主库
  88. $redis_raw_packet = Redis("fdqu_raw_packet","queue");
  89. $redis_raw_packet->push($packet_text);
  90. //数据解包
  91. $result = $this->unpackMsg($packet_text);
  92. //生成车辆轨迹日志
  93. $this->addTcpLog($result);
  94. */
  95. }
  96. private function addTcpLog( $result ){
  97. //一个基站一个日志文件
  98. $this->rfid_proto->station_route_log('tcp',$result);
  99. //一个车辆一个日志文件
  100. $this->rfid_proto->vehicle_route_log('tcp',$result);
  101. }
  102. private function unpackMsg( $packet_text ){
  103. $packet = $this->rfid_proto->tcp_str2bin($packet_text);
  104. if(!$packet){
  105. echo 'parse packet failed.'.PHP_EOL;
  106. $this->rfid_proto->tcp_error_log('parse_fail','parse packet failed ,packet_text : '.$packet_text);
  107. return false;
  108. }
  109. $result = $this->rfid_proto->tcp_unpack_msg($packet);
  110. if(! $result['Success'] ){
  111. echo 'unpack fail: ' . $result['Message'].PHP_EOL;
  112. $this->rfid_proto->tcp_error_log('unpack_fail',$result);
  113. return false;
  114. }
  115. return $result;
  116. }
  117. private function addAlarm( $result ){
  118. //获取当前所有车主rfid的rssi数据
  119. $chezhu_rfids = array();
  120. foreach ($result['VehicleList'] as $key => $row){
  121. $chezhu_info = \Rchy\Cache\RedisCache::getCheZhuInfo($row['VehicleNumber']);
  122. if(!$chezhu_info){
  123. continue;
  124. }
  125. $chezhu_rfids[$row['VehicleNumber']]['Rssi'] = $row['rssi'];
  126. $chezhu_rfids[$row['VehicleNumber']]['SignalCount'] = $row['SignalCount'];
  127. }
  128. //var_dump($chezhu_rfids);
  129. //var_dump($result['VehicleList']);
  130. foreach ($result['VehicleList'] as $key => $row){
  131. $row['StationCode'] = $result['StationCode'];
  132. if (!$row['VehicleNumber']){
  133. echo 'VehicleNumber empty!'.PHP_EOL;
  134. continue;
  135. }
  136. //获取车辆信息
  137. $vehicle_info = \Rchy\Cache\RedisCache::getVehicleInfo($row['VehicleNumber']);
  138. //车辆不存在跳过
  139. if (!$vehicle_info){
  140. //echo 'vehicle not existed, vehilce_number = '.$row['VehicleNumber'].', rssi = '.$row['rssi'].PHP_EOL;
  141. continue;
  142. }
  143. //未绑定车主rfid跳过
  144. if (!$vehicle_info['CheZhuRfid']){
  145. echo 'vehicle not kaihu, vehilce_number: '.$row['VehicleNumber'].', rssi = '.$row['rssi'].PHP_EOL;
  146. continue;
  147. }
  148. echo 'VehicleNumber: '.$row['VehicleNumber'].',rssi = '.$row['rssi'].PHP_EOL;
  149. //车辆标签
  150. $vehicle_no = strtolower($row['VehicleNumber']);
  151. //末次信号(改用本地缓存了)
  152. //$last_signal_info = $this->redis_vsignal->table($vehicle_no)->max();
  153. //获取最近一段时间内所有rssi,求均值
  154. $avgRssi = $this->getAvgRssi($row);
  155. if($avgRssi === false){
  156. echo 'getAvgRssi failed! VehicleNumber = '.$row['VehicleNumber'].PHP_EOL;
  157. continue;
  158. }
  159. //车辆rssi信号弱的,过滤掉,防止收到车信号的时候,没有收到车主信号,从而误报
  160. if ($avgRssi > C('rcgjfw.车辆标签_rssi阀值')){
  161. echo 'avgRssi > '.C('rcgjfw.车辆标签_rssi阀值').', avgRssi = '.$avgRssi.', VehicleNumber = '.$row['VehicleNumber'].PHP_EOL;
  162. continue;
  163. }
  164. //有效信号加入到 rchy_vsignal_{no} 表
  165. $signal = array(
  166. 'StationCode' => $row['StationCode'],
  167. 'Rssi' => $row['rssi'],
  168. 'Timestamp' => $row['Timestamp']
  169. );
  170. //获取最近一次的信号信息
  171. $last_signal_info = S('last_signal_info'.$row['VehicleNumber']);
  172. //更新最近一次的信号信息
  173. S('last_signal_info'.$row['VehicleNumber'], $signal, 24*60*60);
  174. $alarm_info = array();
  175. $alarm_info['VehicleNumber'] = $row['VehicleNumber'];
  176. $alarm_info['AlarmTime'] = time();
  177. $alarm_info['OnlineTime'] = $row['OnlineTime'];
  178. $alarm_info['VehicleRssi'] = $row['rssi'];
  179. $alarm_info['VehicleSignalCount'] = $row['SignalCount'];
  180. $alarm_info['CheZhuRssi'] = $chezhu_rfids[$vehicle_info['CheZhuRfid']]['Rssi'];//车主或者授权车主信号强度,这里还需要完善
  181. $alarm_info['CheZhuSignalCount'] = $chezhu_rfids[$vehicle_info['CheZhuRfid']]['SignalCount'];
  182. $alarm_info['StationCode'] = $row['StationCode'];
  183. //检查车辆经过时,在限定的时间内,是否有接收到任一授权标签信号
  184. $is_stolen = $this->checkVehicleStatus($vehicle_info['CheZhuRfid'], $row);
  185. $cur_time = time();
  186. //检查是否被盗报警
  187. if ( $is_stolen ){
  188. $alarm_info['AlarmType'] = \Rchy\Enum\AlarmType::STOLEN;
  189. //上次被盗告警时间
  190. $latest_stolen_alarm_time = S('latest_stolen_alarm_time_'.$row['VehicleNumber']);
  191. //避免频繁告警检测
  192. if ($latest_stolen_alarm_time && $cur_time - $latest_stolen_alarm_time <= C('rcgjfw.被盗告警_间隔时间')){
  193. echo '车辆'.$row['VehicleNumber'].'刚被盗告警过,跳过告警! latest_stolen_alarm_time = '.$latest_stolen_alarm_time.', cur_time = '.$cur_time.PHP_EOL;
  194. return ;
  195. }
  196. //被盗告警时,清空过车告警次数
  197. S('pass_alarm_count_'.$row['VehicleNumber'], 0, 24*60*60);
  198. echo 'VehicleNumber:'.$row['VehicleNumber'].', 告警类型: 被盗告警'.PHP_EOL;
  199. //更新本次被盗告警时间
  200. S('latest_stolen_alarm_time_'.$row['VehicleNumber'], $cur_time);
  201. }else{
  202. //获取过车告警次数
  203. $pass_alarm_count = S('pass_alarm_count_'.$row['VehicleNumber']);
  204. if(!$pass_alarm_count){
  205. $pass_alarm_count = 0;
  206. }
  207. /*
  208. //上次告警时间
  209. $latest_pass_alarm_time = S('latest_pass_alarm_time_'.$row['VehicleNumber']);
  210. //避免频繁告警检测
  211. if ($latest_pass_alarm_time && $cur_time - $latest_pass_alarm_time <= C('rcgjfw.被盗告警_间隔时间')){
  212. echo '车辆'.$row['VehicleNumber'].'刚过车告警过,跳过! 已过车告警'.$pass_alarm_count.'次, latest_pass_alarm_time = '.$latest_pass_alarm_time.', cur_time = '.$cur_time.PHP_EOL;
  213. return ;
  214. }
  215. */
  216. $alarm_info['AlarmType'] = \Rchy\Enum\AlarmType::PASS;
  217. $old_pass_alarm_count = $pass_alarm_count;
  218. $pass_alarm_count++;
  219. //告警超过3次,且当前告警时间和上次告警时间差不超过半分钟,不告警
  220. if($pass_alarm_count>300000 &&($last_signal_info['Timestamp'] && abs($row['Timestamp']-$last_signal_info['Timestamp']) < 30) ){
  221. echo '车辆:'.$row['VehicleNumber'].'已连续过车告警'.$old_pass_alarm_count.'次,不再告警!'.PHP_EOL;
  222. return ;
  223. }
  224. //告警超过3次,且当前告警时间和上次告警时间差超过半分钟,认为是车辆离开后又回来,清空上次告警次数
  225. if($pass_alarm_count>300000 &&($last_signal_info['Timestamp'] && abs($row['Timestamp']-$last_signal_info['Timestamp']) >= 30) ){
  226. echo '车辆:'.$row['VehicleNumber'].'离开后又回来,清空告警次数'.PHP_EOL;
  227. $pass_alarm_count = 1;
  228. }
  229. echo 'pass_alarm_count = '.$pass_alarm_count.', last_chezhu_signal_time = '.$last_signal_info['Timestamp'].', now = '.$row['Timestamp']. PHP_EOL;
  230. //更新过车告警次数
  231. S('pass_alarm_count_'.$row['VehicleNumber'], $pass_alarm_count, 24*60*60);
  232. echo '车辆:'.$row['VehicleNumber'].'已连续过车告警'.$pass_alarm_count.'次'.PHP_EOL;
  233. echo 'VehicleNumber:'.$row['VehicleNumber'].', 告警类型: 过车告警'.PHP_EOL;
  234. //记录本次过车告警时间
  235. S('latest_pass_alarm_time_'.$row['VehicleNumber'], $cur_time);
  236. }
  237. $this->rchy_alarm_list->push(json_encode($alarm_info));
  238. echo '添加告警成功, VehicleNumber:'.$row['VehicleNumber'].', AlarmType: '.$alarm_info['AlarmType'].PHP_EOL;
  239. //echo 'alarm_info: '.json_encode($alarm_info).PHP_EOL;
  240. }
  241. }
  242. private function updateRfidTime( $result ){
  243. foreach($result['VehicleList'] as $key => $row){
  244. $row['StationCode'] = $result['StationCode'];
  245. if(!$row['VehicleNumber']){
  246. //echo 'VehicleNumber not existed, VehicleNumber: '.$row['VehicleNumber'].PHP_EOL;
  247. continue;
  248. }
  249. //检查车主标签是否有效,无效跳过,有效的更新上报信息
  250. $vehicle_info = \Rchy\Cache\RedisCache::getCheZhuInfo($row['VehicleNumber']);
  251. if(!$vehicle_info){
  252. continue;
  253. }
  254. echo 'CheZhuRfid = '.$row['VehicleNumber'].', rssi = '.$row['rssi'].', time:'.date('Y-m-d H:i:s',$row['Timestamp']).PHP_EOL;
  255. //如果基站时间不准确,用服务器时间
  256. if($row['Timestamp'] < time()-3600){
  257. $row['Timestamp'] = time();
  258. }
  259. //获取最近一段时间内所有rssi,求均值
  260. $avgRssi = $this->getAvgRssi($row);
  261. if($avgRssi === false){
  262. echo 'getAvgRssi failed! CheZhuRfid = '.$row['VehicleNumber'].PHP_EOL;
  263. continue;
  264. }
  265. //检查车主标签rssi,过滤掉弱信号
  266. if ($avgRssi > C('rcgjfw.车主标签_rssi阀值')){
  267. echo 'avgRssi > '.C('rcgjfw.车主标签_rssi阀值').', avgRssi = '.$avgRssi.', CheZhuRfid = '.$row['VehicleNumber'].PHP_EOL;
  268. continue;
  269. }
  270. echo 'avgRssi = '.$avgRssi.', CheZhuRfid = '.$row['VehicleNumber'].PHP_EOL;
  271. $info = array(
  272. 'Timestamp' => $row['Timestamp'],
  273. 'StationCode' => $row['StationCode'],
  274. 'Rssi' => $row['rssi']
  275. );
  276. //更新车主RFID上报信息
  277. S('last_chezhu_rfid_'.$row['VehicleNumber'], $info, 60*60*24);
  278. //echo 'last_chezhu_rfid_'.$row['VehicleNumber'] .PHP_EOL;
  279. //var_dump(S('last_chezhu_rfid_'.$row['VehicleNumber']));
  280. //echo '更新车主标签上报信息成功,CheZhuRfid: '.$row['VehicleNumber'].', 上报时间:'.date('Y-m-d H:i:s',$row['Timestamp']).', rssi: '.$row['rssi'].PHP_EOL;
  281. }
  282. }
  283. private function checkVehicleStatus( $chezhu_rfid, $row ){
  284. if(!$chezhu_rfid){
  285. echo 'checkVehicleStatus failed, chezhu_rfid is empty!'.PHP_EOL;
  286. return false;
  287. }
  288. if(!$row){
  289. echo 'checkVehicleStatus failed, row is empty!'.PHP_EOL;
  290. return false;
  291. }
  292. //获取车辆已授权车主标签
  293. $all_rfids = \Rchy\Cache\RedisCache::getVehicleAuthors($row['VehicleNumber']);
  294. if(!$all_rfids){
  295. $all_rfids = array();
  296. }
  297. //加入车主标签
  298. if(!in_array($chezhu_rfid,$all_rfids)){
  299. array_push($all_rfids,$chezhu_rfid);
  300. }
  301. $is_stolen = true;
  302. foreach ($all_rfids as $rfid){
  303. //获取授权车主标签上报信息
  304. $last_rfid_info = S('last_chezhu_rfid_'.$rfid);
  305. //var_dump($last_rfid_info);
  306. $last_rfid_time = $last_rfid_info['Timestamp'];
  307. $rfid_pass_station = $last_rfid_info['StationCode'];
  308. echo 'chezhu_rfid = '.$rfid.', now = '.$row['Timestamp'].', last_rfid_time = '.$last_rfid_time.', rfid_pass_station = '. $rfid_pass_station . PHP_EOL;
  309. //车辆和授权车主同时出现在同一个小区门口,则认为是过车告警
  310. if ( $last_rfid_time && abs($row['Timestamp']-$last_rfid_time) < C('rcgjfw.人车标签_允许的最大时间差') && $rfid_pass_station == $row['StationCode']){
  311. $is_stolen = false;
  312. break;
  313. }
  314. }
  315. echo 'all_rfids:'.PHP_EOL;
  316. var_dump($all_rfids);
  317. return $is_stolen;
  318. }
  319. private function checkVehicleDirection( $vehicle_no, $now ){
  320. //开发中。。。
  321. return false;
  322. if(!$vehicle_no){
  323. echo 'checkVehicleDirection failed, vehicle_no is empty!'.PHP_EOL;
  324. return false;
  325. }
  326. if(!$now){
  327. echo 'checkVehicleDirection failed, now is empty!'.PHP_EOL;
  328. return false;
  329. }
  330. //获取最近一段时间内的信号
  331. $cond = array($now-60,$now);
  332. $signal_list = $this->redis_vsignal->table($vehicle_no)->where($cond)->select();
  333. //查询结果默认是按时间升序,这里翻转一下
  334. $signal_list = array_reverse($signal_list);
  335. if(!$signal_list){
  336. echo 'checkVehicleDirection failed,signal_list is empty!'.PHP_EOL;
  337. return false;
  338. }
  339. //最后一个信号点所在的基站
  340. $last_station = $signal_list[0]['StationCode'];
  341. if(!$last_station){
  342. echo 'checkVehicleDirection failed,last_station is empty!'.PHP_EOL;
  343. return false;
  344. }
  345. //获取一段时间内同一基站连续的几个信号强度点
  346. $rssi_list = array();
  347. foreach($signal_list as $key=>$row){
  348. $signal = json_decode($key,true);
  349. if(!$signal){
  350. echo 'json_decode error'.PHP_EOL;
  351. return false;
  352. }
  353. if($last_station != $signal['StationCode']){
  354. echo 'is not the last_station rssi,stop push! last_station = '.$last_station.', cur_station = '.$signal['StationCode'].PHP_EOL;
  355. break;
  356. }
  357. $rssi_list[] = $signal['rssi'];
  358. }
  359. if( count($rssi_list)<3 ){
  360. echo 'checkVehicleDirection failed,count($rssi_list)<3 !! count($rssi_list) = '.count($rssi_list).PHP_EOL;
  361. return false;
  362. }
  363. //<信号一直递增或者一直递减的,车辆方向暂时不好判断>
  364. //判断车辆rssi信号强度是否递减(此时,时间是降序)
  365. $is_rssi_decrease = $this->isRssiDecrease($rssi_list, count($rssi_list));
  366. if($is_rssi_decrease){
  367. echo '检测到车辆rssi信号强度递增,车辆正在靠近基站!StationCode = '.$last_station.PHP_EOL;
  368. return false;
  369. }
  370. //如果rssi先逐渐增强,后逐渐减弱,且峰值右侧第一个信号大于峰值左侧第一个信号,则认为是进入小区
  371. //如果rssi先逐渐增强,后逐渐减弱,且峰值右侧第一个信号小于峰值左侧第一个信号,则认为是走出小区
  372. echo '判断不出车辆运动方向!VehicleNumber = '. $vehicle_no .PHP_EOL;
  373. return false;
  374. }
  375. private function isRssiDecrease( $arr, $len ){
  376. if ($len == 1)
  377. return true;
  378. return ($arr[$len - 2] >= $arr[$len - 1]) && $this->isRssiDecrease($arr, $len-1);
  379. }
  380. private function isRssiDrab( $arr, $len ){
  381. if(!$arr){
  382. echo 'isRssiDrab failed, arr is empty!!'.PHP_EOL;
  383. return false;
  384. }
  385. if(!$len){
  386. echo 'isRssiDrab failed, len is empty!!'.PHP_EOL;
  387. return false;
  388. }
  389. if($this->isRssiIncrease($arr, $len)){
  390. echo 'rssi increase'.PHP_EOL;
  391. return true;
  392. }
  393. if($this->isRssiDecrease($arr, $len)){
  394. echo 'rssi decrease'.PHP_EOL;
  395. return true;
  396. }
  397. echo 'rssi is not drab '.PHP_EOL;
  398. return false;
  399. }
  400. private function isRssiIncrease( $arr, $len ){
  401. if ($len == 1)
  402. return true;
  403. return ($arr[$len - 2] <= $arr[$len - 1]) && $this->isRssiIncrease($arr, $len-1);
  404. }
  405. private function getAvgRssi( $data ){
  406. $rfid = $data['VehicleNumber'];
  407. if(!$rfid){
  408. echo 'getAvgRssi failed ,VehicleNumber not existed!'.PHP_EOL;
  409. return false;
  410. }
  411. $station_code = $data['StationCode'];
  412. if(!$station_code){
  413. echo 'getAvgRssi failed ,StationCode not existed!'.PHP_EOL;
  414. return false;
  415. }
  416. $key = $station_code.'_'.$rfid;
  417. //添加新车辆轨迹点
  418. $route_point = array('Rfid'=>$rfid,'Time'=>$data['Timestamp'],'Rssi'=>$data['rssi']);
  419. $signal_data = array(json_encode($route_point) => $data['Timestamp']);
  420. $this->redis_vsignal->table($key)->add($signal_data);
  421. //查询时间窗内,所有rssi
  422. $interval = C('rcgjfw.信号均值_采集时间窗');
  423. if(!$interval){
  424. $interval = 4;
  425. }
  426. $start = $data['Timestamp']-$interval;
  427. $where = array( $start,$data['Timestamp']);
  428. $list = $this->redis_vsignal->table($key)->where($where)->select();
  429. //计算平均值
  430. $sum = 0;
  431. $count = 0;
  432. $info = array();
  433. foreach($list as $signal => $time){
  434. $signal = json_decode($signal,true);
  435. $sum += $signal['Rssi'];
  436. $count++;
  437. $info[$time] = $signal['Rssi'];
  438. }
  439. echo 'key:'.$key.', rssi_pool:'.json_encode($info).PHP_EOL;
  440. if(!$count){
  441. echo 'getAvgRssi failed ,rssi_pool empty!'.PHP_EOL;
  442. return false;
  443. }
  444. $avgRssi = round($sum/$count);
  445. echo 'rfid: '.$rfid.', station_code: '.$station_code.', avgRssi = '.$avgRssi.PHP_EOL;
  446. return $avgRssi;
  447. }
  448. }