자동차 진단 OBD, ELM327 v1.5 를 이용하여 자동차 신호를 받아오려고 합니다.
통신은 WIFI 모델입니다. IP 192.168.0.10 PORT 35000 입니다
TCP소켓을 통해 통신하는 것으로 알고있어서
코드를 짜보았습니다.
package com.example.client;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import android.app.*;
import android.support.v7.app.ActionBarActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.*;
import android.view.View.*;
import android.widget.*;
public class MainActivity extends ActionBarActivity {
private EditText edtTextAddress;
private EditText edtTextPort;
private Button btnConnect;
private Button btnClear;
private TextView txtResponse;
Socket socket;
String response;
DataOutputStream dos;
DataInputStream din;
NetworkTask myClientTask;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte byteBuffer[] = new byte[8];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtTextAddress = (EditText) findViewById(R.id.address);
edtTextPort = (EditText) findViewById(R.id.port);
btnConnect = (Button) findViewById(R.id.connect);
btnClear = (Button) findViewById(R.id.clear);
txtResponse = (TextView) findViewById(R.id.response);
btnConnect.setOnClickListener(buttonConnectOnClickListener);
btnClear.setOnClickListener(new OnClickListener(){
public void onClick(View v){
txtResponse.setText("Close");
}
});
}
OnClickListener buttonConnectOnClickListener = new OnClickListener(){
public void onClick(View arg0){
NetworkTask myClientTask = new NetworkTask(
edtTextAddress.getText().toString(),
Integer.parseInt(edtTextPort.getText().toString())
);
myClientTask.execute();
}
};
public class NetworkTask extends AsyncTask<String, Integer, String>{
String dstAddress;
int dstPort;
BufferedWriter socket_out;
PrintWriter out;
NetworkTask(String addr, int port){
dstAddress = addr;
dstPort = port;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0){
try{
Log.e("socket","Init");
Socket socket = new Socket(dstAddress, dstPort);
Log.e("socket","pass");
dos = new DataOutputStream(socket.getOutputStream());
din = new DataInputStream(socket.getInputStream());
Scanner scanner = new Scanner(socket.getInputStream());
PrintWriter pw = new PrintWriter(socket.getOutputStream());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(socket.isConnected())
{
dos.writeBytes("010C");
//dos.writeUTF("010c");
dos.flush();
Log.e("Send","010C");
for(int i; (i=din.read(byteBuffer)) != -1; )
{
baos.write(byteBuffer, 0, i);
}
byte result[] = baos.toByteArray();
response = getString(result);
String str1 = response;
Log.e("Receive",str1);
//response = scanner.nextLine();
String[] str = new String(response).split(" ");
int i = ((Integer.parseInt(str[2],16) * 256 + Integer.parseInt(str[3],16))/4);
response = Integer.toString(i);
Log.e("text",response);
publishProgress(1);
try
{
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
//socket.close();
}catch(UnknownHostException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer...integers){
Log.e("Prog","pass");
txtResponse.setText(response);
}
@Override
protected void onPostExecute(String result){
Log.e("Post","pass");
super.onPostExecute(result);
}
}
public static String getString(byte[] data) {
String text = null;
try {
text = new String(data, 0, data.length - 2, "UTF-16LE").replaceAll("\r\n", "\n");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return text.trim();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
TCP 서버 프로그램을 통해 송수신이 되는 것을 확인하였는데, 직접 자동차에서 WIFI연결후 통신하면 되질않습니다
데이터를 전혀 못 받아옵니다. 수신 중에 그냥 튕깁니다.
BufferedReader, DataInputStream, Scanner 다해봐도 모르겠습니다.
혹시 OBD 사용해보시거나 WIFI 소켓 사용해보신분 도움 부탁드립니다.