开启/关闭WiFi热点编程

问题描述:

我需要创建设置热点模式下的机器人的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

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)。但如果真的需要反思,还是等待一些反馈。我将在需要时编辑我的答案。 –