2017-03-09 91 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後,我知道我必須用設置對象替換空值,但我完全不知道如何在Unity中執行此操作。

+0

你是非常接近的。該參數有點不對。檢查問題。 – Programmer

+0

@程序員**這不是重複的**。 OP詢問打開熱點(AP)而不是WiFi。 –

+0

我的不好。沒有看到熱點部分。 – Programmer

回答

2

EASY方式:

嘗試實例化WifiConfiguration第一:

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

現在你可以調用方法和設置/這個對象中獲取字段:

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

設置完所有必填字段後,請致電setWifiApEnabled方法:

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

也許你會設置一個比這兩個領域,但以確認您應檢查source保證什麼setWifiApEnabled方法做internaly。


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:

我試圖找出爲什麼上面的代碼可能無法正常工作,但對我來說這是工作好(測試

所以從一開始

在一些虛擬機和三星Galaxy S5 Neo上)

可能是什麼情況(我幾乎在午夜發現)是一個密碼。
根據所部this wikipedia articleWPA-PSK

也被稱爲WPA-PSK(預共享密鑰)模式下,此被設計用於家庭和小型辦公室網絡,並且不需要一個認證服務器。[9]每個無線網絡設備使用256位密鑰加密網絡流量。該密鑰可以作爲一串64個十六進制數字輸入,也可以作爲8到63個可打印ASCII字符的密碼輸入。如果使用ASCII字符,所述256位的密鑰是通過將PBKDF2密鑰推導函數的密碼,使用SSID作爲鹽和HMAC-SHA1的4096次迭代計算。[11] WPA-個人模式可與WPA和WPA2)。

我的建議是使用相同的密碼作爲上面鏈接,以確保它是有效的文章。

還有一點需要注意的是SSID部分有一個簡短但很好的描述here on wikipedia

一個常見的,儘管不正確的假設是,一個SSID是人類可讀的字符(例如ASCII),由一個NUL字符結束的字符串(如在C-字符串)。的SSID必須進行處理和處置,因爲它們是什麼,0-32個字節,其中一些可能不是人類可讀

從我查了順序,你不需要用空字符結束的Java或C#中的字符串,因爲它將由本機代碼處理,但仍不應超過31個字符(32將爲空字符)。

我檢查這個搭配:
SSIDMeHotSpot
WPA-PSK:5260305714217573

+1

這將是值得知道爲什麼有人低估了這一點。 –

+0

我明白了爲什麼你得到了downvote。這不應該工作。 'setWifiApEnabled'是一個隱藏的函數,甚至沒有記錄。它需要反思才能工作,所以你現在擁有的東西將無法工作。我可能是錯的,但有幾個過程來執行這個工作,比如使用'Method'類... – Programmer

+0

@Programmer這可能是正確的,但我根據[this source](https://android.googlesource。 COM /平臺/框架/ base.git/+/Android的4.2.2_r1 /服務/ JAVA/COM /安卓/服務器/ WifiService.java)。但如果真的需要反思,還是等待一些反饋。我將在需要時編輯我的答案。 –