невозможно принять UDP-трансляцию в приложении Xamarin.Forms - PullRequest
0 голосов
/ 26 февраля 2020

Я создал тестовый проект Xamarin.Forms, приложение с вкладками, с поддержкой iOS, Android и UWP. Приложение со стандартным начальным кодом создает и работает правильно на всех 3 платформах.

Am пытается проверить прием широковещательной передачи UDP в приложении . Широковещательная рассылка UDP отправляется с другой машины на том же su bnet (проверили широковещательную рассылку с другой машины и с той же машины, результаты совпадают). Если на этом компьютере я запустил автономный неуправляемый инструмент тестирования прослушивателя UDP (тот, который мы написали для себя), я смогу увидеть все сообщения, поступающие с другого компьютера.

Я добавил код (показанный ниже) в Проект Xamarin.Forms и запуск сборки UWP на этом компьютере. Что я вижу, так это то, что в выходных данных отладки я получаю сообщение "начал получать", а затем ничего больше. На самом деле я не получаю сообщения (или, по крайней мере, обратный вызов не вызывается) , Я проверил netstat и вижу, что когда мое приложение Xamarin.Forms работает, оно привязано к указанному порту UDP. Но мой OnUdpDataReceived никогда не вызывается .


РЕДАКТИРОВАТЬ: Я дважды щелкнул файл Package.appxmanifest проекта UWP в обозревателе решений. который вызвал пользовательский интерфейс, и в этом я проверил «Capabilities >> Inte rnet (Client & Server)», думая, что это было разрешением, но это не помогло.

EDIT: Я проверил подключение , создав два консольных проекта: отправителя и получателя. Отправитель просто зацикливается, отправляя тестовую широковещательную рассылку UDP каждую секунду Приемник использует тот же код, показанный здесь. Эти проекты работают как положено. Таким образом, тот же код получателя работает в консольном проекте, но не в проекте Xamarin.Forms.


Во-первых, простой класс получателя UDP.

public class BaseUdpReceiver
{
    private UdpClient _udpClient;

    public BaseUdpReceiver()
    {
    }

    public void Start()
    {
        _udpClient = new UdpClient()
        {
            ExclusiveAddressUse = false,
            EnableBroadcast = true
        };
        _udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        _udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, Constants.Network.SOME_CONSTANT_PORT_INTEGER));
        _udpClient.BeginReceive(OnUdpDataReceived, _udpClient);
        Debug.WriteLine($">>> started receiving");
    }

    private static void OnUdpDataReceived(IAsyncResult result)
    {
        Debug.WriteLine($">>> in receive");

        var udpClient = result.AsyncState as UdpClient;
        if (udpClient == null)
            return;

        IPEndPoint remoteAddr = null;
        var recvBuffer = udpClient.EndReceive(result, ref remoteAddr);

        Debug.WriteLine($"MESSAGE FROM: {remoteAddr.Address}:{remoteAddr.Port}, MESSAGE SIZE: {recvBuffer?.Length ?? 0}");

        udpClient.BeginReceive(OnUdpDataReceived, udpClient);
    }
}

Затем код в App.xaml.cs, который использует этот класс.

    public partial class App : Application
    {
        private BaseUdpReceiver _udpReceiver;

        public App()
        {
            InitializeComponent();

            DependencyService.Register<MockDataStore>();
            MainPage = new MainPage();

            _udpReceiver = new BaseUdpReceiver();
            _udpReceiver.Start();
        }

        protected override void OnStart()
        {
        }

        protected override void OnSleep()
        {
        }

        protected override void OnResume()
        {
        }
    }


информация о версии

Visual Studio 2019 Enterprise v16.4.5
Xamarin 16.4.000.322 (d16-4@ddfd842)
Windows 10 64-bit v1909 (OS Build 18363.657)

Microsoft.NETCore.UniversalWindowsPlatform, v6.2.9
NETStandard.Library, v2.0.3
Xamarin.Essentials, v1.5.0
Xamarin.Forms, v4.5.0.356

1 Ответ

0 голосов
/ 01 марта 2020

Работает как для UWP, так и для Android с помощью службы поддержки MS.

Обратите внимание, что код, приведенный в исходном сообщении, является правильным и работает, учитывая следующие соображения.

  • UWP
    • Из-за изоляции сети с помощью UWP вы не можете транслировать и принимать на одном компьютере, хотя это нормально работает с консольными приложениями, не работает с Xamarin.Forms UWP, поэтому хитрость заключается в том, что вам просто нужно транслировать с другого компьютера
    • Необходимо настроить Package.appxmanifest >> Настройки возможностей
      • На 2 компьютерах (ноутбук Wi-Fi и проводной рабочий стол ), Я обнаружил, что было достаточно проверить "Inte rnet (клиент)" и "Inte rnet (клиент и сервер)"
      • на 3-м компьютере с двумя сетевыми картами, один из которых подключен и один отключен, он все еще не работает с вышеуказанными параметрами, необходимо было также проверить «Частные сети (клиент и сервер)»
  • Android
    • Похоже, эмулятор съев свой собственный su bnet, вы можете убедиться в этом, проверив сетевые настройки эмулятора, он явно не совпадает с su bnet с настольным компьютером, на котором работает
    • . В результате вы не может получить UDP-трансляции в эмуляторе Android простым способом (кроме какой-то схемы пересылки, с которой я не экспериментировал)
    • Проверено на физическом планшете Android (протестировано на Samsung Galaxy Tab A 8 "), он работает, и я могу получать UDP-трансляции
    • Обратите внимание, что на Android мне не нужно было изменять какие-либо разрешения по умолчанию, как с UWP, это работало без проблем
  • iOS
    • Пока еще не тестировал на физическом устройстве iOS, у меня iPhone, но я использую облако Ма c сервер сборки, поэтому не могу проверить на моем устройстве
    • Когда приходит время разобраться с iOS, похоже, мне, вероятно, понадобится локальная Ма c
...