C# 以编程方式打开/关闭WiFi热点
我需要帮助创建一个C#脚本,将android WiFi设置为热点模式。下面是我设法创建的代码C# 以编程方式打开/关闭WiFi热点,c#,android,unity3d,hotspot,C#,Android,Unity3d,Hotspot,我需要帮助创建一个C#脚本,将android WiFi设置为热点模式。下面是我设法创建的代码 public bool setAPEnabled(bool enabled) { using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity")) {
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;
}
public bool setAPEnabled(bool启用)
{
使用(AndroidJavaObject activity=new AndroidJavaClass(“com.unity3d.player.UnityPlayer”).GetStatic我知道我必须用settings对象替换我的null值,但我完全不知道如何在Unity中实现它。这些方法仅适用于android 5.0及以下版本!
简单的方法是:
尝试实例化第一个:
现在,您可以在此对象中调用方法和设置/获取字段:
// to set SSID
wifiConfiguration.Set("SSID", meSSID); // string
wifiConfiguration.Set("preSharedKey", mePassword); // string
设置完所有必填字段后,只需调用setWifiApEnabled
方法:
wifiManager.Call<bool>("setWifiApEnabled", wifiConfiguration, enabled);
接线配置:
我试图找出为什么上面的代码可能不工作,但对我来说,它工作正常(在一些虚拟机和三星Galaxy S5 Neo上进行了测试)
可能的情况是(我在将近午夜时发现)一个密码短语。
根据关于WPA-PSK的章节
也称为WPA-PSK(预共享密钥)模式,该模式专为家庭和小型办公室网络设计,不需要身份验证服务器。[9]每个无线网络设备使用256位密钥加密网络流量。该密钥可以作为64位十六进制数字的字符串输入,也可以作为8到63个可打印ASCII字符的密码短语输入。[10]如果使用ASCII字符,则通过将PBKDF2密钥派生函数应用于密码短语来计算256位密钥,将SSID用作salt,HMAC-SHA1的4096次迭代。[11]WPA个人模式可用于WPA和WPA2。)
我的建议是使用与上面链接的文章相同的密码短语,以确保其有效
另一件需要注意的事情是SSID部分,它有一个简短但良好的描述
一个常见但不正确的假设是,SSID是由人类可读的字符(如ASCII)组成的字符串,以NUL字符(如在C字符串中)结尾。SSID必须按原样处理,即0–32个八位字节的序列,其中一些可能不是人类可读的
根据我的检查,您不需要在Java或C#中使用null终止字符串,因为它将由本机代码处理,但仍然不应超过31个字符(32个字符为null)
我用:
SSID:MeHotSpot
WPA-PSK:5260305714217573非常接近。参数稍有错误。请检查问题。@程序员这不是重复的。OP询问关于打开热点(AP)而且不是WiFi。我的错。没有看到热点部分。值得知道的是为什么有人否决了这一点。我知道为什么你得到了否决票。这不应该起作用。setWifiApEnabled
是一个隐藏函数,甚至没有文档记录。它需要反射才能起作用,所以你现在拥有的东西将不起作用。我可能错了,但还有几个过程要处理请像使用方法
类…@程序员一样完成这项工作。这可能是正确的,但我的回答是一致的。但如果它真的需要反思或不需要反思,我仍在等待一些反馈。我会在需要时编辑我的答案。@m.rogalski非常感谢您的帮助。我根据您的说明修改了代码-在unity中有no错误,但安装后,应用程序在启动热点后关闭。是否指定了写入设置和更改连接的权限?
这应该可以在项目设置中更改。
wifiManager.Call<bool>("setWifiApEnabled", wifiConfiguration, enabled);
// 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);
}
}
}
}
}