2015-08-26 5 views
0

Я осуществляю службу отслеживания для отслеживания местоположения автобусов в моем городе. Автобусы оснащены WIFI access point (AP). Поэтому я буду определять номер маршрута на основе SSID AP WIFI после его разбора из текстового документа JSON. Я применил BroadcastReceiver для выполнения этой работы, но чтобы избежать случая, когда шина держится рядом с пользователем на мгновение, и пользователь не входит в шину (возможно, потому, что шина не является подходящей шиной, которую пользователь ждет) I хотите отправить маршрут на сервер через 60 секунд. Таким образом, приложение должно сначала захватить SSID, а затем проверить, находится ли он в диапазоне через 60 секунд, а затем в этом случае маршрут отправляется на сервер. Как я могу это сделать в моем случае?Подождите 60 секунд перед отправкой захваченного SSID на сервер

Я ценю любую помощь.

Часть документа JSON:

{ 
    "wifi": [ 
      { 
       "ssid": "Fr Privat", 
       "route_number": 1 
      }, 

      { 
       "ssid": "Fr WLAN Hotspot+", 
       "route_number": 4 
      } 
      ] 
} 

TrackingService класс:

public class TrackingService extends Service implements 
      LocationListener { 
     private int route_number = 0; 

     private final BroadcastReceiver wifi_receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 

       WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
       if (wifi.isWifiEnabled()) { 
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
        final List<ScanResult> results = wifiManager.getScanResults(); 
        if (results != null) { 
         // list of access points from the last scan 
         List<ScanResult> updatedResults = new ArrayList<ScanResult>(); 
         // pick Wi-Fi access points which begins with these "Fr" 
         // characters. 
         for (int i = 0; i < results.size(); i++) { 
          String ssid = results.get(i).SSID; 
          if (ssid.startsWith("Fr")) { 
           updatedResults.add(results.get(i)); 
          } 
         } 
         if (updatedResults.size() > 0 && route_number == 0) { 
          String ssid = deliverBestAccessPoint(updatedResults); 
          // retrieve data from json String and parse it. 
          route_number = parse_SSID(ssid); 

         } 
        } 

       } else { 
        Toast.makeText(context, "Please turn your Wi-Fi on", 
          Toast.LENGTH_SHORT).show(); 

       } 

      } 
     private String deliverBestAccessPoint(final List<ScanResult> updatedResults) { 
      ScanResult bestSignal = (ScanResult) updatedResults.get(0); 
      for (int i = 1; i < updatedResults.size(); i++) { 
       ScanResult result = (ScanResult) updatedResults.get(i); 
       bestSignal = (WifiManager.compareSignalLevel(bestSignal.level, 
         result.level) < 0) ? result : bestSignal; 
      } 
      return bestSignal.SSID; 
     } 

     }; 

     @Override 
    public void onLocationChanged(Location location) { 
     if (location != null) { 
     ...... 
       String jSONString = convertToJSON(mac, pLong, pLat, time, speed); 
       if (isNetworkAvailable()) { 
       PostData sender = new PostData(TrackingService.this); 
       sender.post_data(jSONString, this); 

      } 

    } 
} 


    } 

ответ

0

Вы можете использовать Handler класс для задержки SSID направляется на сервер на 60 сек.

Каждый раз, когда вы получаете SSID, вы вызываете функцию postDelayed() со своим обычным Runnable и вашей задержкой в ​​60 секунд.

Внутри Runnable вы проверяете, находится ли SSID в зоне действия или нет, если он находится в зоне действия, тогда отправьте SSID на сервер.

Надеюсь, что это поможет

Смежные вопросы