Java 无法与ELM327蓝牙通信
以下是我与ELM327建立蓝牙连接并使用笔记本电脑与其通信的代码:Java 无法与ELM327蓝牙通信,java,bluetooth,obd-ii,Java,Bluetooth,Obd Ii,以下是我与ELM327建立蓝牙连接并使用笔记本电脑与其通信的代码: 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 Di
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");
}
}
}
(搜索设备、服务和spp的代码是从www.jsr82.com上提供的代码中借来的。我知道这是非常应受谴责的,但该代码提供了解释,在阅读了网站上解释的程序后,我不知道如何制作原创代码。)
控制台一直在运行,但elm没有对pWriter对象发送的AT命令提供任何响应。我哪里出了问题?该设备在我的手机应用程序上提供速度和转速读数。因此它不会有缺陷。我不知道p.Writer.flush()是否已经这样做了,但请尝试在每个命令后包含回车符,以便设备知道命令结束 写入(“在Z”+“\r”) 编辑: 我认为默认设置为不读取空格,不确定。我已经很久没有和OBD-II合作了。 写入(“ATZ”+“\r”)
很可能不是这种情况,因为每个CR(\r),设备都会返回一些内容。因此,我认为问题出在其他地方。很抱歉将此作为回答,因为我没有足够的声誉来添加评论。 试试看:先发送数据,然后关闭接收端的输入流(或套接字)。它适用于Java中的UDP。 Java中接收UDP的方法在接收数据后不会停止等待,即使它们在缓冲区中没有更多的空间。也许蓝牙接收方法也有同样的问题
我无法关闭Android设备上的接收器插座。如果有帮助,请告诉我。flush方法用于其他用途。
Eclipse
给出的flush
方法的解释是:刷新流。如果流已将各种write()方法中的任何字符保存在缓冲区中,请立即将它们写入其预期目标。是否需要配对来与设备通信?我认为我没有将笔记本电脑与设备配对,因为它没有要求访问代码,我相信这是1234与我的OBD-II连接器,我无法连接,如果我没有配对它。可能没有空间?命令应该到达那里,并且应该有响应。如果不是,则说明OBD-II设备/汽车有问题,或者连接写入/读取有问题。我在没有空间的情况下尝试过,还直接请求了速度和rpm等参数……但都不起作用。我对输入和输出流也有同样的担忧。我使用了toString()
方法来确保它们被创建。确实如此。我可以让我的代码正常工作,但问题是线程出错,我在每个类上都创建了一个构造函数,在构造函数的末尾调用run()代码>方法,这就是我的代码无法工作的原因。你能看看这个问题吗
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.