Api.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  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. $text=null;
  57. while(1){
  58. $jsonData= $ues_redis->rpop("mqtt_data");
  59. debug_log("InAndOUT",'数据redis'.$jsonData);
  60. if(empty($jsonData)){
  61. debug_log("InAndOUT",'没有数据');
  62. sleep(1);
  63. continue;
  64. }
  65. // debug_log("InAndOUT",$jsonData);
  66. $data=json_decode($jsonData,true);
  67. // debug_log("InAndOUT",$data['cnt']);
  68. $time=$data['time'];
  69. $mac=$data['imei'];
  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. debug_log("InAndOUT","数据:".json_encode($DA,true));
  95. //保存计算中
  96. //分为8个桶
  97. // $num=Hexdec($label);
  98. // $Identification=$num%8;
  99. // $key="buckets".$Identification;
  100. // $ues_redis->rPush($key,json_encode($DA,true));
  101. try{
  102. $dispose = new dispose($ues_redis);
  103. $computedata=$dispose->computeData($DA);
  104. debug_log("InAndOUT","计算完成的数据:".json_encode($DA,true));
  105. $dispose->computeResout($computedata);
  106. }catch(Exception $e){
  107. debug_log("InAndOUT","抛出异常".json_encode($DA,true));
  108. }
  109. $text=substr($text,24);
  110. }else{
  111. $text=substr($text,1);
  112. }
  113. }
  114. // $tage = new Access();
  115. // $tage->saveAll($list);
  116. }
  117. }
  118. public function redis_to_mysql_parea(){
  119. $ues_redis=Cache::store('redis')->handler();
  120. $text="";
  121. $dispose = new dispose($ues_redis);
  122. while(1){
  123. $jsonData= $ues_redis->rpop("mqtt_data_parea4rssi");
  124. debug_log("InAndOUT",'数据redis'.$jsonData);
  125. if(empty($jsonData)){
  126. debug_log("InAndOUT",'没有数据');
  127. sleep(1);
  128. continue;
  129. }
  130. // debug_log("InAndOUT",$jsonData);
  131. $data=json_decode($jsonData,true);
  132. // debug_log("InAndOUT",$data['cnt']);
  133. $time=$data['time'];
  134. $mac=$data['mac'];
  135. $text=$text.$data['cnt'];
  136. if(strlen($text)<24){
  137. continue;
  138. }
  139. $text = $this->handleMessage($text, $mac, $time, $ues_redis);
  140. // foreach ($jsonData as $k => $v) {
  141. // $data = json_decode($v, true);
  142. // $config = $this->selectHash("anbang_four_wire",$data['mac']);
  143. // if(!$config){
  144. // $config = [
  145. // "front" => 70,
  146. // "behind" => 70,
  147. // "left" => 70,
  148. // "right" => 70
  149. // ];
  150. // }else{
  151. // $config = json_decode($config);
  152. // }
  153. // $field = "";
  154. // $infos = $ues_redis->hget("parea_rfidinfos",$field);
  155. // if(!$infos){
  156. // }
  157. // //判断进出段
  158. // //1。当前时间 - 上次时间 > 设定时间
  159. // if( (time() - $v["time"]) > $setInt ){
  160. // //推送离开
  161. // }
  162. // }
  163. sleep(2);
  164. }
  165. }
  166. // //http://47.114.185.186:8115/api/areaReport
  167. // //{“mac”:”013560”,”data”:[{“label”:”258962f”,”time”:1682317268,”dirt”:2},{“label”:”258962f”,”time”:1682317268,”dirt”:1}]
  168. // }
  169. //消息处理
  170. public function handleMessage($text, $mac, $time, $ues_redis){
  171. while(strlen($text)>=24){
  172. $da=substr($text,0,24);
  173. $t1 = substr($da,8,2)=='00'||substr($da,8,2)=='10'||substr($da,8,2)=='01' ? true:false;
  174. $t2 =substr($da,10,6)=="FFFFFF"||substr($da,10,6)=="000000" ?true:false;
  175. if($t1&&$t2){
  176. // var_dump($text);
  177. $rfid= substr($da,0,8);
  178. $rssi1= hexdec(substr($da,16,2));
  179. $rssi2= hexdec(substr($da,18,2));
  180. $rssi3= hexdec(substr($da,20,2));
  181. $rssi4= hexdec(substr($da,22,2));
  182. // $rc1 = ($rssi1 == 255 ? 0 : 1);
  183. // $rc2 = ($rssi2 == 255 ? 0 : 1);
  184. // $rc3 = ($rssi3 == 255 ? 0 : 1);
  185. // $rc4 = ($rssi4 == 255 ? 0 : 1);
  186. $DA=[
  187. 'mac' => $mac,
  188. 'label' =>$rfid,
  189. 'rssi1' => $rssi1,
  190. 'rssi2' => $rssi2,
  191. 'rssi3' => $rssi3,
  192. 'rssi4' => $rssi4,
  193. 'report_time'=>$time
  194. ];
  195. $field = $mac."_".$rfid;
  196. $info = $ues_redis->hget("parea_rfidinfos",$field);
  197. debug_log("InAndOUT","数据:".json_encode($DA,true));
  198. if(!$info){
  199. $info = [
  200. "mac" => $mac,
  201. "id" => $rfid,
  202. "firs_time" => $time,
  203. "last_time" => $time,
  204. "status" => 1,//1出状态,2进状态
  205. "rssi" => [
  206. [
  207. "front" => $rssi1,
  208. "behind" => $rssi2,
  209. "left" => $rssi3,
  210. "right" => $rssi4,
  211. "time" => $time
  212. ]
  213. ]
  214. ];
  215. $ues_redis->hset("parea_rfidinfos",$field, json_encode($info,true));
  216. }else{
  217. $info = json_decode($info,true);
  218. $info["last_time"] = $time;
  219. $newRssi = [
  220. "front" => $rssi1,
  221. "behind" => $rssi2,
  222. "left" => $rssi3,
  223. "right" => $rssi4,
  224. "time" => $time
  225. ];
  226. $rssisArr = $info["rssi"];
  227. foreach ($rssisArr as $k => $v) {
  228. # code...
  229. if( ($time - $v["time"] ) > $EXP_TIME ){
  230. unset($rssisArr[$k]);
  231. }
  232. }
  233. if(count($rssisArr) == $EFF_SIG_NUM){
  234. array_shift($rssisArr);
  235. array_push($rssisArr, $newRssi);
  236. }else{
  237. array_push($rssisArr, $newRssi);
  238. }
  239. $info["rssi"] = $rssisArr;
  240. $cacCount = count($rssisArr);
  241. // if($cacCount > $EFF_SIG_NUM){
  242. $sum1 = 0;
  243. $sum2 = 0;
  244. $sum3 = 0;
  245. $sum4 = 0;
  246. foreach ($rssisArr as $k => $v) {
  247. # code...
  248. $sum1 += ($v["front"] == 255 ? 85 : $v["front"]);
  249. $sum2 += ($v["behind"] == 255 ? 85 : $v["behind"]);
  250. $sum3 += ($v["left"] == 255 ? 85 : $v["left"]);
  251. $sum4 += ($v["right"] == 255 ? 85 : $v["right"]);
  252. }
  253. $info["avg"] = [
  254. "front" => number_format( $sum1/$cacCount, 2 ),
  255. "behind" => number_format( $sum2/$cacCount, 2 ),
  256. "left" => number_format( $sum3/$cacCount, 2 ),
  257. "right" => number_format( $sum4/$cacCount, 2 ),
  258. ];
  259. if ($cacCount == $EFF_SIG_NUM) {
  260. # code...
  261. $this->compAndPush($info["avg"], $mac, $rfid, $ues_redis);
  262. }
  263. $ues_redis->hset("parea_rfidinfos",$field, json_encode($info,true));
  264. }
  265. $text=substr($text,24);
  266. }else{
  267. $text=substr($text,1);
  268. }
  269. }
  270. return $text ?$text : "";
  271. }
  272. //判断进出和推送
  273. public function compAndPush($data, $mac, $rfid, $ues_redis){
  274. //标签多,数据多时候,判断完成后放入redis,异步推送,当前暂时直接推
  275. if (empty($data)) {
  276. # code...
  277. return false;
  278. }
  279. $config = $ues_redis->hget("anbang_four_wire", $mac);
  280. //{"front_in":44,"front_out":44,"behind_in":50,"behind_out":50,"left_in":55,"left_out":55,"right_out":44,"right_out":44}
  281. if (!$config) {
  282. # code...
  283. $config = [
  284. "front_in" => 70,
  285. "behind_in" => 70,
  286. "left_in" => 70,
  287. "right_in" => 70,
  288. "front_out" => 80,
  289. "behind_out" => 80,
  290. "left_out" => 80,
  291. "right_out" => 80,
  292. ];
  293. }
  294. $flagIn = $data["front"] < $config["front_in"] || $data["behind"] < $config["behind_in"] || $data["left"] < $config["left_in"] || $data["right"] < $config["right_in"];
  295. $flagOut = $data["front"] > $config["front_out"] && $data["behind"] < $config["behind_out"] && $data["left"] < $config["left_out"] && $data["right"] < $config["right_out"];
  296. if($flagIn){
  297. //推送进
  298. }else{
  299. //推送出
  300. }
  301. return true;
  302. }
  303. public function test(){
  304. try{
  305. $ues_redis=Cache::store('redis')->handler();
  306. $jsonData= $ues_redis->rpop("mqtt_data");
  307. debug_log("InAndOUT","1212");
  308. }catch(Exception $e){
  309. var_dump($e->getMessage());
  310. }
  311. }
  312. /**
  313. * 删除前1天的数据
  314. *
  315. * @return void
  316. */
  317. public function deleteHistory()
  318. {
  319. while(true)
  320. {
  321. $where[] = ['addTime','<',strtotime("-1 day")];
  322. Db::name('tag_history')->where($where)->delete();
  323. sleep(60*60*24);
  324. }
  325. }
  326. /**
  327. * 检测小程序版本版本 function
  328. *
  329. * @return void
  330. */
  331. public function detectionVersion(){
  332. $token = $_GET['token'];
  333. if (!$token || $token != '444333d3') {
  334. json_fail('缺少token或者token不对');
  335. }
  336. $data["url"]="http://116.62.220.88:8112/static/app/蓝牙小程序/1.1.1/rl-release.apk";
  337. $data["version"]="1.1.1";
  338. json_success("查询版本成功",$data);
  339. }
  340. }