2017-01-23 16 views
0

私は、Xamarinフォームpcl、またはtcpクライアントを搭載したwifiカード内蔵のAndroidデバイスを接続する必要があります。 実際に接続が行われ、書き込みが行われますが、私に戻ってくるデータは読み取れません。 私は通常シリアルで作業しますが、私はそれがTCP経由で読めないタイムアウトのためにはなりたくありません。Xamarin Forms PCLソケットプラグインがWi-Fiカードからデータを受信して​​いません

誰も私に少しアドバイスを与えることができます、私は少し意味します。 私はこのプラグインを使ってXamarinがpclを使って接続しています。

他の解決策がある場合は、教えてください。私はSocketを直接使用したいと思っていましたが、Visual StudioにSystem.Net.Socketというライブラリを入れることはできません。

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"; 
    } 

答えて

1

[OK]をコードに間違ったことがあります、私はそれらのすべてを指摘しようとします。

最初に、クライアントとサーバーコードを1つの関数で混合しています。これは単なるテストであっても非常に混乱します。そのため、まず2つの関数のコードを分けて読みやすくなります。

第二には、あなたのクライアントは、サーバが受信する前に接続し、書き込みをしようとします。あなたはサーバーが待機しなければならないクライアントを起動する前に接続が失敗するようになります

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

    //... 

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

     await listener.StartListeningAsync(5555);   

。接続が確立されていると述べていますが、コールを2回実行しないと、前のサーバーが引き続きリスニングを続ける場合は2度目に機能します。

次に、イベントをフックする前に電話をかけてもそれほど有害ではありませんが、何らかの理由でサーバが起動した時点でクライアントが接続しようとしている場合は、イベントハンドラには何も付いていません。

その後、クライアントストリームから読み取ろうとしますが、サーバーは何も送信していないため、コードはint testInt = await client.ReadStream.ReadAsync(fromBoard, 0, 8);でブロックされ、タイムアウトに達するため読み取り例外がスローされます。

最後に、純粋なネイティブソリューションをご希望の場合は、共有ライブラリにクライアント/サーバーコードを作成し、iOS/Androidプロジェクトのライブラリを参照し、これらのプロジェクトでDependencyServiceを作成してから、PCLライブラリを使用すると、コードを完全に制御することができます。

UPDATE:

それはあなたがサーバ機能のすべてのいずれにも使用していないようだ、これを試してみてください。

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. 
} 

任意の例外がスローされた場合には任意ののtry/catchを追加しないでください。質問を更新してください。

+0

あなたの指示に従ってコードを変更しようとしましたが、リスナーはこれまでと同じようには見えません。 解決する方法はありませんか? –

+0

何も見えませんか?接続していないようですか?何も受け取っていないようですか?クライアントとサーバーのコードを入れ、問題をより明確にしてください。 – Gusman

+0

それは読書を拾うことができないようですが、執筆と接続が動作します –

関連する問題