Плагин Xamarin Forms PCL Socket не получает данные с Wi-Fi-карты

76
5

Мне нужно подключить Xamarin forms pcl или оба ios, которые Android-устройства со встроенной Wi-Fi-картой, с клиентом tcp. Дело в том, что соединение сделано, написано также, но я не могу прочитать данные, которые возвращаются ко мне. Я обычно работаю с последовательным, я бы не хотел, чтобы это было время, которое я не могу прочитать через tcp.

Может ли кто-нибудь дать мне несколько советов, я мало буду понимать. Я использую этот плагин Xamarin forms pcl для подключения.

Или, если у кого-нибудь есть другие решения, пожалуйста, скажите мне. Я хотел напрямую использовать Socket, но я не могу войти в библиотеку Systems.Net.Socket в visual studio.

private async void testTCPSocketPlugin()
{
int port = 5555;
String ip = "192.168.222.1";

TcpSocketListener listener = new TcpSocketListener();

await listener.StartListeningAsync(5555);
listener.ConnectionReceived += Listener_ConnectionReceived;

try
{
await client.ConnectAsync(ip, port);

//listener.ConnectionReceived += async (sender, args) =>
//{
// var clientListener = args.SocketClient;

// var bytesRead = -1;
// var buf = new byte[1];

// while (bytesRead != 0)
// {
// bytesRead = await args.SocketClient.ReadStream.ReadAsync(buf, 0, 1);
// if (bytesRead > 0)
// {

// }
// //Debug.Write(buf[0]);
// }
//};
}
catch (Exception ex)
{
throw ex;
}

//byte[] array1 = null;
Byte[] dati = new Byte[8];
dati[0] = 1;
dati[1] = 8;
dati[2] = 0;
dati[3] = 0;
dati[4] = 0;
dati[5] = 0;
dati[6] = 0xe0;
dati[7] = 0x0b;

Byte[] fromBoard = new Byte[8];

try
{
await client.WriteStream.WriteAsync(dati, 0, 8);

client.ReadStream.ReadTimeout = 5000;

Stream str = client.ReadStream;
int testInt = await client.ReadStream.ReadAsync(fromBoard, 0, 8);
}
catch (Exception ex)
{
throw ex;
}
}

private void Listener_ConnectionReceived(object sender, Sockets.Plugin.Abstractions.TcpSocketListenerConnectEventArgs e)
{
String test = "break here";
}

спросил(а) 2021-01-25T21:11:27+03:00 4 месяца, 2 недели назад
1
Решение
63

Хорошо, в коде есть некоторые неправильные вещи, я постараюсь указать их все.

Во-первых, вы смешиваете клиент и код сервера с одной функцией, и это очень сбивает с толку, даже если это просто тест, поэтому прежде всего отделить код от двух функций, он будет намного читабельнее.

Во-вторых, ваш клиент пытается подключиться и писать до того, как сервер прослушивает:

    try
{
await client.ConnectAsync(ip, port);
}
catch (Exception ex)
{
throw ex;
}

//...

await client.WriteStream.WriteAsync(dati, 0, 8);

await listener.StartListeningAsync(5555);

Это приведет к сбою подключения, прежде чем вы запустите клиент, сервер должен прослушивать. Вы заявляете, что соединение выполнено, но я сомневаюсь в этом, если вы дважды выполняете вызов, а во второй раз он будет работать, если предыдущий сервер остается прослушивающим.

Затем вы вызываете await listener.StartListeningAsync(5555); перед подключением события это не очень вредно, но если по какой-то причине клиент пытается подключиться в момент загрузки сервера, то, вероятно, это соединение будет потеряно, поскольку оно будет принято до того, как ничего не будет прикреплено к обработчику событий.

После этого вы пытаетесь читать из потока клиента, но сервер ничего не отправляет, поэтому код будет блокироваться при int testInt = await client.ReadStream.ReadAsync(fromBoard, 0, 8); пока не будет выбрано исключение чтения, так как оно достигнет таймаута.

Наконец, если вы предпочитаете чистое родное решение, вы можете создать код клиент/сервер в общей библиотеке, ссылаться на эту библиотеку в проектах iOS/Android, создать DependencyService для этих проектов, а затем получить услугу в библиотеке PCL, таким образом вы можете полностью контролировать код.

ОБНОВИТЬ:

Кажется, что вы вообще не используете какие-либо функции сервера, попробуйте следующее:

async void Call()
{
TcpSocketClient client = new TcpSocketClient();
await client.ConnectAsync("192.168.222.1", 5555);

byte[] Data = new byte[] { 0x01, 0x08, 0, 0, 0, 0, 0xe0, 0x0b }

await client.WriteStream.WriteAsync(Data, 0, 8);
byte[] finalData = new byte[8];
int read = await client.ReadStream.ReadAsync(finalData, 0, 8);

//Check here, read will have the number of bytes read.
}

Не добавляйте попытку /catch, и если какое-либо исключение вызывается, обновите вопрос.

ответил(а) 2021-01-25T21:11:27+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема