我正在维护一个以 Xamarin 表单 (Android) 编写的应用程序,用于控制 IoT 设备。
我面临的问题与连接到物联网设备的用户为其提供 WiFi 连接凭据有关,以便物联网设备可以通过互联网进行通信。虽然我可以建立与 IoT 设备接入点的连接并推送连接凭据,但当 IoT 设备关闭接入点时,该应用程序似乎失去了连接到互联网的所有能力(无法访问我们的 API 端点)智能手机设备具有完全连接性(我已检查它是否已重新连接到原始网络,并且我可以打开网页)。如果我关闭并重新启动应用程序,一切都会再次正常工作 - 所以非常肯定连接到接入点并返回连接的行为有问题。
我要么在连接方式上做错了什么,要么终止了连接,但我不知所措!
仅供参考,物联网设备在收到 WiFi 连接凭据后将自动关闭接入点。
在项目的主要活动文件中,我有以下代码:
public class WifiConnector : IWifiConnector
{
private Context context = null;
public WifiConnector()
{
this.context = Android.App.Application.Context;
}
NetworkCallback _callback;
public void connect(string ssid, string password)
{
var specifier = new WifiNetworkSpecifier.Builder()
.SetSsid(ssid)
.SetWpa2Passphrase(password)
.Build();
var request = new NetworkRequest.Builder()
.AddTransportType(TransportType.Wifi)
.RemoveCapability(NetCapability.Internet)
.SetNetworkSpecifier(specifier)
.Build();
_callback = new NetworkCallback();
var connectivityManager = Android.App.Application.Context.GetSystemService(
Android.App.Application.ConnectivityService) as Android.Net.ConnectivityManager;
connectivityManager.RequestNetwork(request, _callback);
}
public void disconnect()
{
var connectivityManager = Android.App.Application.Context.GetSystemService(
Android.App.Application.ConnectivityService) as Android.Net.ConnectivityManager;
connectivityManager.UnregisterNetworkCallback(_callback);
}
private class NetworkCallback : ConnectivityManager.NetworkCallback
{
public static Android.Content.Context context = Android.App.Application.Context;
Android.Net.ConnectivityManager connectivityManager = (Android.Net.ConnectivityManager)context.GetSystemService(Android.App.Application.ConnectivityService);
public Action NetworkAvailable { get; set; }
public override void OnAvailable(Network network)
{
base.OnAvailable(network);
connectivityManager.BindProcessToNetwork(network);
Xamarin.Forms.MessagingCenter.Send("OK", "network");
}
public override void OnUnavailable()
{
base.OnUnavailable();
Xamarin.Forms.MessagingCenter.Send("Fail", "network");
}
}
}
我调用 connect 来连接 - 这有效
一旦我推送了 WiFi 凭证,我就会调用断开连接。我已经尝试过不调用断开连接,这没有什么区别。由于我的物联网设备没有互联网功能,我尝试删除此RemoveCapability(NetCapability.Internet),但同样没有区别。
我正在寻找的是让Android设备返回到之前的WiFi状态,并且让我的应用程序实现这一点。
感谢您的帮助。
小小孩子。
我遇到了和你一样的问题,并找到了一种方法来修复代码几个小时。 我希望我的代码能帮助你。
给你一个简单的解释...... 您代码中的 public void connect() 方法没有错误。
但是,我只需要再添加一个过程来断开和重新连接 Wi-Fi。 我花了很长时间才找到这个答案,但希望对你有帮助!
public void DisConnect()
{
var connectivityManager = Android.App.Application.Context.GetSystemService(Android.App.Application.ConnectivityService) as Android.Net.ConnectivityManager;
connectivityManager.UnregisterNetworkCallback(_callback);
bool whileTrigger = false;
IEnumerable<ConnectionProfile> profiles = Connectivity.Current.ConnectionProfiles;
while (!whileTrigger)
{
if (profiles.Contains(ConnectionProfile.WiFi))
{
var request = new NetworkRequest.Builder()
.AddTransportType(TransportType.Wifi)
.RemoveCapability(NetCapability.Internet)
.AddCapability(NetCapability.Trusted)
.AddCapability(NetCapability.NotRestricted)
.RemoveCapability(NetCapability.NotMetered)
.RemoveCapability(NetCapability.NotVpn)
.RemoveCapability(NetCapability.Foreground)
.RemoveCapability(NetCapability.NotCongested)
.RemoveCapability(NetCapability.NotSuspended)
.RemoveCapability(NetCapability.NotRoaming)
.Build();
connectivityManager.RequestNetwork(request, _callback);
whileTrigger = true;
}
if (whileTrigger)
{
MainThread.BeginInvokeOnMainThread(() =>
{
var toast = Toast.Make($"Escape", ToastDuration.Short, 15);
toast.Show();
});
break;
}
Thread.Sleep(500);
MainThread.BeginInvokeOnMainThread(() =>
{
var toast = Toast.Make($"Search Loading", ToastDuration.Short, 15);
toast.Show();
});
}
}
再次添加connectivityManager.RequestNetwork(request, _callback);到 Disconnect() 方法并将其连接回手机默认的 Wi-Fi。
这就是我的解决方案,我希望它有帮助,伙计!