/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net.wifi; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; import java.util.List; /** * Describes information about a detected access point. In addition * to the attributes described here, the supplicant keeps track of * {@code quality}, {@code noise}, and {@code maxbitrate} attributes, * but does not currently report them to external clients. */ public class ScanResult implements Parcelable { /** * The network name. */ public String SSID; /** * Ascii encoded SSID. This will replace SSID when we deprecate it. @hide */ public WifiSsid wifiSsid; /** * The address of the access point. */ public String BSSID; /** * The HESSID from the beacon. * @hide */ public long hessid; /** * The ANQP Domain ID from the Hotspot 2.0 Indication element, if present. * @hide */ public int anqpDomainId; /* * This field is equivalent to the |flags|, rather than the |capabilities| field * of the per-BSS scan results returned by WPA supplicant. See the definition of * |struct wpa_bss| in wpa_supplicant/bss.h for more details. */ /** * Describes the authentication, key management, and encryption schemes * supported by the access point. */ public String capabilities; /** * @hide * No security protocol. */ public static final int PROTOCOL_NONE = 0; /** * @hide * Security protocol type: WPA version 1. */ public static final int PROTOCOL_WPA = 1; /** * @hide * Security protocol type: WPA version 2, also called RSN. */ public static final int PROTOCOL_WPA2 = 2; /** * @hide * Security protocol type: * OSU Server-only authenticated layer 2 Encryption Network. * Used for Hotspot 2.0. */ public static final int PROTOCOL_OSEN = 3; /** * @hide * No security key management scheme. */ public static final int KEY_MGMT_NONE = 0; /** * @hide * Security key management scheme: PSK. */ public static final int KEY_MGMT_PSK = 1; /** * @hide * Security key management scheme: EAP. */ public static final int KEY_MGMT_EAP = 2; /** * @hide * Security key management scheme: FT_PSK. */ public static final int KEY_MGMT_FT_PSK = 3; /** * @hide * Security key management scheme: FT_EAP. */ public static final int KEY_MGMT_FT_EAP = 4; /** * @hide * Security key management scheme: PSK_SHA256 */ public static final int KEY_MGMT_PSK_SHA256 = 5; /** * @hide * Security key management scheme: EAP_SHA256. */ public static final int KEY_MGMT_EAP_SHA256 = 6; /** * @hide * Security key management scheme: OSEN. * Used for Hotspot 2.0. */ public static final int KEY_MGMT_OSEN = 7; /** * @hide * No cipher suite. */ public static final int CIPHER_NONE = 0; /** * @hide * No group addressed, only used for group data cipher. */ public static final int CIPHER_NO_GROUP_ADDRESSED = 1; /** * @hide * Cipher suite: TKIP */ public static final int CIPHER_TKIP = 2; /** * @hide * Cipher suite: CCMP */ public static final int CIPHER_CCMP = 3; /** * The detected signal level in dBm, also known as the RSSI. * *
Use {@link android.net.wifi.WifiManager#calculateSignalLevel} to convert this number into
* an absolute signal level which can be displayed to a user.
*/
public int level;
/**
* The primary 20 MHz frequency (in MHz) of the channel over which the client is communicating
* with the access point.
*/
public int frequency;
/**
* AP Channel bandwidth is 20 MHZ
*/
public static final int CHANNEL_WIDTH_20MHZ = 0;
/**
* AP Channel bandwidth is 40 MHZ
*/
public static final int CHANNEL_WIDTH_40MHZ = 1;
/**
* AP Channel bandwidth is 80 MHZ
*/
public static final int CHANNEL_WIDTH_80MHZ = 2;
/**
* AP Channel bandwidth is 160 MHZ
*/
public static final int CHANNEL_WIDTH_160MHZ = 3;
/**
* AP Channel bandwidth is 160 MHZ, but 80MHZ + 80MHZ
*/
public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
/**
* AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
* {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}
* or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}.
*/
public int channelWidth;
/**
* Not used if the AP bandwidth is 20 MHz
* If the AP use 40, 80 or 160 MHz, this is the center frequency (in MHz)
* if the AP use 80 + 80 MHz, this is the center frequency of the first segment (in MHz)
*/
public int centerFreq0;
/**
* Only used if the AP bandwidth is 80 + 80 MHz
* if the AP use 80 + 80 MHz, this is the center frequency of the second segment (in MHz)
*/
public int centerFreq1;
/**
* @deprecated use is80211mcResponder() instead
* @hide
*/
public boolean is80211McRTTResponder;
/**
* timestamp in microseconds (since boot) when
* this result was last seen.
*/
public long timestamp;
/**
* Timestamp representing date when this result was last seen, in milliseconds from 1970
* {@hide}
*/
public long seen;
/**
* @hide
* Update RSSI of the scan result
* @param previousRssi
* @param previousSeen
* @param maxAge
*/
public void averageRssi(int previousRssi, long previousSeen, int maxAge) {
if (seen == 0) {
seen = System.currentTimeMillis();
}
long age = seen - previousSeen;
if (previousSeen > 0 && age > 0 && age < maxAge/2) {
// Average the RSSI with previously seen instances of this scan result
double alpha = 0.5 - (double) age / (double) maxAge;
level = (int) ((double) level * (1 - alpha) + (double) previousRssi * alpha);
}
}
/**
* num IP configuration failures
* @hide
*/
public int numIpConfigFailures;
/**
* @hide
* Last time we blacklisted the ScanResult
*/
public long blackListTimestamp;
/**
* Status indicating the scan result does not correspond to a user's saved configuration
* @hide
*/
@SystemApi
public boolean untrusted;
/**
* Number of time we connected to it
* @hide
*/
public int numConnection;
/**
* Number of time autojoin used it
* @hide
*/
public int numUsage;
/**
* The approximate distance to the AP in centimeter, if available. Else
* {@link UNSPECIFIED}.
* {@hide}
*/
public int distanceCm;
/**
* The standard deviation of the distance to the access point, if available.
* Else {@link UNSPECIFIED}.
* {@hide}
*/
public int distanceSdCm;
/** {@hide} */
public static final long FLAG_PASSPOINT_NETWORK = 0x0000000000000001;
/** {@hide} */
public static final long FLAG_80211mc_RESPONDER = 0x0000000000000002;
/*
* These flags are specific to the ScanResult class, and are not related to the |flags|
* field of the per-BSS scan results from WPA supplicant.
*/
/**
* Defines flags; such as {@link #FLAG_PASSPOINT_NETWORK}.
* {@hide}
*/
public long flags;
/**
* sets a flag in {@link #flags} field
* @param flag flag to set
* @hide
*/
public void setFlag(long flag) {
flags |= flag;
}
/**
* clears a flag in {@link #flags} field
* @param flag flag to set
* @hide
*/
public void clearFlag(long flag) {
flags &= ~flag;
}
public boolean is80211mcResponder() {
return (flags & FLAG_80211mc_RESPONDER) != 0;
}
public boolean isPasspointNetwork() {
return (flags & FLAG_PASSPOINT_NETWORK) != 0;
}
/**
* Indicates venue name (such as 'San Francisco Airport') published by access point; only
* available on Passpoint network and if published by access point.
*/
public CharSequence venueName;
/**
* Indicates Passpoint operator name published by access point.
*/
public CharSequence operatorFriendlyName;
/**
* {@hide}
*/
public final static int UNSPECIFIED = -1;
/**
* @hide
*/
public boolean is24GHz() {
return ScanResult.is24GHz(frequency);
}
/**
* @hide
* TODO: makes real freq boundaries
*/
public static boolean is24GHz(int freq) {
return freq > 2400 && freq < 2500;
}
/**
* @hide
*/
public boolean is5GHz() {
return ScanResult.is5GHz(frequency);
}
/**
* @hide
* TODO: makes real freq boundaries
*/
public static boolean is5GHz(int freq) {
return freq > 4900 && freq < 5900;
}
/**
* @hide
* anqp lines from supplicant BSS response
*/
public List