开启/关闭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中执行此操作。
的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 article约WPA-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将为空字符)。
我检查这个搭配:
SSID:MeHotSpot
WPA-PSK:5260305714217573
这将是值得知道为什么有人低估了这一点。 –
我明白了为什么你得到了downvote。这不应该工作。 'setWifiApEnabled'是一个隐藏的函数,甚至没有记录。它需要反思才能工作,所以你现在拥有的东西将无法工作。我可能是错的,但有几个过程来执行这个工作,比如使用'Method'类... – Programmer
@Programmer这可能是正确的,但我根据[this source](https://android.googlesource。 COM /平台/框架/ base.git/+/Android的4.2.2_r1 /服务/ JAVA/COM /安卓/服务器/ WifiService.java)。但如果真的需要反思,还是等待一些反馈。我将在需要时编辑我的答案。 –
你是非常接近的。该参数有点不对。检查问题。 – Programmer
@程序员**这不是重复的**。 OP询问打开热点(AP)而不是WiFi。 –
我的不好。没有看到热点部分。 – Programmer