私のアプリケーションは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....
}
}
「データサイズを送信する」と言うとき、センサーからの意味ですか?私はセンサをプログラムするためのアクセス権がないからです。もし私があなたを襲ってしまったら、申し訳ありません。 – Kspr
改行なしで終了するサーバーからデータが送信されるのが普通なら、何か経験がありますか?センサーを作った会社に連絡する必要がありますか?または、データを読み込んで、新しいデータをすべて別々の文字列で取得するソリューションはありますか? – Kspr
JSONメッセージを文字列に変換して後で解析する必要があるのは間違いでしょうか? "com.google.code.gson"は簡単にそれを行うことができます。あなたのアプリのgradleに "compile" com.google.code.gson:gson:2.8.0 '"を含めてください。 – JAD