Сокетные соединения между Android и внешним устройством с помощью Xamarin - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь установить сокетное соединение между моим смартфоном Android и внешним настраиваемым устройством с помощью платформы Xamarin. Предполагается, что это внешнее устройство принимает некоторые пользовательские команды и возвращает ответ. Это прекрасно работает с клиентом Telnet, таким как Tera Term . Однако мне пока не повезло с моим кодом Xamarin. Это выглядит следующим образом:

using Microsoft.AspNetCore.Http;
using System;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace MyNamespace
{
    public partial class MainPage : ContentPage
    {
        private Socket mySocket;

        public MainPage()
        {
            InitializeComponent();
        }

        private bool ConnectToSocketAndReturnConnectionStatus(Socket socket, IPEndPoint remoteEndPoint)
        {
            try
            {
                socket.Connect(remoteEndPoint);
            }
            catch (Exception e)
            {
                Debug.WriteLine("Exception: Network subsystem is down", e);
            }

            return socket.Connected;
        }

        private void AcceptCallback(IAsyncResult ar)
        {
            // Receive from socket
            byte[] buffer = new byte[1024];
            int iRx = mySocket.Receive(buffer);
            char[] chars = new char[iRx];

            Decoder d = Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(buffer, 0, iRx, chars, 0);
            String recv = new String(chars);
            DisplayAlert("Message from Socket", recv, "OK");
        }

        private void SendMyCommand()
        {
            byte[] byData = Encoding.ASCII.GetBytes("DataStringOfMyCommand");
            mySocket.Send(byData);
            DisplayAlert("Message from Socket", "My command sent", "OK");
        }

        void ConnectButtonClicked(object sender, EventArgs args)
        {
            // Init socket
            mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAdd = IPAddress.Parse("x.x.x.x");
            IPEndPoint remoteEndPoint = new IPEndPoint(ipAdd,myPortNumber);

            bool mySocketIsConnected = ConnectToSocketAndReturnConnectionStatus(mySocket, remoteEndPoint);

            if (mySocketIsConnected) {
                DisplayAlert("Message from Socket", "Connection successfully established", "OK");
                try
                {
                    mySocket.Blocking = false;
                    mySocket.Listen(100);
                    mySocket.BeginAccept(new AsyncCallback(AcceptCallback), mySocket);
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.ToString());
                }
            }
            else { DisplayAlert("Message from Socket", "No connection possible. Check your network!", "OK"); }
        }

        void MyCommandButtonClicked(object sender, EventArgs args)
        {
            SendMyCommand();
        }
    }
}

Появляется предупреждение «Соединение успешно установлено», как и ожидалось. Таким образом, я полагаю, что внешнее устройство как минимум найдено. Однако я не могу увидеть ответ, так как после отправки пользовательской команды всплывающее окно не отображается. По-видимому, функция «AcceptCallback (...)» никогда не вызывается. Что я тут не так делаю?

Ваша помощь очень ценится.

P.S: Вот соответствующий файл .xaml, на случай, если вам интересно, как выглядит пользовательский интерфейс:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyNamespace"
             x:Class="MyNamespace.MainPage"
             Title="My Tool">

    <StackLayout>
        <Label x:Name="label"
               Text="Welcome"
               FontSize="Medium"
               VerticalOptions="CenterAndExpand"
               HorizontalOptions="Center" />

        <Button Text="Connect to hardware"
                VerticalOptions="CenterAndExpand"
                HorizontalOptions="Center"
                Clicked="ConnectButtonClicked" />

        <Button Text="Send my command"
                VerticalOptions="CenterAndExpand"
                HorizontalOptions="Center"
                Clicked="MyCommandButtonClicked" />

    </StackLayout>

</ContentPage>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...