android中的TCP通信
我正在尝试用安卓手机与Arduino UNO通信,我正在尝试的是 1) android设备向arduino发送字符串 2) arduino向android发布一个整数 到目前为止,我可以在Arduino板上发布来自android的消息,但我不能在android上发布整数,在android上没有收到任何消息 Arduino代码(可以接收字符“a”、“b”、“c”、“d”,对于“z”,我想返回一个整数距离): TCP-Cilentandroid中的TCP通信,android,networking,logging,tcp,tcpclient,Android,Networking,Logging,Tcp,Tcpclient,我正在尝试用安卓手机与Arduino UNO通信,我正在尝试的是 1) android设备向arduino发送字符串 2) arduino向android发布一个整数 到目前为止,我可以在Arduino板上发布来自android的消息,但我不能在android上发布整数,在android上没有收到任何消息 Arduino代码(可以接收字符“a”、“b”、“c”、“d”,对于“z”,我想返回一个整数距离): TCP-Cilent public class TCPClient { pri
public class TCPClient {
private String serverMessage;
public static final String SERVERIP = "192.168.8.1"; //your computer IP address
public static final int SERVERPORT = 2001;
private OnMessageReceived mMessageListener = null;
private boolean mRun = false;
PrintWriter out;
BufferedReader in;
/**
* 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
*/
public void sendMessage(String message){
if (out != null && !out.checkError()) {
out.println(message);
out.flush();
}
}
public void stopClient(){
mRun = false;
}
public void run() {
mRun = true;
try {
//here you must put your computer's IP address.
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
Log.e("TCP Client", "C: Connecting...");
//create a socket to make the connection with the server
Socket socket = new Socket(serverAddr, SERVERPORT);
try {
//send the message to the server
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
Log.e("TCP Client", "C: Sent.");
Log.e("TCP Client", "C: Done.");
//receive the message which the server sends back
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//in this while the client listens for the messages sent by the server
while (mRun) {
serverMessage = in.readLine();
if (serverMessage != null && mMessageListener != null) {
//call the method messageReceived from MyActivity class
mMessageListener.messageReceived(serverMessage);
}
serverMessage = null;
}
Log.d("test1",serverMessage);
Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'");
} 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);
}
}
谢谢你的帮助
注意:我发现了一些关于董事会的事实,有什么提示吗
整数的二进制表示形式在Arduino(16位)和Android(32位)之间有所不同,虽然Arduino和大多数本机级别的Android实现都是小端,但Android java代码是大端 我不知道您如何发布消息,因为您没有在发布的代码中的任何位置调用
sendMessage
。另外,你班上的所有东西都应该是private
,除非你有充分的理由不让它成为private
。距离是一个整数。好的。但发送四个或两个整数字节取决于您。或者,如果将值作为字符串发送。刺包含数字的地方。你在读线,但不是在写线。readLine()
方法将一直阻塞,直到出现行终止符或流结束符,或者出现异常。我认为这是由arundio端类型问题引起的,串行写入是向android写入字节,如果我向该函数提供整数,则会失败。所有问题马上解决
@Override
protected TCPClient doInBackground(String... message) {
//create TCPClient object
mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() {
@Override
//check whether server return message
public void messageReceived(String message) {
f_sensor.setText(message);
Log.d("test1","msg rece" + message);
//publishProgress(message);
}
});
mTcpClient.run();
return null;
}
public class TCPClient {
private String serverMessage;
public static final String SERVERIP = "192.168.8.1"; //your computer IP address
public static final int SERVERPORT = 2001;
private OnMessageReceived mMessageListener = null;
private boolean mRun = false;
PrintWriter out;
BufferedReader in;
/**
* 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
*/
public void sendMessage(String message){
if (out != null && !out.checkError()) {
out.println(message);
out.flush();
}
}
public void stopClient(){
mRun = false;
}
public void run() {
mRun = true;
try {
//here you must put your computer's IP address.
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
Log.e("TCP Client", "C: Connecting...");
//create a socket to make the connection with the server
Socket socket = new Socket(serverAddr, SERVERPORT);
try {
//send the message to the server
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
Log.e("TCP Client", "C: Sent.");
Log.e("TCP Client", "C: Done.");
//receive the message which the server sends back
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//in this while the client listens for the messages sent by the server
while (mRun) {
serverMessage = in.readLine();
if (serverMessage != null && mMessageListener != null) {
//call the method messageReceived from MyActivity class
mMessageListener.messageReceived(serverMessage);
}
serverMessage = null;
}
Log.d("test1",serverMessage);
Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'");
} 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);
}
}