Witajcie.
Na początku zaznaczę, że bardzo zależy mi na czasie, ponieważ ten projekt powinien być jak najszybciej skończony, a jest ledwo zaczęty(w zasadzie już powinien być gotowy), dlatego też proszę o pomoc, bo nie mam pomysłu jak rozwiązać ten problem.
Piszę aplikację w Javie do diagnostyki aut. Do połączenia bluetooth używam Bluecove. Aplikacja łączy się z wtyczką ELM327, wysyła do niej komendy, wtyczka odpowiada, ale mam problem z obróbką tych danych. Komendy składają się z liter i cyfer. Wtyczka odpowiada również ciągiem znaków, jednak nie zawsze odpowiedzi otrzymuję wtedy, kiedy oczekuję. Poniżej wklejam kod i odp programu.
public class Bluetooth implements DiscoveryListener{
//object used for waiting
private static Object lock=new Object();
//vector containing the devices discovered
private static Vector vecDevices=new Vector();
private static String connectionURL=null;
public static void main(String[] args) throws IOException {
Bluetooth client=new Bluetooth();
//display local device address and name
LocalDevice localDevice = LocalDevice.getLocalDevice();
System.out.println("Address: "+localDevice.getBluetoothAddress());
System.out.println("Name: "+localDevice.getFriendlyName());
/*
//find devices
DiscoveryAgent agent = localDevice.getDiscoveryAgent();
System.out.println("Starting device inquiry...");
agent.startInquiry(DiscoveryAgent.GIAC, client);
try {
synchronized(lock){
lock.wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Device Inquiry Completed. ");
//print all devices in vecDevices
int deviceCount=vecDevices.size();
if(deviceCount <= 0){
System.out.println("No Devices Found .");
System.exit(0);
}
else{
//print bluetooth device addresses and names in the format [ No. address (name) ]
System.out.println("Bluetooth Devices: ");
for (int i = 0; i <deviceCount; i++) {
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(i);
System.out.println((i+1)+". "+remoteDevice.getBluetoothAddress()+" ("+remoteDevice.getFriendlyName(true)+")");
}
}
System.out.print("Choose Device index: ");
BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
String chosenIndex=bReader.readLine();
int index=Integer.parseInt(chosenIndex.trim());
//check for spp service
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(index-1);
UUID[] uuidSet = new UUID[1];
uuidSet[0]=new UUID("0000110100001000800000805F9B34FB",false);
System.out.println("\nSearching for service...");
agent.searchServices(null,uuidSet,remoteDevice,client);
try {
synchronized(lock){
lock.wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
if(connectionURL==null){
System.out.println("Device does not support Simple SPP Service.");
System.exit(0);
}
*/
//connect to the server and send a line of text
//ZROBIONE, BY ZA KAŻDYM RAZEM NIE WYSZUKIWAĆ URZĄDZEŃ
StreamConnection streamConnection=(StreamConnection)Connector.open("btspp://000D18000001:16;authenticate=false;encrypt=false;master=false");
// StreamConnection streamConnection=(StreamConnection)Connector.open(connectionURL);
System.out.println("conn url" + connectionURL + "\n\n");
//send string
OutputStream outStream=streamConnection.openOutputStream();
PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(outStream));
//read response
InputStream inStream=streamConnection.openInputStream();
BufferedReader bReader2=new BufferedReader(new InputStreamReader(inStream));
String lineRead;
//W CELU TESTOW
for (int i=0;i<20;i++)
{
Scanner skaner = new Scanner(System.in);
String komenda;
komenda = skaner.next()+"\r";
System.out.println("komenda: "+komenda);
pWriter.write(komenda);
pWriter.flush();
lineRead = bReader2.readLine();
System.out.println("odpowiedz o dlugosci" + lineRead.length() + ": " + lineRead);
}
inStream.close();
bReader2.close();
outStream.close();
pWriter.close();
streamConnection.close();
}
//methods of DiscoveryListener
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
//add the device to the vector
if(!vecDevices.contains(btDevice)){
vecDevices.addElement(btDevice);
}
}
//implement this method since services are not being discovered
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
if(servRecord!=null && servRecord.length>0){
connectionURL=servRecord[0].getConnectionURL(0,false);
}
synchronized(lock){
lock.notify();
}
}
//implement this method since services are not being discovered
public void serviceSearchCompleted(int transID, int respCode) {
synchronized(lock){
lock.notify();
}
}
public void inquiryCompleted(int discType) {
synchronized(lock){
lock.notify();
}
}//end method
}
BlueCove version 2.1.1-SNAPSHOT on winsock
Address: 50B7C3D47C51
Name: ULTRABOOK
komenda: ate0
odpowiedz o dlugosci2: OK
komenda: ati
odpowiedz o dlugosci0:
komenda: ati
odpowiedz o dlugosci12: >ELM327 v1.5
komenda: atz
odpowiedz o dlugosci0:
komenda: atrv
odpowiedz o dlugosci12: >ELM327 v1.5
komenda: atrv
odpowiedz o dlugosci0:
komenda: atrv
odpowiedz o dlugosci1: >
komenda: atrv
odpowiedz o dlugosci0:
komenda: atrv
odpowiedz o dlugosci11: ELM327 v1.5
komenda: atrv
odpowiedz o dlugosci0:
komenda: atrv
odpowiedz o dlugosci5: >atrv
komenda: atrv
odpowiedz o dlugosci5: 12.0V
komenda: atrv
odpowiedz o dlugosci0:
komenda: atrv
odpowiedz o dlugosci5: >atrv
komenda: atrv
odpowiedz o dlugosci5: 12.0V
Z tego, co czytałem po wysłaniu komendy powinienem dostać odpowiedź. Próbowałem usunać te puste linie i wyświetlać napis tylko wtedy, kiedy w zmiennej lineRead jest coś różnego od "" i długość większa od 0, ale to nie pomogło. Czasami puste linie nadal występowały. Kolejny problem jest w tym, że czasami wyświetla znak > i powtarza komendę, a czasami nie.
Dla testów probowałem po wysłaniu komendy kilka razy zczytać zawartość bufora bReader2, ale wtedy aplikacja czasami przestawała działać, a czasem wyświetlała różną ilość odpowiedzi z różną ilością pustych linii.
Być może problem leży w "synchronizacji" działania tak, aby wyświetlało dopiero, gdy otrzymam pełną odpowiedź. Nie mam pomysłu jak to naprawić i dlatego proszę o pomoc.