public void writeToParcel(Parcel dest, int flags) {
   dest.writeInt(this.truncated ? 1 : 0);
   dest.writeInt(this.scanResults.size());
   for (ScanResult s : this.scanResults) {
     s.writeToParcel(dest, flags);
   }
 }
예제 #2
0
 public ScanDetail(
     WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency, long tsf, long seen) {
   mNetworkDetail = null;
   mScanResult = new ScanResult(wifiSsid, BSSID, caps, level, frequency, tsf);
   mSeen = seen;
   // mScanResult.seen = mSeen;
   mScanResult.channelWidth = 0;
   mScanResult.centerFreq0 = 0;
   mScanResult.centerFreq1 = 0;
   mScanResult.flags = 0;
   mMatches = null;
 }
 public String toString() {
   StringBuffer sb = new StringBuffer();
   sb.append("BatchedScanResult: ")
       .append("truncated: ")
       .append(String.valueOf(this.truncated))
       .append("scanResults: [");
   for (ScanResult s : this.scanResults) {
     sb.append(" <").append(s.toString()).append("> ");
   }
   sb.append(" ]");
   return sb.toString();
 }
예제 #4
0
 public void testScanResultProperties() {
   if (!WifiFeature.isWifiSupported(getContext())) {
     // skip the test if WiFi is not supported
     return;
   }
   List<ScanResult> scanResults = mWifiManager.getScanResults();
   // this test case should in Wifi environment
   for (int i = 0; i < scanResults.size(); i++) {
     ScanResult mScanResult = scanResults.get(i);
     assertNotNull(mScanResult.toString());
   }
 }
예제 #5
0
 public void propagateANQPInfo(Map<Constants.ANQPElementType, ANQPElement> anqpElements) {
   if (anqpElements.isEmpty()) {
     return;
   }
   mNetworkDetail = mNetworkDetail.complete(anqpElements);
   HSFriendlyNameElement fne =
       (HSFriendlyNameElement) anqpElements.get(Constants.ANQPElementType.HSFriendlyName);
   // !!! Match with language
   if (fne != null && !fne.getNames().isEmpty()) {
     mScanResult.venueName = fne.getNames().get(0).getText();
   } else {
     VenueNameElement vne =
         (((VenueNameElement) anqpElements.get(Constants.ANQPElementType.ANQPVenueName)));
     if (vne != null && !vne.getNames().isEmpty()) {
       mScanResult.venueName = vne.getNames().get(0).getText();
     }
   }
 }
예제 #6
0
 public ScanDetail(
     NetworkDetail networkDetail,
     WifiSsid wifiSsid,
     String BSSID,
     String caps,
     int level,
     int frequency,
     long tsf) {
   mNetworkDetail = networkDetail;
   mScanResult = new ScanResult(wifiSsid, BSSID, caps, level, frequency, tsf);
   mSeen = System.currentTimeMillis();
   // mScanResult.seen = mSeen;
   mScanResult.channelWidth = networkDetail.getChannelWidth();
   mScanResult.centerFreq0 = networkDetail.getCenterfreq0();
   mScanResult.centerFreq1 = networkDetail.getCenterfreq1();
   if (networkDetail.is80211McResponderSupport())
     mScanResult.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
   mMatches = null;
 }
예제 #7
0
  static synchronized void onFullScanResult(int id, ScanResult result, byte bytes[]) {
    if (DBG)
      Log.i(
          TAG,
          "Got a full scan results event, ssid = " + result.SSID + ", " + "num = " + bytes.length);

    int num = 0;
    for (int i = 0; i < bytes.length; ) {
      num++;
      int type = (int) bytes[i] & 0xFF;
      int len = (int) bytes[i + 1] & 0xFF;
      if (len < 0) {
        Log.e(TAG, "bad length; returning");
        return;
      }
      i += len + 2;
      if (DBG) Log.i(TAG, "bytes[" + i + "] = [" + type + ", " + len + "]" + ", " + "next = " + i);
    }

    ScanResult.InformationElement elements[] = new ScanResult.InformationElement[num];
    for (int i = 0, index = 0; i < num; i++) {
      int type = (int) bytes[index] & 0xFF;
      int len = (int) bytes[index + 1] & 0xFF;
      if (DBG) Log.i(TAG, "index = " + index + ", type = " + type + ", len = " + len);
      ScanResult.InformationElement elem = new ScanResult.InformationElement();
      elem.id = type;
      elem.bytes = new byte[len];
      for (int j = 0; j < len; j++) {
        elem.bytes[j] = bytes[index + j + 2];
      }
      elements[i] = elem;
      index += (len + 2);
    }

    result.informationElements = elements;
    if (sScanEventHandler != null) {
      sScanEventHandler.onFullScanResult(result);
    }
  }
예제 #8
0
 @SuppressLint("NewApi")
 public void render(ScanResult sr) {
   tvName.setText(sr.toString());
 }
  public void run() {
    int i,
        j,
        storedValues,
        sleepTime = 3000,
        timeoutCtr = 0,
        lastFlags = -1,
        trackCnt = 0,
        lastLocMethod = -5;
    String bssid;
    WMapEntry currEntry;
    DataOutputStream out;
    FileInputStream in;

    while (running) {
      try {
        if (scanData.getNoGPSExitInterval() > 0) {
          if (System.currentTimeMillis() > lastGPSTime + scanData.getNoGPSExitInterval()) {
            break;
          }
        }
        if (ScanService.scanData.getThreadMode() == OWMapAtAndroid.THREAD_MODE_UPLOAD) {
          if ((m_uploadThread != null) && (m_uploadThread.isUploading()))
            OWMapAtAndroid.sendMessage(
                ScannerHandler.MSG_SIMPLE_ALERT,
                0,
                0,
                getResources().getText(R.string.upload_in_progress));
          else m_uploadThread = new UploadThread(scanData, this, SP, false, notification, null);
          ScanService.scanData.setThreadMode(OWMapAtAndroid.THREAD_MODE_SCAN);
        } else {
          if ((posState == 0) && (scanData != null) && (scanData.isScanningEnabled())) {
            posState = 1;
            timeoutCtr = 0;
            if (scanData.getFlags() != lastFlags) {
              if ((scanData.getFlags() & OWMapAtAndroid.FLAG_NO_NET_ACCESS) == 0)
                scanData.getWifiManager().createWifiLock(WifiManager.WIFI_MODE_FULL, "OpenWLANMap");
              else
                scanData
                    .getWifiManager()
                    .createWifiLock(WifiManager.WIFI_MODE_SCAN_ONLY, "OpenWLANMap");
              lastFlags = scanData.getFlags();
            }
            if ((scanData.getFlags() & OWMapAtAndroid.FLAG_NO_NET_ACCESS) == 0)
              myWLocate.wloc_request_position(WLocate.FLAG_NO_IP_LOCATION);
            else {
              myWLocate.wloc_request_position(
                  WLocate.FLAG_NO_NET_ACCESS | WLocate.FLAG_NO_IP_LOCATION);
              //                  stopGoogleLocation();
            }
          } else if (!scanData.isScanningEnabled()) {
            try {
              trackCnt += 1500;
              Thread.sleep(1500);
            } catch (InterruptedException ie) {

            }
          }
          if (posState == 1) {
            // sleep while waiting for result
            try {
              trackCnt += 2500;
              java.lang.Thread.sleep(2500); // is interrupted from result handler
              timeoutCtr++;
              if (timeoutCtr > 3) {
                timeoutCtr = 0;
                posState = 0;
              }
            } catch (InterruptedException ie) {
            }
          }
          if ((posState == 2) || (posState == 100)) {
            loc_info locationInfo;
            NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

            locationInfo = myWLocate.last_location_info();
            if (lastLocMethod != locationInfo.lastLocMethod) {
              scanData.getmView().setMode(locationInfo.lastLocMethod);
              scanData.getmView().postInvalidate();
              lastLocMethod = locationInfo.lastLocMethod;
            }
            if (posState == 100) locationInfo.lastLocMethod = -1;
            OWMapAtAndroid.sendMessage(
                OWMapAtAndroid.ScannerHandler.MSG_UPD_LOC_STATE,
                (int) (lastRadius * 1000),
                locationInfo.lastLocMethod,
                locationInfo);

            if (SP.getBoolean("autoConnect", false)) {
              if (!mWifi.isConnected()) {
                for (i = 0; i < locationInfo.wifiScanResult.size(); i++) {
                  ScanResult result;

                  result = locationInfo.wifiScanResult.get(i);
                  result.capabilities = result.capabilities.toUpperCase(Locale.US);
                  if ((isFreeHotspot(result) & WMapEntry.FLAG_IS_FREIFUNK) != 0) {
                    // auto-connect to this open network

                    WifiConfiguration wifiConfig = new WifiConfiguration();
                    wifiConfig.BSSID = result.BSSID;
                    wifiConfig.priority = 1;
                    wifiConfig.allowedKeyManagement.set(KeyMgmt.NONE);
                    wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                    wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
                    wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                    wifiConfig.status = WifiConfiguration.Status.ENABLED;

                    int netId = scanData.getWifiManager().addNetwork(wifiConfig);
                    scanData.getWifiManager().enableNetwork(netId, true);
                  }
                }
              }
            }
            if ((posValid)
                && (locationInfo.wifiScanResult != null)
                && (locationInfo.wifiScanResult.size() > 0)) {
              boolean foundExisting;

              for (i = 0; i < locationInfo.wifiScanResult.size(); i++) {
                ScanResult result;

                result = locationInfo.wifiScanResult.get(i);
                bssid = result.BSSID.replace(":", "").replace(".", "").toUpperCase(Locale.US);
                if (bssid.equalsIgnoreCase("000000000000")) break;
                foundExisting = false;
                scanData.getLock().lock();
                for (j = 0; j < scanData.getWmapList().size(); j++) {
                  currEntry = scanData.getWmapList().elementAt(j);
                  if (currEntry.getBSSID().equalsIgnoreCase(bssid)) {
                    currEntry.setPos(lastLat, lastLon);
                    foundExisting = true;
                    break;
                  }
                }
                if (!foundExisting) {
                  String lowerSSID;

                  storedValues = scanData.incStoredValues();
                  scanData.getmView().setValue(storedValues);
                  scanData.getmView().postInvalidate();
                  currEntry = new WMapEntry(bssid, result.SSID, lastLat, lastLon, storedValues);
                  lowerSSID = result.SSID.toLowerCase(Locale.US);
                  if ((lowerSSID.endsWith("_nomap"))
                      || // Google unsubscibe option
                      (lowerSSID.contains("iphone"))
                      || // mobile AP
                      (lowerSSID.contains("android"))
                      || // mobile AP
                      (lowerSSID.contains("motorola"))
                      || // mobile AP
                      (lowerSSID.contains("deinbus.de"))
                      || // WLAN network on board of German bus
                      (lowerSSID.contains("fernbus"))
                      || // WLAN network on board of German bus
                      (lowerSSID.contains("flixbus"))
                      || // WLAN network on board of German bus
                      (lowerSSID.contains("ecolines"))
                      || // WLAN network on board of German bus
                      (lowerSSID.contains("eurolines_wifi"))
                      || // WLAN network on board of German bus
                      (lowerSSID.contains("contiki-wifi"))
                      || // WLAN network on board of bus
                      (lowerSSID.contains("guest@ms "))
                      || // WLAN network on Hurtigruten ships
                      (lowerSSID.contains("admin@ms "))
                      || // WLAN network on Hurtigruten ships
                      (lowerSSID.contains("nsb_interakti"))
                      || // WLAN network in NSB trains
                      (lowerSSID.equals("southwestwifi"))) // WLAN network on Southwest flights
                  currEntry.setFlags(currEntry.getFlags() | WMapEntry.FLAG_IS_NOMAP);
                  else currEntry.setFlags(currEntry.getFlags() | isFreeHotspot(result));
                  if (isFreeHotspot(currEntry.getFlags())) scanData.incFreeHotspotWLANs();
                  scanData.getWmapList().add(currEntry);
                  if ((scanData.getUploadThres() > 0)
                      && (storedValues > scanData.getUploadThres())) {
                    if ((m_uploadThread == null) || (!m_uploadThread.isUploading())) {
                      if (mWifi.isConnected()) {
                        m_uploadThread =
                            new UploadThread(scanData, this, SP, true, notification, mWifi);
                      }
                    }
                  }
                }
                result.capabilities = result.capabilities.toUpperCase(Locale.US);
                scanData.getLock().unlock();
              }
            }
            scanData.getLock().lock();
            for (j = 0; j < scanData.getWmapList().size(); j++) {
              currEntry = scanData.getWmapList().elementAt(j);
              if ((currEntry.getLastUpdate() + OWMapAtAndroid.RECV_TIMEOUT
                      < System.currentTimeMillis())
                  && ((currEntry.getFlags() & WMapEntry.FLAG_IS_VISIBLE) == 0)) {
                scanData.getWmapList().remove(j);
                if (currEntry.posIsValid()) {
                  int padBytes = 0, k;

                  try {
                    in = scanData.getCtx().openFileInput(OWMapAtAndroid.WSCAN_FILE);
                    padBytes = in.available() % 28;
                    in.close();
                    if (padBytes > 0) padBytes = 28 - padBytes;
                  } catch (IOException ioe) {
                    ioe.printStackTrace();
                  }
                  try {
                    out =
                        new DataOutputStream(
                            scanData
                                .getCtx()
                                .openFileOutput(
                                    OWMapAtAndroid.WSCAN_FILE,
                                    Context.MODE_PRIVATE | Context.MODE_APPEND));
                    if (padBytes > 0) for (k = 0; k < padBytes; k++) out.writeByte(0);
                    out.write(currEntry.getBSSID().getBytes(), 0, 12);
                    if ((currEntry.getFlags() & WMapEntry.FLAG_IS_NOMAP) != 0) {
                      out.writeDouble(0.0);
                      out.writeDouble(0.0);
                    } else {
                      out.writeDouble(currEntry.getLat());
                      out.writeDouble(currEntry.getLon());
                    }
                    out.close();
                  } catch (IOException ioe) {
                    ioe.printStackTrace();
                  }

                  if ((currEntry.getFlags()
                          & (WMapEntry.FLAG_IS_FREIFUNK | WMapEntry.FLAG_IS_NOMAP))
                      == WMapEntry.FLAG_IS_FREIFUNK) {
                    padBytes = 0;
                    try {
                      in = scanData.getCtx().openFileInput(OWMapAtAndroid.WFREI_FILE);
                      padBytes = in.available() % 12;
                      in.close();
                      if (padBytes > 0) padBytes = 12 - padBytes;
                    } catch (IOException ioe) {
                      ioe.printStackTrace();
                    }
                    try {
                      out =
                          new DataOutputStream(
                              scanData
                                  .getCtx()
                                  .openFileOutput(
                                      OWMapAtAndroid.WFREI_FILE,
                                      Context.MODE_PRIVATE | Context.MODE_APPEND));
                      if (padBytes > 0) for (k = 0; k < padBytes; k++) out.writeByte(0);
                      out.write(currEntry.getBSSID().getBytes(), 0, 12);
                      out.close();
                    } catch (IOException ioe) {
                      ioe.printStackTrace();
                    }
                  }
                }
              }
              //               flushData(false);
            }
            scanData.getLock().unlock();
            m_lastSpeed = locationInfo.lastSpeed;
            if (!SP.getBoolean("adaptiveScanning", true)) sleepTime = 500;
            else if (locationInfo.lastSpeed > 90) sleepTime = 350;
            else if (locationInfo.lastSpeed < 0)
              sleepTime = 1300; // no speed information, may be because of WLAN localisation
            else if (locationInfo.lastSpeed < 6) sleepTime = 2500; // user seems to walk
            else {
              double f;

              f = 1.0 - (locationInfo.lastSpeed / 90.0);
              sleepTime = (int) ((1000.0 * f) + 350);
            }

            try {
              trackCnt += sleepTime;
              java.lang.Thread.sleep(sleepTime); // sleep between scans
            } catch (InterruptedException ie) {

            }
            posState = 0;
          }
        }
      } catch (NullPointerException npe) // in case the parent activity dies too fast
      {
        npe.printStackTrace();
      }
      if ((trackCnt > 500000) && (lastLat != 0) && (lastLon != 0)) {
        if (SP.getBoolean("track", false)) new UploadPositionTask().execute(null, null, null);
        trackCnt = 0;
      }
    }
    onDestroy(); // remove all resources (in case the thread was stopped due to some other reason
  }
예제 #10
0
 public void updateResults(
     NetworkDetail networkDetail,
     int level,
     WifiSsid wssid,
     String ssid,
     String flags,
     int freq,
     long tsf) {
   mScanResult.level = level;
   mScanResult.wifiSsid = wssid;
   // Keep existing API
   mScanResult.SSID = ssid;
   mScanResult.capabilities = flags;
   mScanResult.frequency = freq;
   mScanResult.timestamp = tsf;
   mSeen = System.currentTimeMillis();
   // mScanResult.seen = mSeen;
   mScanResult.channelWidth = networkDetail.getChannelWidth();
   mScanResult.centerFreq0 = networkDetail.getCenterfreq0();
   mScanResult.centerFreq1 = networkDetail.getCenterfreq1();
   if (networkDetail.is80211McResponderSupport())
     mScanResult.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
   if (networkDetail.isInterworking()) mScanResult.setFlag(ScanResult.FLAG_PASSPOINT_NETWORK);
 }
예제 #11
0
 public long setSeen() {
   mSeen = System.currentTimeMillis();
   mScanResult.seen = mSeen;
   return mSeen;
 }