2017-04-10 18 views
0

私のアプリケーションはWiFi経由で直接センサーに接続します。それから、ソケットに接続し、データを読み込むことになっています。データはJSONで、{"d":{temp_mC "; 33416、" humidity_ppm "... more data ....}}のようになります。センサーは2分ごとにデータを送信します。それは、サーバによって送信されますが、センサーが、私は私れるtcpClientクラスをやり直す必要がある行を送信しないからです。私はこのコードを実装することができると思います。ソケットからの行の代わりにJSONデータを読み取る方法は?

ByteArrayOutputStream result = new ByteArrayOutputStream(); 
byte[] buffer = new byte[1024]; 
int length; 
while ((length = socket.getInputStream().read(buffer)) != -1) { 
result.write(buffer, 0, length); 
} 
// StandardCharsets.UTF_8.name() > JDK 7 
return result.toString("UTF-8"); 

を文字列にJSONデータを取得するには、その後、私は希望

私の古いコードはこのように見えますが、誰かが上記のメソッドや同様のメソッドを実装するために私の古いコードをどのように作り直すことができるか考えているので、JSONデータを読んでターン文字列に変換して後で解析することができますか?

れるtcpClient

public class TcpClient { 

.... 

/** 
* Constructor of the class. OnMessagedReceived listens for the messages received from server 
*/ 
public TcpClient(OnMessageReceived listener) { 
    mMessageListener = listener; 

} 

/** 
* Sends the message entered by client to the server 
* 
* @param message text entered by client 
*/ 

/** 
* Close the connection and release the members 
*/ 
public void stopClient() { 

    mRun = false; 

    mMessageListener = null; 
    mBufferIn = null; 
    mServerMessage = null; 
} 

public void run() { 

    mRun = true; 

    try { 
     //here you must put your computer's IP address. 
     InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 

     Log.e("TCP Client", "C: Connecting..."); 

     //create a socket to make the connection with the server 
     Socket socket = new Socket(serverAddr, SERVER_PORT); 

     try { 


      //receives the message which the server sends back 
      mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); 


      //in this while the client listens for the messages sent by the server 
      while (mRun) { 

       mServerMessage = mBufferIn.readLine(); 

       if (mServerMessage != null && mMessageListener != null) { 
        //call the method messageReceived from MyActivity class 
        mMessageListener.messageReceived(mServerMessage); 
       } 

      } 

      Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'"); 

     } catch (Exception e) { 

      Log.e("TCP", "S: Error", e); 

     } finally { 
      //the socket must be closed. It is not possible to reconnect to this socket 
      // after it is closed, which means a new socket instance has to be created. 
      socket.close(); 
     } 

    } catch (Exception e) { 

     Log.e("TCP", "C: Error", e); 

    } 

} 

//Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity 
//class at on asynckTask doInBackground 
public interface OnMessageReceived { 
    public void messageReceived(String message); 
} 

} 

マイAsyncClass他の活動の

public class ConnectTask extends AsyncTask<String, String, TcpClient> { 

    @Override 
    protected TcpClient doInBackground(String... message) { 

     //we create a TCPClient object 
     mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() { 
      @Override 
      //here the messageReceived method is implemented 
      public void messageReceived(String message) { 
       //this method calls the onProgressUpdate 
       publishProgress(message); 
      } 
     }); 
     mTcpClient.run(); 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     CO2 = values[0]; 
     //response received from server 
     Log.d("CO2", values[0]); 
     //process server response here.... 

    } 

} 

答えて

0

そのような場合に対処する適切な方法は、一度にすべてのデータを送信することです。

outputStream.writeInt(message.length); 
outputStream.write(message); 

とメッセージを読み取るときに、長さを解析し、このようなメッセージ全体読み取る:

int len = socketDataInputStream.readInt();      
byte[] message = new byte[len]; 
socketDataInputStream.readFully(message, 0, message.length); 

これは、まず、データサイズと、このようなデータコンテンツを送信することによって可能です

これがうまくいくといいです、良いことです。

+0

「データサイズを送信する」と言うとき、センサーからの意味ですか?私はセンサをプログラムするためのアクセス権がないからです。もし私があなたを襲ってしまったら、申し訳ありません。 – Kspr

+0

改行なしで終了するサーバーからデータが送信されるのが普通なら、何か経験がありますか?センサーを作った会社に連絡する必要がありますか?または、データを読み込んで、新しいデータをすべて別々の文字列で取得するソリューションはありますか? – Kspr

+0

JSONメッセージを文字列に変換して後で解析する必要があるのは間違いでしょうか? "com.google.code.gson"は簡単にそれを行うことができます。あなたのアプリのgradleに "compile" com.google.code.gson:gson:2.8.0 '"を含めてください。 – JAD

関連する問題