2017-03-09 13 views
2

ホットスポットモードでアンドロイドWiFiを設定するC#スクリプトを作成する際に助けが必要です。ここで私が作成したコードがあります。プログラムでWiFiホットスポットをオン/オフにする

public bool setAPEnabled(bool enabled) 
{ 
    using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity")) 
    { 
     try 
     { 
      if(isWifiEnabled()==true){ 
       setWifiEnabled(false); 
      } 
      using (var wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi")) 
      { 
       return wifiManager.Call<bool>("setWifiApEnabled",null, enabled); 
      } 
     } 
     catch (Exception e) 
     { 
     } 
    } 
    return false; 
} 

すべてがうまくいきますが、SSIDとパスワードの設定に問題があります。 documentationを見直した後、null値を設定オブジェクトに置き換えなければならないことは知っていますが、Unityでそれを行う方法は完全に分かりません。

+0

をあなたは非常に接近していました。パラメータは少し間違っています。質問を確認してください。 – Programmer

+0

@Programmer **これは複製ではありません**。 OPはホットスポット(AP)をオンにし、WiFiをオンにすることについて尋ねた。 –

+0

私の悪いです。ホットスポットの部分が見えませんでした。 – Programmer

答えて

2

EASY方法:

WifiConfiguration最初のインスタンス化してみてください。

// to set SSID 
wifiConfiguration.Set("SSID", meSSID); // string 
wifiConfiguration.Set("preSharedKey", mePassword); // string 

AndroidJavaObject wifiConfiguration = new AndroidJavaClass("android.net.wifi.WifiConfiguration"); 

は今、あなたは、このオブジェクト内のフィールドを取得するメソッドを呼び出し、/設定することができます必要なフィールドをすべて設定したら、に電話してください方法:

wifiManager.Call<bool>("setWifiApEnabled", wifiConfiguration, enabled); 

たぶん、あなたはこれらの2以上のフィールドを設定することができますが、sourceをチェックし、setWifiApEnabled方法は、内部的何をするかを確認しなければならないことを確認する必要があります。


HARD方法:あなたはすべてのオブジェクトを配置するために覚えておく必要があるため
(反射コードを使用して)

AndroidJavaObjectとリフレクションを使用しては少し注意が必要です。最初からそう

// android code for that should look like : 
// wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); 

// but in Unity C# you have to split this into few chunks: 
// 1. Get calling class : 
using (AndroidJavaObject classObj = wifiManager.Call<AndroidJavaObject>("getClass")) 
{ 
    // classObj should contains your class object 
    // 2. call get WifiConfiguration class details : 
    using (AndroidJavaObject wifiConfiguration = new AndroidJavaObject("setWifiApEnabled")) 
    { 
     // 3. Fill that object : 
     wifiConfiguration.Set("SSID", meSSID); // string 
     wifiConfiguration.Set("preSharedKey", mePassword); // string 
     // 4. Get WifiConfiguration class definition 
     using (AndroidJavaObject wifiCfgClass = wifiConfiguration.Call<AndroidJavaObject>("getClass")) 
     { 
      // 5. Get boolean definition 
      using (AndroidJavaObject booleanObj = new AndroidJavaObject("java.lang.Boolean")) 
      { 
       using (AndroidJavaObject booleanClass = booleanObj.Call<AndroidJavaObject>("getClass")) 
       // 6. Get method definition 
       using (AndroidJavaObject methodObj = classObj.Call<AndroidJavaObject>("getMethod", "setWifiApEnabled", wifiCfgClass , booleanClass) 
       { 
        // 7. Call that method :) 
        methodObj.Call("invoke", wifiManager, wifiConfiguration, enabled); 
       } 
      } 
     } 
    } 
} 

WifiConfiguration:

テスト(私は上記のコードは動作しない場合があります理由を見つけるためにしようとしていた私にとって、それは大丈夫を働いていました一部の仮想マシンとSamsung Galaxy S5 Neo)

場合によっては(これはほぼ真夜中にわかりました)はパスフレーズです。およそWPA-PSK

はまた、WPA-PSK(事前共有キー)モードと呼ばれるセクションでthis wikipedia articleによると
、これは、家庭や小規模オフィスのネットワーク用に設計されており、必要としません認証サーバ。[9]各無線ネットワークデバイスは、256ビットのキーを使用してネットワークトラフィックを暗号化します。このキーは、64桁の16進数の文字列、または8〜63文字の印刷可能なASCII文字のパスフレーズとして入力できます。[10] ASCII文字が使用されている場合、PBKDF2キー導出関数をパスフレーズに適用してSSIDをソルトとして使用し、HMAC-SHA1の4096回の反復を使用して256ビットのキーを計算します。[11] WPAパーソナルモードはWPAとWPA2の両方で使用可能です。)

私の提案は、それが有効だことを確認するために、上記のリンク先の記事と同じパスフレーズを使用することです。

もう1つ注意すべき点は、SSID部分ですが、説明は簡潔ですが説明はhere on wikipediaです。

共通、間違った仮定はいえ、SSIDはNUL文字で終了し、人間が読める文字(ASCIIなど)、の文字列は(C文字列のように)であるということです。 SSIDが、彼らが何であるかのように私はあなたがnullで終了するためにあなたの必要はありません確認してきたものから、人間が読める

ではないかもしれないそのうちのいくつかは0から32オクテットのシーケンス処理し、処理しなければなりませんネイティブコードで処理されるため、JavaまたはC#内の文字列を使用できますが、31文字を超えることはできません(32文字はnull文字になります)。

私は、このチェック:
SSIDMeHotSpot
WPA-PSK:5260305714217573

+1

誰かがこれをなぜ落としたのかを知る価値があります。 –

+0

私はあなたがdownvoteを得た理由を見る。これは動作しません。 'setWifiApEnabled'は隠された関数であり、文書化されていません。あなたは今働いているものがうまくいかないように、リフレクションが必要です。私は間違っているかもしれませんが、 'Method'クラスのようにこの作業を行うために実行するプロセスはいくつかあります。 – Programmer

+0

@Programmerこれは正しいかもしれませんが、私は[this source](https://android.googlesource)に答えました。 com/platform/frameworks/base.git/+/android-4.2.2_r1/services/java/com/android/server/WifiService.java)にアクセスしてください。しかし、本当に反射が必要な場合は、フィードバックを待っています。それが必要になったら私の答えを編集します。 –

関連する問題