Xamarin Forms / Maui 从 Android 连接和断开到 IoT 设备 WiFi 接入点

问题描述 投票:0回答:1

我正在维护一个以 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状态,并且让我的应用程序实现这一点。

感谢您的帮助。

android xamarin.forms wifi iot
1个回答
0
投票

小小孩子。

我遇到了和你一样的问题,并找到了一种方法来修复代码几个小时。 我希望我的代码能帮助你。

给你一个简单的解释...... 您代码中的 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。

这就是我的解决方案,我希望它有帮助,伙计!

© www.soinside.com 2019 - 2024. All rights reserved.