我正在开发一个Android应用,该应用可控制许多继电器板(每个板4个继电器)。 每个板都有一个IP和一个udp服务器,它们侦听同一端口(8888)。每个板均以相同的命令接收和响应。 我的问题是:当我将命令发送到一个板上并更改为另一块板(在应用程序UI上按按钮)时,会发送命令,但这些命令会继续到达前一个板上(我通过查看以太网LED知道了这一点),然后在10到15秒后开始到达新木板。为什么会这样?
这是我发送命令的课程:
package com.cvega.scjpolinox.comm;
import android.util.Log;
import android.os.Handler;
import android.widget.EditText;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class PolyEtherSender implements Runnable {
private DatagramSocket udpSocket;
private String strCommand;
private String ip;
private Handler handler;
private EditText etStatus;
public PolyEtherSender(String ip, String command, Handler handler, EditText etStatus){
this.strCommand = command;
this.ip = ip;
this.handler = handler;
this.etStatus = etStatus;
}
@Override
public void run() {
try {
// target board IP
InetAddress serverAddr = InetAddress.getByName(this.ip);
byte[] command = strCommand.getBytes();
// local socket
this.udpSocket = new DatagramSocket(null);
this.udpSocket.setReuseAddress(true);
this.udpSocket.bind(new InetSocketAddress(8881));
// command sent to board
DatagramPacket sendPacket = new DatagramPacket(command, command.length, serverAddr, 8888);
this.udpSocket.send(sendPacket);
byte[] response = new byte[4];
// response
DatagramPacket responsePacket = new DatagramPacket(response, response.length);
this.udpSocket.receive(responsePacket);
if (response[0] == 1) {
handler.post(new Runnable() {
@Override
public void run() {
etStatus.setText("Open");
}
});
} else {
handler.post(new Runnable() {
@Override
public void run() {
etStatus.setText("Close");
}
});
}
this.udpSocket.disconnect();
this.udpSocket.close();
} catch (SocketException e) {
Log.e("Poly", "Socket Error:", e);
} catch (IOException e) {
Log.e("Poly", "IO Error:", e);
}
}
}
这是UI按钮上的代码(按钮是在While气泡中以编程方式绘制的,取决于用户需要控制多少个板):
btStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String command = "Rele" + valve.getPort() + "ONT" + conf.getDuracionExtraccion();
new Thread(new PolyEtherSender(valve.getIp(), command, polyHandler, etStatus)).start();
}
});
btStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String command = "Rele" + valve.getPort() + "OFF";
new Thread(new PolyEtherSender(valve.getIp(), command, polyHandler, etStatus)).start();
}
});