Here is my code for establishing a bluetooth connection with an ELM327 and comunicating with it using a laptop:
import java.io.*;
import java.util.Vector;
import javax.bluetooth.*;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.swing.*;
public class elmbtooth implements DiscoveryListener
{
private static Object lock=new Object();
private static Vector remdevices=new Vector();
private static String connectionURL=null;
public static void main(String args[]) throws IOException
{
BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
elmbtooth obj=new elmbtooth();
LocalDevice locdevice = LocalDevice.getLocalDevice();
String add= locdevice.getBluetoothAddress();
String friendly_name= locdevice.getFriendlyName();
System.out.println("Local Bluetooth Address : "+add);
System.out.println("" +
"" +
"Local Friendly name : "+friendly_name);
DiscoveryAgent dis_agent= locdevice.getDiscoveryAgent();
System.out.println("********Locating Devices******");
dis_agent.startInquiry(DiscoveryAgent.GIAC,obj);
try
{
synchronized (lock)
{
lock.wait();
}
}
catch(InterruptedException e)
{
e.printStackTrace();
}
if(remdevices.size()<=0)
{
System.out.println("No devices found");
}
else
{
for(int i=0;i<remdevices.size();i++)
{
RemoteDevice remote_device=(RemoteDevice)remdevices.elementAt(i);
System.out.println((i+1)+".)"+remote_device.getFriendlyName(true)+" "+remote_device.getBluetoothAddress());
}
System.out.println("Choose Device to establish SPP");
int index=Integer.parseInt(b.readLine());
RemoteDevice des_device=(RemoteDevice)remdevices.elementAt(index-1);
UUID[] uuidset=new UUID[1];
uuidset[0]=new UUID("1101",true);
dis_agent.searchServices(null, uuidset, des_device, obj);
try
{
synchronized(lock)
{
lock.wait();
}
}
catch(InterruptedException e)
{
e.printStackTrace();
}
if(connectionURL==null)
{
System.out.println("Device does not support SPP.");
}
else
{
System.out.println("Device supports SPP.");
StreamConnection st_connect=(StreamConnection)Connector.open(connectionURL);
OutputStream outStream=st_connect.openOutputStream();
PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(outStream));
InputStream inStream=st_connect.openInputStream();
BufferedReader in=new BufferedReader(new InputStreamReader(inStream));
pWriter.write("AT Z");
pWriter.flush();
pWriter.write("AT E0");
pWriter.flush();
pWriter.write("AT SP 00");
pWriter.flush();
pWriter.write("0100");
pWriter.flush();
String line=in.readLine();
System.out.print(line);
pWriter.write("AT DP");
pWriter.flush();
}
}
}
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
{
if(!remdevices.contains(btDevice))
{
remdevices.addElement(btDevice);
}
}
@Override
public void servicesDiscovered(int transID, ServiceRecord[] servRecord)
{
if(!(servRecord==null)&&servRecord.length>0)
{
connectionURL=servRecord[0].getConnectionURL(0, false);
}
}
@Override
public void serviceSearchCompleted(int transID, int respCode)
{
synchronized(lock)
{
lock.notify();
}
}
@Override
public void inquiryCompleted(int discType)
{
synchronized(lock)
{
lock.notify();
}
switch(discType)
{
case DiscoveryListener.INQUIRY_COMPLETED:
System.out.println("Inquiry Completed");
break;
case DiscoveryListener.INQUIRY_TERMINATED:
System.out.println("Inquiry Terminated");
break;
case DiscoveryListener.INQUIRY_ERROR:
System.out.println("Inquiry Error");
break;
default:
System.out.println("Unknown Response Code");
}
}
}
The program provides the following output:
BlueCove version 2.1.1-SNAPSHOT on winsock
Local Bluetooth Address : 7***********1
Local Friendly name : ******PC
********Locating Devices******
Inquiry Completed
1.)OBDII 0**********3
Choose Device to establish SPP
1
Device supports SPP.
(The code to search devices , services and spp has been borrowed from the code provided on www.jsr82.com. I know that's highly condemnable but the code was provided with the explanation and i didn't see how I could make something original after reading the procedure explained on the website.)
The console keeps operatiing but the elm doesn't provide any response to the AT commands sent by the pWriter object.Where am I going wrong? The device provides readings for speed and RPM on my cellphone app. So it can't be defective.
I don't know if the p.Writer.flush() already does this, but try to include a carriage return after each command, so the device knows the command ends.
pWriter.write("AT Z" + "\r");
Edit: I think it's default set to not read spaces, not sure. Been a long time ago since I worked with OBD-II. pWriter.write("ATZ" + "\r");
Most likely not the case, as each CR (\r), the device sends something back. So the problem is somewhere else, I think.