Я пытаюсь установить сокетное соединение между моим смартфоном 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>