WifiNative.java revision 530040e0b9458994c02f4392765db168128d48da
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pConfig; 2055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pGroup; 2155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pDevice; 22618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriffimport android.text.TextUtils; 2355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.util.Log; 2455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.io.InputStream; 2655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.lang.Process; 2755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.ArrayList; 2855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.List; 2955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Native calls for sending requests to the supplicant daemon, and for 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receiving asynchronous events. All methods of the form "xxxxCommand()" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be single-threaded, to avoid requests and responses initiated 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from multiple threads from being intermingled. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that methods whose names are not of the form "xxxCommand()" do 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not talk to the supplicant daemon. 38a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * Also, note that all WifiNative calls should happen in the 39a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * WifiStateTracker class except for waitForEvent() call which is 40a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * on a separate monitor channel for WifiMonitor 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * TODO: clean up the API and move the functionality from JNI to here. We should 4355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * be able to get everything done with doBooleanCommand, doIntCommand and 4455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * doStringCommand native commands 4555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiNative { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2; 535d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getErrorString(int errorCode); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean loadDriver(); 57a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff 58a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public native static boolean isDriverLoaded(); 595d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean unloadDriver(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean startSupplicant(); 635d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 64f42c39b3d188ebb3ba9003cffc530717829fe874Irfan Sheriff public native static boolean startP2pSupplicant(); 65f42c39b3d188ebb3ba9003cffc530717829fe874Irfan Sheriff 66f42c39b3d188ebb3ba9003cffc530717829fe874Irfan Sheriff /* Does a graceful shutdown of supplicant. Is a common stop function for both p2p and sta. 675d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * 685d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * Note that underneath we use a harsh-sounding "terminate" supplicant command 695d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * for a graceful stop and a mild-sounding "stop" interface 705d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * to kill the process 715d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff */ 725d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff public native static boolean stopSupplicant(); 735d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 745d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff /* Sends a kill signal to supplicant. To be used when we have lost connection 755d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff or when the supplicant is hung */ 7696071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff public native static boolean killSupplicant(); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean connectToSupplicant(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static void closeSupplicantConnection(); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean pingCommand(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 84a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood public native static boolean scanCommand(boolean forceActive); 855d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setScanModeCommand(boolean setActive); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String listNetworksCommand(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int addNetworkCommand(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setNetworkVariableCommand(int netId, String name, String value); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getNetworkVariableCommand(int netId, String name); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean removeNetworkCommand(int netId); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean enableNetworkCommand(int netId, boolean disableOthers); 995d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean disableNetworkCommand(int netId); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean reconnectCommand(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean reassociateCommand(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean disconnectCommand(); 10796071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String statusCommand(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getMacAddressCommand(); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String scanResultsCommand(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean startDriverCommand(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean stopDriverCommand(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 118b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff 119b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff /** 120b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Start filtering out Multicast V4 packets 121b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 122b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff */ 123b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean startFilteringMulticastV4Packets(); 124b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff 125b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff /** 126b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Stop filtering out Multicast V4 packets. 127b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 128b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff */ 129b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean stopFilteringMulticastV4Packets(); 130b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 132b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Start filtering out Multicast V6 packets 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, {@code false} otherwise 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 135b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean startFilteringMulticastV6Packets(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 138b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Stop filtering out Multicast V6 packets. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, {@code false} otherwise 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 141b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean stopFilteringMulticastV6Packets(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setPowerModeCommand(int mode); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14525c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff public native static int getBandCommand(); 14625c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff 14725c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff public native static boolean setBandCommand(int band); 14825c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff 149ea8bd1d1676dd96f8f9726bb8f67fa18dec7b9c1Mikael Kanstrup public native static int getPowerModeCommand(); 150ea8bd1d1676dd96f8f9726bb8f67fa18dec7b9c1Mikael Kanstrup 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the bluetooth coexistence mode. 1535d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode One of {@link #BLUETOOTH_COEXISTENCE_MODE_DISABLED}, 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #BLUETOOTH_COEXISTENCE_MODE_ENABLED}, or 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #BLUETOOTH_COEXISTENCE_MODE_SENSE}. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the mode was successfully set. 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setBluetoothCoexistenceModeCommand(int mode); 160b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 161b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /** 162b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * Enable or disable Bluetooth coexistence scan mode. When this mode is on, 163b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * some of the low-level scan parameters used by the driver are changed to 164b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * reduce interference with A2DP streaming. 165b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * 166b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * @param isSet whether to enable or disable this mode 167b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * @return {@code true} if the command succeeded, {@code false} otherwise. 168b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project */ 169b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public native static boolean setBluetoothCoexistenceScanModeCommand(boolean setCoexScanMode); 1705d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean saveConfigCommand(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean reloadConfigCommand(); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setScanResultHandlingCommand(int mode); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean addToBlacklistCommand(String bssid); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean clearBlacklistCommand(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1815ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff public native static boolean startWpsPbcCommand(String bssid); 1825ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 18302fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff public native static boolean startWpsWithPinFromAccessPointCommand(String bssid, String apPin); 184f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 18502fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff public native static String startWpsWithPinFromDeviceCommand(String bssid); 1865ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 1875876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff public native static boolean setSuspendOptimizationsCommand(boolean enabled); 1885876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff 189ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public native static boolean setCountryCodeCommand(String countryCode); 190ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wait for the supplicant to send an event, returning the event string. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the event string sent by the supplicant. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String waitForEvent(); 196fcc0845cf9990470d498dcaa036f0ae6487ddf34Irfan Sheriff 1972b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff public native static void enableBackgroundScanCommand(boolean enable); 1982b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff 1992b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff public native static void setScanIntervalCommand(int scanInterval); 20055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 20155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private native static boolean doBooleanCommand(String command); 20255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 20355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private native static int doIntCommand(String command); 20455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 20555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private native static String doStringCommand(String command); 20655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 207921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff /** Example output: 208921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff * RSSI=-65 209921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff * LINKSPEED=48 210921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff * NOISE=9999 211921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff * FREQUENCY=0 212921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff */ 213921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff public static String signalPoll() { 214921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff return doStringCommand("SIGNAL_POLL"); 215921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff } 216921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff 2172b8edd0c485f74067605c19983e3e7f44b20ec50repo sync public static boolean wpsPbc() { 2182b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("WPS_PBC"); 2192b8edd0c485f74067605c19983e3e7f44b20ec50repo sync } 2202b8edd0c485f74067605c19983e3e7f44b20ec50repo sync 2212b8edd0c485f74067605c19983e3e7f44b20ec50repo sync public static boolean wpsPin(String pin) { 2222b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("WPS_PIN any " + pin); 2232b8edd0c485f74067605c19983e3e7f44b20ec50repo sync } 2242b8edd0c485f74067605c19983e3e7f44b20ec50repo sync 2259322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff public static boolean setPersistentReconnect(boolean enabled) { 2269322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff int value = (enabled == true) ? 1 : 0; 2279322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff return WifiNative.doBooleanCommand("SET persistent_reconnect " + value); 2289322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 2299322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff 2309322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff public static boolean setDeviceName(String name) { 2319322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff return WifiNative.doBooleanCommand("SET device_name " + name); 2329322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 2339322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff 2349322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff public static boolean setDeviceType(String type) { 2359322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff return WifiNative.doBooleanCommand("SET device_type " + type); 2369322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 2379322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff 238618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public static boolean setConfigMethods(String cfg) { 239618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return WifiNative.doBooleanCommand("SET config_methods " + cfg); 240618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 241618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 242530040e0b9458994c02f4392765db168128d48daIrfan Sheriff public static boolean setP2pSsidPostfix(String postfix) { 243530040e0b9458994c02f4392765db168128d48daIrfan Sheriff return WifiNative.doBooleanCommand("SET p2p_ssid_postfix " + postfix); 244530040e0b9458994c02f4392765db168128d48daIrfan Sheriff } 245530040e0b9458994c02f4392765db168128d48daIrfan Sheriff 24655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pFind() { 2472b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_FIND"); 24855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 24955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 25055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pFind(int timeout) { 25155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (timeout <= 0) { 25255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return p2pFind(); 25355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 2542b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_FIND " + timeout); 25555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 25655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 25755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pListen() { 2582b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_LISTEN"); 25955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 26055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 26155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pListen(int timeout) { 26255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (timeout <= 0) { 26355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return p2pListen(); 26455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 2652b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_LISTEN " + timeout); 26655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 26755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 26855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pFlush() { 2692b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_FLUSH"); 27055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 27155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 27255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /* p2p_connect <peer device address> <pbc|pin|PIN#> [label|display|keypad] 27355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync [persistent] [join|auth] [go_intent=<0..15>] [freq=<in MHz>] */ 274ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff public static String p2pConnect(WifiP2pConfig config, boolean joinExistingGroup) { 27555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (config == null) return null; 27655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync List<String> args = new ArrayList<String>(); 277651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff WpsInfo wps = config.wps; 27855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add(config.deviceAddress); 27955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2806f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff switch (wps.setup) { 281651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WpsInfo.PBC: 28255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("pbc"); 28355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 284651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WpsInfo.DISPLAY: 285618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (TextUtils.isEmpty(wps.pin)) { 286618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff args.add("pin"); 287618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 288618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff args.add(wps.pin); 289618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 29055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("display"); 29155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 292651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WpsInfo.KEYPAD: 2936f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff args.add(wps.pin); 29455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("keypad"); 29555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 296651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WpsInfo.LABEL: 2976f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff args.add(wps.pin); 29855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("label"); 29955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 30055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 30155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 30255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 303f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff //TODO: Add persist behavior once the supplicant interaction is fixed for both 304f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff // group and client scenarios 305ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff /* Persist unless there is an explicit request to not do so*/ 306f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff //if (config.persist != WifiP2pConfig.Persist.NO) args.add("persistent"); 307f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff 308ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (joinExistingGroup) args.add("join"); 30955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 3102b8edd0c485f74067605c19983e3e7f44b20ec50repo sync int groupOwnerIntent = config.groupOwnerIntent; 3112b8edd0c485f74067605c19983e3e7f44b20ec50repo sync if (groupOwnerIntent < 0 || groupOwnerIntent > 15) { 3122b8edd0c485f74067605c19983e3e7f44b20ec50repo sync groupOwnerIntent = 3; //default value 3132b8edd0c485f74067605c19983e3e7f44b20ec50repo sync } 3142b8edd0c485f74067605c19983e3e7f44b20ec50repo sync args.add("go_intent=" + groupOwnerIntent); 31555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 3162b8edd0c485f74067605c19983e3e7f44b20ec50repo sync String command = "P2P_CONNECT "; 31755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (String s : args) command += s + " "; 31855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 3192b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doStringCommand(command); 32055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 322651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff public static boolean p2pCancelConnect() { 323651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff return doBooleanCommand("P2P_CANCEL"); 324651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 325651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 326618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public static boolean p2pProvisionDiscovery(WifiP2pConfig config) { 327618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (config == null) return false; 328618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 329618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (config.wps.setup) { 330618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.PBC: 331618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " pbc"); 332618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.DISPLAY: 333618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //We are doing display, so provision discovery is keypad 334618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " keypad"); 335618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.KEYPAD: 336618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //We are doing keypad, so provision discovery is display 337618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " display"); 338618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 339618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 340618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 341618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return false; 342618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 343618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 34455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pGroupAdd() { 3452b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_GROUP_ADD"); 34655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 34755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 34855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pGroupRemove(String iface) { 34955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (iface == null) return false; 3502b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_GROUP_REMOVE " + iface); 35155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 35255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 35355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pReject(String deviceAddress) { 3542b8edd0c485f74067605c19983e3e7f44b20ec50repo sync return doBooleanCommand("P2P_REJECT " + deviceAddress); 35555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 35655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 35755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /* Invite a peer to a group */ 35855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pInvite(WifiP2pGroup group, String deviceAddress) { 359ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (deviceAddress == null) return false; 360ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 361ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (group == null) { 362ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return doBooleanCommand("P2P_INVITE peer=" + deviceAddress); 363ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 364ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return doBooleanCommand("P2P_INVITE group=" + group.getInterface() 365ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff + " peer=" + deviceAddress + " go_dev_addr=" + group.getOwner().deviceAddress); 366ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 367ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 368ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 369ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff /* Reinvoke a persistent connection */ 370ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff public static boolean p2pReinvoke(int netId, String deviceAddress) { 371ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (deviceAddress == null || netId < 0) return false; 372ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 373ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return doBooleanCommand("P2P_INVITE persistent=" + netId + " peer=" + deviceAddress); 37455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 3758c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync 376ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 3778c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync public static String p2pGetInterfaceAddress(String deviceAddress) { 3788c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync if (deviceAddress == null) return null; 3798c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync 3808c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync // "p2p_peer deviceAddress" returns a multi-line result containing 3818c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync // intended_addr=fa:7b:7a:42:82:13 3828c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync String peerInfo = p2pPeer(deviceAddress); 3838c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync if (peerInfo == null) return null; 3848c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync String[] tokens= peerInfo.split("\n"); 3858c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync 3868c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync for (String token : tokens) { 3878c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync //TODO: update from interface_addr when wpa_supplicant implementation is fixed 3888c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync if (token.startsWith("intended_addr=")) { 3898c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync String[] nameValue = token.split("="); 3908c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync if (nameValue.length != 2) break; 3918c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync return nameValue[1]; 3928c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync } 3938c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync } 3948c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync return null; 3958c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync } 3968c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync 3974be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public static String p2pGetDeviceAddress() { 3984be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff String status = statusCommand(); 3994be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff if (status == null) return ""; 4004be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 4014be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff String[] tokens = status.split("\n"); 4024be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff for (String token : tokens) { 4034be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff if (token.startsWith("p2p_device_address=")) { 4044be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff String[] nameValue = token.split("="); 4054be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff if (nameValue.length != 2) break; 4064be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return nameValue[1]; 4074be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 4084be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 4094be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff return ""; 4104be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 4114be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 4128c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync public static String p2pPeer(String deviceAddress) { 4138c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync return doStringCommand("P2P_PEER " + deviceAddress); 4148c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 416