Java Android向OBD发送带有延迟的ArrayList命令
由于ELM327无法同时管理所有命令,因此我需要延迟向OBD端口发送命令列表 我正在尝试使用此代码,但不起作用Java Android向OBD发送带有延迟的ArrayList命令,java,android,delay,obd-ii,Java,Android,Delay,Obd Ii,由于ELM327无法同时管理所有命令,因此我需要延迟向OBD端口发送命令列表 我正在尝试使用此代码,但不起作用 public void repeatCommand(){ for (final String command : commandArray){ Log.d(TAG, "Giro for"); final Handler handlerTimed = new Handler(); handle
public void repeatCommand(){
for (final String command : commandArray){
Log.d(TAG, "Giro for");
final Handler handlerTimed = new Handler();
handlerTimed.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
sendMessage(command);
}
}, 1000);
}
/*String message = "010C\r";
sendMessage(message);*/
}
它只在1秒后发送第一个命令,但其他命令没有。
我如何发送所有因写入而延迟的命令,以管理发送到OBD的所有命令
好的,我使用建议的方法发送第一个命令并等待响应。。。。获取响应时,发送下一条消息
private synchronized void manage(BluetoothSocket socket, BluetoothDevice
device) {
Log.d(TAG, "connected, Socket Type:");
// Cancel the thread that completed the connection
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
// Cancel any thread currently managing connections
if (mManageThread != null) {
mManageThread.cancel();
mManageThread = null;
}
// Start the thread to manage the connection and perform transmissions
mManageThread = new ManageDataThread(socket);
mManageThread.start();
// Send the name of the connected device back to the UI Activity
Message msg = mHandler.obtainMessage(Constants.MESSAGE_DEVICE_NAME);
Bundle bundle = new Bundle();
bundle.putString(Constants.DEVICE_NAME, device.getName());
msg.setData(bundle);
mHandler.sendMessage(msg);
// Update UI title
updateUserInterfaceTitle();
}
这里是管理连接的线程
public class ManageDataThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private boolean wait_response = false;
public ManageDataThread(BluetoothSocket socket) {
Log.d(TAG, "create ManageDataThread: ");
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
mState = STATE_CONNECTED;
}
public void run() {
while(true) {
for (final String command : commandArray) {
byte[] send = command.getBytes();
write(send);
//mState = STATE_WAIT_RESPONSE;
byte[] buffer = new byte[1024];
int bytes;
// Keep listening to the InputStream while connected
while (wait_response) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
//TODO devo gestire l'arrivo di bytes
ObdCommand obc = new ObdCommand();
obc.readResult(mmInStream);
formattedMessage = obc.getResult();
//buffer = (byte) obc.getBuffer();
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, formattedMessage)
.sendToTarget();
wait_response = false;
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
}
}
}
它有点不完美,但现在是工作了。。。。
我将为stop it打开一个新帖子并更新命令数组列表,因为如果我更改命令列表,循环将保留旧的数组列表,因此我需要通知线程arraylist已更改
编辑
不要在线程内使用(true),当需要停止线程将变量设置为false时,最好使用一个变量集,或者在停止线程时出现问题。
< P>一个要考虑的事情是,当创建一个处理程序而不提供一个活套时,它将使用它的强环>当前线程< /强>。 所以我最好的猜测是,既然我们没有你的代码,你实际上是在一个不是主线程的线程中运行它的。确保你的线程不会在途中的某个地方被杀死,它应该可以工作 还有一些编码技巧:首先,我必须说,将处理程序设置在循环的外部将更有效。
这样,您就不会浪费内存在每次迭代中创建处理程序。
所以看起来应该是这样的:
public void repeatCommand()
{
final Handler handlerTimed = new Handler();
for (final String command : commandArray){
Log.d(TAG, "Giro for");
handlerTimed.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
sendMessage(command);
}
}, 1000);
}
}
其次,我强烈建议您设置类的常量,比如1000值。使用OBD2(一种串行协议)的正确方法是实现类似命令队列的功能,该命令队列具有命令特定的回调,可向您请求的命令提供响应。命令队列应该在后台线程中工作,操作队列并侦听串行端口。甚至不要启动延迟或类似的方法。检查我的答案,请告诉我@Dario,但我需要延迟来执行每个命令。。。我读到OBD需要将近5千万秒的时间来管理“Ansare”。。。我不断地发送命令,但不会返回所有响应。。。。还是我错了?如果我使用简单for并发送数组中的所有COMANND,则会得到错误响应。。时间太快了事情是。。。您永远不会知道车辆需要多长时间响应。这取决于ECU(加上BTLE或WiFi通信开销)——因此每个延迟要么太大,要么太小。最好先阅读所有内容,直到收到响应终止符
\r\r>
,然后发送队列中的下一个命令。好的,建议使用命令。。。发送第一个命令并等待响应,当我获取并读取命令的响应时,我发送第二个命令并执行相同的过程,直到队列全部读取。如何同步写入和读取??你有什么建议?我需要从汽车到手机的所有(4)命令的实时数据,并显示数据,直到应用程序打开或所选命令更改(使用首选项活动)为止。感谢“队列工作线程”通常具有输入和输出流的句柄。每当响应挂起时,它都可以在read()
上休眠。当响应完全重组后,您可以将答案传递给业务逻辑线程,检查队列中是否有另一个命令,write()
该命令,标记响应处于挂起状态,然后在read()
中重新开始侦听。注意,我不知道Android是一个平台,但从架构的角度来看,这就是它应该做的事情