Hallo Leute, bin relativ neu in Java (versuche als C Entwickler Java zu lernen) und versuche gerade einen TCP Client für Android bzw. das Senden und Empfangen zum Server.
Ich erzähle mal von Anfang an: Der Server läuft auf einem OBD2 Wifi Adapter (damit kann man im Auto das Steuergerät auslesen etc.). Da es diese Adapter schon für 10 Euro gibt und aus China kommen, gibt es dementsprechend keine Informationen über den Server.
Verbinden klappt und durch rumprobieren habe ich es geschafft auch zu Senden und zu Empfangen.
Verbinden und Emfpangen in einem Thread (eigene .java Datei):
Sende in einem Thread (und eigene .java Datei):
Socket Schließen (auch eigene .java Datei):
Ehrlich gesagt habe ich es nicht geschafft das alles in einer Datei zu bündeln aber es klappt ja auch so.
Wie ihr sieht sende und empfange ich als String, was auch klappt.
Der empfangene Text kann sowohl ein normaler Text sein, z.B. "ELM327 v1.5", als auch eine 8 Byte lange hex Zahl z.B. "FD A8 F1 FF 1F D0 03 20". Diese Zahl hat eine Bedeutung die im späteren Programm verarbeitet werden soll. Ich brauche beispielsweise Byte 3 und 4, die muss rausziehen aus den 8byte.
Da aber sowohl Text als auch hex kommen, denke ich ist ein String die beste Wahl.
Wie kann ich aber es der hex Zahl 'FD A8 F1 ...' die in String line gespeichert wird zu einem hex konvertieren um dann im weiteren Programm damit weiter zu rechenen.
Also meine Fragen:
- Wie kann ich aus dem String wieder ein hex machen, aber so das was drin erhalten bleibt? Also FD soll zu 0xFD.
- Wie kann ich einzelne Bytes rausziehen.
Ich erzähle mal von Anfang an: Der Server läuft auf einem OBD2 Wifi Adapter (damit kann man im Auto das Steuergerät auslesen etc.). Da es diese Adapter schon für 10 Euro gibt und aus China kommen, gibt es dementsprechend keine Informationen über den Server.
Verbinden klappt und durch rumprobieren habe ich es geschafft auch zu Senden und zu Empfangen.
Verbinden und Emfpangen in einem Thread (eigene .java Datei):
Java:
public class TCPConnect implements Runnable {
public static final String SERVER_IP = "192.168.0.10";
public static final int SERVER_PORT = 35000;
public static InputStream is;
public static OutputStream os;
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
MainActivity.TCPinstance.my_socket = new Socket(serverAddr, SERVER_PORT);
TCPSend.var_Send = true;
os = MainActivity.TCPinstance.my_socket.getOutputStream();
is = MainActivity.TCPinstance.my_socket.getInputStream();
MainActivity.handler.sendEmptyMessage(0);
while(TCPSend.var_Send){
BufferedReader rd = new BufferedReader( new InputStreamReader(is));
String line = rd.readLine();
System.out.println(line);
}
/* try{
while (TCPSend.var_Send){
BufferedReader rd = new BufferedReader( new InputStreamReader(is));
String line;
StringBuilder sb = new StringBuilder();
line = rd.readLine();
sb.append(line);
System.console().writer().println(sb.toString());
}
} catch (IOException e){
MainActivity.handler.sendEmptyMessage(5);
}*/
} catch (UnknownHostException e1) {
MainActivity.handler.sendEmptyMessage(1);
} catch (IOException e1) {
MainActivity.handler.sendEmptyMessage(1);
}
MainActivity.handler.sendEmptyMessage(0);
}
}
Sende in einem Thread (und eigene .java Datei):
Java:
public class TCPSend implements Runnable{
public static boolean var_Send = false;
public void run(){
String strSend;
strSend = new StringBuilder(String.valueOf(MainActivity.Edit_Send.getText().toString())).append("\r").toString();
try{
TCPConnect.os.write(strSend.getBytes());
TCPConnect.os.flush();
} catch (IOException e){
}
}
}
Socket Schließen (auch eigene .java Datei):
Java:
public class TCPClose {
public Socket my_socket = null;
public void Disconnect() {
try {
if(my_socket != null) {
my_socket.close();
my_socket = null;
TCPSend.var_Send = false;
}
} catch (UnknownHostException e1) {
MainActivity.handler.sendEmptyMessage(3);
} catch (IOException e1) {
MainActivity.handler.sendEmptyMessage(3);
}
MainActivity.handler.sendEmptyMessage(2); //Connection_State = Disconnected.
}
}
Ehrlich gesagt habe ich es nicht geschafft das alles in einer Datei zu bündeln aber es klappt ja auch so.
Wie ihr sieht sende und empfange ich als String, was auch klappt.
Der empfangene Text kann sowohl ein normaler Text sein, z.B. "ELM327 v1.5", als auch eine 8 Byte lange hex Zahl z.B. "FD A8 F1 FF 1F D0 03 20". Diese Zahl hat eine Bedeutung die im späteren Programm verarbeitet werden soll. Ich brauche beispielsweise Byte 3 und 4, die muss rausziehen aus den 8byte.
Da aber sowohl Text als auch hex kommen, denke ich ist ein String die beste Wahl.
Wie kann ich aber es der hex Zahl 'FD A8 F1 ...' die in String line gespeichert wird zu einem hex konvertieren um dann im weiteren Programm damit weiter zu rechenen.
Also meine Fragen:
- Wie kann ich aus dem String wieder ein hex machen, aber so das was drin erhalten bleibt? Also FD soll zu 0xFD.
- Wie kann ich einzelne Bytes rausziehen.