จะเชื่อมต่อกับเครือข่ายท้องถิ่นก่อนแทนอินเทอร์เน็ตในแอป C # Xamarin Android ได้อย่างไร

ฉันมีแอป Xamarin สำหรับ Android มันเชื่อมต่อกับ “ไม่มีเราเตอร์ Wifi ที่ใช้อินเทอร์เน็ต” สำหรับอุปกรณ์ IOT บางตัว แต่ยังจำเป็นต้องใช้ข้อมูลมือถือของมือถือในการจัดเก็บข้อมูลบางอย่างบน Dropbox

ตอนนี้มันทำงานดังนี้:

  1. ฉันสามารถเปิด/ปิดการเชื่อมต่อ Wifi โดยทางโปรแกรม
  2. ฉันไม่สามารถเปิด/ปิดข้อมูลเซลลูลาร์ได้ (ตั้งแต่ Android L) ไม่ได้รับอนุญาตบนอุปกรณ์ที่ไม่ได้รูท
  3. เมื่อโทรศัพท์ของฉันเชื่อมต่อกับเราเตอร์ Wifi ในพื้นที่นี้และข้อมูลเซลลูลาร์เปิดอยู่ด้วย วิธีการทำงานของ Android เป็นค่าเริ่มต้น จะใช้อินเทอร์เน็ตจากการเชื่อมต่อเซลลูลาร์ และการโทรไปยัง Dropbox ทั้งหมดของฉันทำงานได้โดยไม่มีปัญหาใดๆ
  4. แต่การตั้งค่าเป็นเซลลูลาร์เมื่อ Wifi ในพื้นที่ไม่มีอินเทอร์เน็ตทำให้แอปของฉันไม่สามารถเชื่อมต่อกับอุปกรณ์ในเครื่องได้ สมมติว่าอุปกรณ์เครื่องหนึ่งของฉันกำลังฟังบน IP 192.168.2.3 บนพอร์ต 9000 เมื่อฉันพยายามเชื่อมต่อกับอุปกรณ์นั้น รหัสของฉันก็ค้นหาผ่านข้อมูลเซลลูลาร์และส่งคืนโฮสต์ที่ไม่พบ
  5. มีวิธีเชื่อมต่อกับอุปกรณ์ท้องถิ่นในสถานการณ์นี้หรือไม่?
  6. เพื่อเป็นวิธีแก้ปัญหา ฉันได้จัดเตรียมป๊อปอัปโมดอลด้วยตนเองเพื่อแนะนำให้ผู้ใช้ปิดการใช้งานเซลลูล่าร์เมื่อการโทรจาก Dropbox ที่ "ไม่ใช่" เช่น จำเป็นต้องมีการเชื่อมต่อกับอุปกรณ์ IOT แต่นี่ไม่ใช่ประสบการณ์การใช้งานที่ดีเนื่องจากผู้ใช้ต้องเปลี่ยนเครือข่ายด้วยตนเอง ฉันต้องการให้โค้ดจัดการสิ่งนี้ในลักษณะที่โปร่งใสยิ่งขึ้น

กรุณาแนะนำ.


person Pawan Pillai    schedule 13.06.2019    source แหล่งที่มา


คำตอบ (3)


หลังจากพยายามและล้มเหลวมาหลายครั้ง ฉันสามารถนำแนวทางที่ให้ไว้ที่นี่ไปใช้: ลิงก์ Stackoverflow

ฉันเปลี่ยนโค้ดนี้จาก Java เป็น Xamarin C# และสามารถบังคับให้ Cellular หรือ Wifi เป็นเครือข่ายที่ต้องการโดยทางโปรแกรมได้

การใช้งานของฉัน:

using Android.Net;
public SomeClass{
    public static Context _context = Android.App.Application.Context;

    ....

    /// <summary>
    /// Forces the wifi over cellular.
    /// </summary>
    public static void ForceWifiOverCellular()
    {
        ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);

        NetworkRequest.Builder request = new NetworkRequest.Builder();
        request.AddTransportType(TransportType.Wifi);

        var callback = new ConnectivityManager.NetworkCallback();
        connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());

    }

    /// <summary>
    /// Forces the cellular over wifi.
    /// </summary>
    public static void ForceCellularOverWifi()
    {
        ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);

        NetworkRequest.Builder request = new NetworkRequest.Builder();
        request.AddTransportType(TransportType.Cellular);

        connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());
    }
}


/// <summary>
/// Custom network available call back.
/// </summary>
public class CustomNetworkAvailableCallBack : ConnectivityManager.NetworkCallback
{
    public static Context _context = Android.App.Application.Context;

    ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);

    public override void OnAvailable(Network network)
    {
        //ConnectivityManager.SetProcessDefaultNetwork(network);    //deprecated (but works even in Android P)
        connection_manager.BindProcessToNetwork(network);           //this works in Android P
    }
}

การใช้งาน:

  1. ในกรณีที่ฉันต้องบังคับ Cellular เพียงโทร:

SomeClass.ForceCellularOverWifi();

  1. จุดที่ฉันต้องบังคับ Wifi เพียงโทร:

SomeClass.ForceWifiOverCellular();

หวังว่านี่จะช่วยผู้อื่นได้

person Pawan Pillai    schedule 14.06.2019

วิธีแก้ปัญหาที่ฉันคิดได้คือคุณสามารถลองใช้ Xamarin.Essentials และตรวจสอบโปรไฟล์ของการเชื่อมต่อ และใช้สิ่งนี้เพื่อบังคับคำขอไปยัง Wifi ของคุณและคำขออื่น ๆ ผ่านข้อมูลมือถือ

var profiles = Connectivity.ConnectionProfiles;
if (profiles.Contains(ConnectionProfile.WiFi))
{
    // Active Wi-Fi connection.
}

คุณสามารถดูเอกสารประกอบได้ที่นี่.

person Bruno Caceiro    schedule 13.06.2019
comment
ขอบคุณ แต่นี่เป็นเพียงการบอกว่าแอปนั้นเชื่อมต่อกับการเชื่อมต่อใด สิ่งนี้คงไม่ช่วยได้เพราะฉันต้องการบังคับเครือข่ายเซลลูล่าร์ในบางครั้งและบังคับ Wifi ในพื้นที่สำหรับคุณสมบัติอื่น ๆ หลังจากการค้นคว้ามามาก ฉันสามารถนำไปปฏิบัติได้ในลักษณะหนึ่ง ดูคำตอบของฉันด้านล่างสำหรับรายละเอียด - person Pawan Pillai; 14.06.2019

ใช้ Plugin.Essentials (ต้องมีโครงการ NetStandard) และอ้างอิงถึงลิงค์นี้:

https://docs.microsoft.com/en-us/xamarin/essentials/connectivity?tabs=android

ลองเข้าถึงในเครื่องไม่ใช่เครือข่าย

person El andaloussi Ishrak    schedule 13.06.2019
comment
ขอขอบคุณที่แนะนำ แต่น่าเสียดายที่วิธีนี้ไม่ได้ช่วยอะไร เนื่องจากฉันต้องการบังคับใช้เครือข่ายเซลลูล่าร์ในบางครั้งและบังคับใช้ Wifi ในพื้นที่สำหรับคุณสมบัติอื่นๆ หลังจากการค้นคว้ามามาก ฉันสามารถนำไปปฏิบัติได้ในลักษณะหนึ่ง ดูคำตอบของฉันด้านล่างสำหรับรายละเอียด - person Pawan Pillai; 14.06.2019