2017-03-09 1 views
2

핫스팟 모드에서 android 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

당신은 매우 가까웠다 :
SSID : MeHotSpot
WPA-PSK

나는 이것을 확인. 매개 변수가 약간 잘못되었습니다. 질문을 확인하십시오. – Programmer

+0

@Programmer ** 이것은 중복되지 않습니다 **. OP는 WiFi가 아닌 핫스팟 (AP) 켜는 것에 대해 질문했습니다. –

+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); 

어쩌면이 두 가지보다 더 많은 필드를 설정해야합니다 있지만 source을 확인하고 setWifiApEnabled 방법은 internaly 무엇을 확인해야합니다 확인 할 수 있습니다.


HARD 방법 :
당신이 모든 객체를 처리하는 것을 기억해야하기 때문에 조금 까다로울 수있다 AndroidJavaObject과 반사를 사용 (사용 반사 코드)

.


이 WifiConfiguration

// 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); 
       } 
      } 
     } 
    } 
} 
을 :

나는 위의 코드가 작동하지 않을 이유를 찾기 위해 노력했지만 나를 위해 괜찮 작업했다가 (테스트 그래서 처음부터

일부 가상 머신 및 Samsung Galaxy S5 Neo).

(거의 자정에 알았습니다)은 암호입니다. 대한 WPA-PSK

은 또한 WPA-PSK (사전 공유 키) 모드로 언급 된 부분에 this wikipedia article에 따르면
이는 가정 및 소규모 사무실 네트워크 용으로 설계되어 필요하지 않습니다 인증 서버. [9] 각 무선 네트워크 장치는 256 비트 키를 사용하여 네트워크 트래픽을 암호화합니다. 이 키는 64 자리 16 진수의 문자열 또는 8 ~ 63 자의 인쇄 가능한 ASCII 문자의 암호로 입력 할 수 있습니다. [10] ASCII 문자를 사용하는 경우 256 비트 키는 소금으로 SSID를 사용하고 HMAC-SHA1을 4096 반복하여 PBKDF2 키 유도 함수를 암호문에 적용하여 계산합니다.[11] WPA 개인 모드는 WPA와 WPA2를 모두 사용할 수 있습니다.)

내 제안이 유효 확실하게 위의 링크 된 기사에서와 동일한 암호를 사용하는 것입니다.

또 다른 주목할 점은 SSID 부분이 짧지 만 좋은 설명 here on wikipedia입니다.

일반적인 잘못된 가정이기는하지만, SSID를가 NUL 문자로 종료 사람이 읽을 수있는 문자 (ASCII와 같은)의 문자열 (A C-문자열로) 것입니다. SSID를가 그들이 무엇으로 취급하고 처리해야합니다, 제가 확인한 바로는

사람이 읽을 수 없습니다 일부 0-32 옥텟의 순서는 당신이 할 필요가 없습니다 당신을 NULL로 종료 문자열은 Java 또는 C#에서 고유 코드에 의해 처리되지만 여전히 31자를 초과해서는 안되기 때문에 (32 자 수가 널 문자가됩니다). 5260305714217573

+1

누군가가 왜 이것을 downvoted하는지 알 가치가있을 것입니다. –

+0

나는 왜 당신이 downvote있어 알아. 이것은 작동하지 않아야합니다. 'setWifiApEnabled'는 숨겨진 함수이며 문서화되지 않았습니다. 그것은 반사 작용이 필요하므로 지금하는 일이 효과가 없을 것입니다. 나는 틀릴 수도 있지만'Method' 클래스를 사용하는 것과 같이이 작업을 수행하는 데 더 많은 프로세스가 있습니다. ... – Programmer

+0

@Programmer 정확할 수도 있지만 [this source] (https : //android.googlesource. com/platform/frameworks/base.git/+/android-4.2.2_r1/services/java/co.kr/android/server/WifiService.java)를 사용하십시오. 그러나 실제로 반영이 필요한지 아닌지에 대한 의견을 기다리고 있습니다. 내 대답은 필요할 때 편집 할 것입니다. –

관련 문제