wang jun 1 year ago
parent
commit
1369de832b
1 changed files with 105 additions and 28 deletions
  1. 105 28
      application/common/server/SouhuanAnalysis.php

+ 105 - 28
application/common/server/SouhuanAnalysis.php

@@ -98,35 +98,111 @@ class SouhuanAnalysis
      * @author wj
      * @date 2023-08-23
      */
-    public function getmacforUD($str)
+    public function getmacforUD($str, $device_id_code)
     {
-        $data = [];
-        $preg = "/(?<=\*)([a-zA-Z]){2,}(?=,)|(?<=,)([AV]{1})(?=,)|(?<=,)([0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2})(?=,)/";
-        $data = preg_match_all($preg, $str, $match);
-        $data = $match[0];
-        $command = $data[0];
-        if ('UD' == $command) {
-            $is_gps = $data[1];
-            if ('V' == $is_gps) {
-                //异步请求
-                $mac = $data[2];
-                $url = "http://api.cellocation.com:84/wifi/?mac=" . $mac . "&output=json";
+        $data = explode(",", $str);
+        $is_gps = $data[3];
+        $is_success = false;
+        $accesstype = -1;
+        $apikey = "67019de565fb4aa2a0e101b70ae3fd91";
+        if ('V' == $is_gps) {
+            $jzcount = $data['17'];
+            $jzlist = [];
+            $mcc = $data['19'];
+            $mnc = $data['20'];
+            $jzindex = 21;
+            for ($i = 0; $i < $jzcount; $i++) {
+                $item = [
+                    'area_code' => $data[$jzindex],
+                    'jz_code' => $data[$jzindex + 1],
+                    'signal_strength' => $data[$jzindex + 2],
+                ];
+                $jzindex += 3;
+                $jzlist[] = $item;
+            }
+            $wificount = $data[$jzindex];
+            $wifiindex = $jzindex + 1;
+            $wifilist = [];
+            for ($i = 0; $i < $wificount; $i++) {
+                $item = [
+                    'name' => $data[$wifiindex],
+                    'mac' => $data[$wifiindex + 1],
+                    'signal_strength' => $data[$wifiindex + 2],
+                ];
+                $wifiindex += 3;
+                $wifilist[] = $item;
+            }
+            $bts = "";
+            $nearbts_arr = [];
+            $nearbts = "";
+            $macs_arr = [];
+            $macs = "";
+            foreach ($jzlist as $key => $value) {
+                if ($key === 0) {
+                    $bts = $mcc . "," . $mnc . "," . $value['area_code'] . "," . $value['jz_code'] . "," . $value['signal_strength'];
+                } else {
+                    $nearbts_arr[] = $mcc . "," . $mnc . "," . $value['area_code'] . "," . $value['jz_code'] . "," . $value['signal_strength'];
+                }
+            }
+            $nearbts = join("|", $nearbts_arr);
+            foreach ($wifilist as $key => $value) {
+                $macs_arr[] = $value['mac'] . "," . $value['signal_strength'];
+            }
+            $macs = join("|", $macs_arr);
+            $accesstype = 1;
+            $url = "http://apilocate.amap.com/position?macs=" . $macs . "&bts=" . $bts . "&nearbts=" . $nearbts . "&network=GSM&cdma=0&accesstype=" . $accesstype . "&output=json&key=" . $apikey;
+            $result = curl_request($url);
+            if ('10000' === $result['infocode']) {
+                $resultdata = $result['result'];
+                $locations = explode(",", $resultdata['location']);
+                $use_gps_long = $locations[0];
+                $use_gps_lat = $locations[1];
+                $address_desc = $resultdata['desc'];
+                $accesstype = 2;
+                $is_success = true;
+            } else {
+                Log::write($url, 'shouhuan');
+                Log::write($result, 'shouhuan');
+                $accesstype = -2;
+            }
+        }
+        if (!$is_success) {
+            $use_gps_long = $data[6];
+            $use_gps_lat = $data[4];
+            $gps_str = $use_gps_long . "," . $use_gps_lat;
+            $url = "https://restapi.amap.com/v3/assistant/coordinate/convert?locations=" . $gps_str . "&coordsys=gps&output=JSON&key=" . $apikey;
+            $result = curl_request($url);
+            if ('10000' == $result['infocode']) {
+                $locations = $result['locations'];
+                $url = "https://restapi.amap.com/v3/geocode/regeo?location=" . $locations . "&key=" . $apikey;
                 $result = curl_request($url);
-                Log::write($match, 'shouhuan');
-                $data = [];
-                if (0 === $result['errcode']) {
-                    $data['use_gps_lat'] = $result['lat'];
-                    $data['use_gps_long'] = $result['lon'];
-                    $data['use_mac'] = $mac;
-                    $address = $result['address'];
-                    $address = explode(";", $address);
-                    $data['address'] = $address[0];
-                    $data['address1'] = $address[1];
-                    return $data;
+                if ('10000' == $result['infocode']) {
+                    $address_desc = $result['regeocode']['formatted_address'];
+                    $is_success = true;
+                    $accesstype = 0; //未接入智能硬件定位
+                } else {
+                    Log::write($url, 'shouhuan');
+                    Log::write($result, 'shouhuan');
                 }
+            } else {
+                Log::write($url, 'shouhuan');
+                Log::write($result, 'shouhuan');
             }
         }
-        return false;
+        if (!$is_success) {
+            $accesstype = -2;
+            $use_gps_long = $data[6];
+            $use_gps_lat = $data[4];
+            $address_desc = "";
+        }
+        $data = [
+            'is_gps' => $is_gps == "A" ? 1 : 0,
+            'address_desc' => $address_desc,
+            'accesstype' => $accesstype,
+            'use_gps_long' => $use_gps_long,
+            'use_gps_lat' => $use_gps_lat,
+        ];
+        return $data;
     }
     /**
      * 内容解析
@@ -982,9 +1058,11 @@ class SouhuanAnalysis
         } else {
             //手环基础信息修改
             $sriData = $data;
-            $uddata = $this->getmacforUD($original_str);
-            if ($uddata) {
-                $sriData = array_merge($sriData, $uddata);
+            if ($command == "UD") {
+                $uddata = $this->getmacforUD($original_str, $device_id_code);
+                if ($uddata) {
+                    $sriData = array_merge($sriData, $uddata);
+                }
             }
             $sriwhere = [
                 'facility_id' => $facility_id,
@@ -1506,7 +1584,6 @@ class SouhuanAnalysis
         $unicode = '';
         $arr = mb_str_split($str); //适配中文
         foreach ($arr as $key => $value) {
-            var_dump($value);
             $char = bin2hex(iconv('UTF-8', 'UCS-2BE', $value));
             $char = str_pad($char, 4, '0', STR_PAD_LEFT);
             $arr[$key] = $char;