1

ネットワーク経由でカスタム ハードウェアに接続する Android アプリに取り組んでいます。

ワイヤレス アクセス ポイントを使用するように設定すると、正常に動作します。デバイスのアクセス ポイントを使用するように設定した場合 (別名テザリング)、正常に動作します。アドホック ネットワークを使用するように設定すると、機能しません。Android は「IP アドレスの取得」ステップで失敗します。

私たちの回避策は、静的 IP アドレスを使用することでした。タブレットをカスタム ハードウェアに接続し、カスタム サブネット マスクと IP アドレスを強制すると、すぐに接続されます。

しかし、それはあまりにも混乱しています。DHCP または GTFO。私たちのソリューションは、カスタム ネットワーク マネージャーを使用し、アドホック ネットワークの場合は、静的 IP アドレスを自動的に強制します。これはうまくいくはずです。

私はこのリンクの指示に従いました(いくつかの変更を加えて)、完全に機能します。ネットワークを選択して静的 IP アドレスを割り当てるだけです。Android タブレットがネットワークに接続されません。ただし、「実際の」wifi マネージャーの下のネットワークを見て、「設定の変更」を選択すると、すべての静的 IP アドレス情報が保存されている場所を確認できます。繋がらないだけです。

私の悲惨さに加えて、ネットワークを削除し、Android WiFiマネージャーに移動して情報を手動で入力すると、機能します. ただし、プログラムで同じ手順を実行する場合はそうではありません。

これがなぜなのか、またはそれを修正する方法を誰かが知っていますか? これは根ざしたnexus 7上にあります。

前もって感謝します。

public void connectToWiFiNetwork(String networkSSID, String networkPass, String type)
{
    //Make sure a password is set
    if(networkPass != null && networkPass.length() == 0)
        return;

    WifiConfiguration conf = new WifiConfiguration();
    conf.SSID = "\"" + networkSSID + "\"";   // Please note the quotes. String should contain ssid in quotes
    conf.status = WifiConfiguration.Status.ENABLED;
    int id = -1;

    if(type.contains("WPA")) {

        conf.preSharedKey = "\""+ networkPass +"\"";
        //conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        System.out.println("Contains WPA");

    } else if (type.contains("WEP")) {

        conf.wepKeys[0] = "\"" + networkPass + "\"";
        conf.wepTxKeyIndex = 0;
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        System.out.println("Contains WEP");

    } else {
        //open network?
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        System.out.println("Open WiFi");
    }



    if(type.contains("IBSS"))
    {
        //Adhoc network. Provide an IP address to prevent... stuff.

        //For Android 2.x
        //final ContentResolver cr = this.context.getContentResolver();
        //Settings.System.putInt(cr, Settings.System.WIFI_USE_STATIC_IP, 1);
        //Settings.System.putString(cr, Settings.System.WIFI_STATIC_IP, "169.254.1.1");
        //Settings.System.putString(cr, Settings.System.WIFI_STATIC_NETMASK, "255.255.0.0");



        try{
            //Some code here isn't used... 
            WifiConfiguration wifiConf = null;
            WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);

            WifiInfo connectionInfo = wifiManager.getConnectionInfo();
            List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
            for (WifiConfiguration conf2 : configuredNetworks){
                if (conf2.networkId == connectionInfo.getNetworkId()){
                    wifiConf = conf2;
                    break;
                }
            }

            wifiConf = conf;

            setIpAssignment("STATIC", wifiConf); //or "DHCP" for dynamic setting
            Log.d("CONNECTION", "Connecting now using a static IP address");
            setIpAddress(InetAddress.getByName("169.254.1.1"), 24, wifiConf);
            Log.d("CONNECTION", "Connecting now using a static IP address");
            setGateway(InetAddress.getByName("255.255.0.0"), wifiConf);
            Log.d("CONNECTION", "Connecting now using a static IP address");
            setDNS(InetAddress.getByName("8.8.8.8"), wifiConf);
            Log.d("CONNECTION", "Connecting now using a static IP address");
            //wifiManager.updateNetwork(wifiConf); //apply the setting
            Log.d("CONNECTION", "Connecting now using a static IP address");

        }catch(Exception e){
            e.printStackTrace();
        }
    }

    id = wifi.addNetwork(conf);
    wifi.saveConfiguration();

    //Add the network

    //And enable it

    List<WifiConfiguration> list = wifi.getConfiguredNetworks();
    for( WifiConfiguration i : list ) {
        if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
            wifi.disconnect();
            wifi.enableNetwork(i.networkId, true);
            wifi.reconnect();
            break;
        }
    }




    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("auto_start_tethering", false);
    editor.commit();

    Log.d("CONNECTION", "Connecting using " + networkSSID + " and " + networkPass + ".");
}
4

0 に答える 0