繁体   English   中英

Android:如何扫描WiFi,连接到AP然后建立TCP连接?

[英]Android: How to Scan WiFi, Connect to an AP and then Establish a TCP Connection?

我正在编写一个Android应用程序。 在我的应用程序中,我希望它扫描WiFi网络,然后通过检查SSID连接到专用的接入点(AP)。 然后,在连接到AP之后,建立与它的TCP连接。

上面我依次描述了3个任务。 我知道如何独立完成每个任务,但是我不知道按顺序完成任务的正确方法。 示例被赞赏。

目前,我的代码是每当用户按下以下按钮时就开始扫描WiFi网络:

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiEnabled() == false) {
    wifiManager.setWifiEnabled(true);
    Toast.makeText(MainActivity.this, "WiFi is enabled", Toast.LENGTH_SHORT).show();
}
wifiManager.startScan();

我使用广播接收器检查扫描何时完成,然后调用方法( ReconnectAP() )将WiFi连接到AP。 我还使用广播接收器检查它何时连接到AP,然后我要执行一个异步任务来建立TCP网络。 但是,通过谷歌搜索,我了解到在广播接收器中执行异步任务是一种不好的做法,因为异步任务可以在接收器完成后被Android杀死。

private String networkSSID = "The_AP_SSID";

// In onCreate of MainActivity, register the broadcast receiver:
registerReceiver(WiFireceiver, new IntentFilter(
            WifiManager.NETWORK_STATE_CHANGED_ACTION));
registerReceiver(WiFireceiver, new IntentFilter(
            WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

// Implement my broadcast receiver class:
BroadcastReceiver WiFireceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {

            Log.d(TAG, "WiFiReceiver received broadcast, action is SCAN_RESULTS_AVAILABLE_ACTION");
            Log.d(TAG, "Start to check if need to reconnect to Charger AP");
            ReconnectAP();

        }

        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {

            Log.d(TAG, "WiFiReceiver received broadcast, action is NETWORK_STATE_CHANGED_ACTION");

            NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            // If the connection type is WiFi...
            if (netInfo != null && ConnectivityManager.TYPE_WIFI == netInfo.getType()) {

                // If it is connected now....
                if (netInfo.isConnected()) {

                    Log.d(TAG, "WiFi connected");

                    // Get WiFi connection information, eg SSID
                    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                    String ssid = wifiInfo.getSSID();

                    Log.d(TAG, "WiFi connected SSID is : " + ssid);

                    if(ssid.equals(networkSSID)) {
                        // Start async task to establish a TCP connection:
                        new ConnectTCPAsynTask().execute();

                    }
                } else {
                    Log.d(TAG, "WiFi disconnected");
                }
            }
        }
    }
};

int ReconnectAP() {

    Log.d(TAG, "In ReconnectAP( )");

    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    String ssid = wifiInfo.getSSID();

    Log.d(TAG, "Original connected AP SSID: " + ssid);

    if (!ssid.equals(networkSSID)) {

        Log.d(TAG, "It is not equal to the dedicated AP SSID, 
                    we will disconnect the current WiFi connection, 
                    and then connect to our dedicate AP");

        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for (WifiConfiguration i : list) {
            if (i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {

                Log.d(TAG, "Start disconnect and reconnect to " + networkSSID);
                wifiManager.disconnect();
                wifiManager.enableNetwork(i.networkId, true);
                wifiManager.reconnect();

                return 1;
            }
        }
        Log.d(TAG,"Reach here if cannot find the target SSID");
        return -1;
    }
    Log.d(TAG, "Reach here if we already connected to the dedicated AP");
    return 0;

}

将标志从广播接收器传递回主要活动,并让主要活动处理任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM