当前位置: 首页 > 知识库问答 >
问题:

Android蓝牙连接到ELM327/OBD2设备

柯捷
2023-03-14

我试图创建一个简单的android应用程序来连接到我的ELM327设备,以获取一些汽车诊断数据。但我无法在我的android手机和我的ELM327设备上设置蓝牙连接。

我的代码很简单,如下所示:

Bluetooth() {
    mBluetoothAdapter= BluetoothAdapter.getDefaultAdapter();
    Set<BluetoothDevice> pairedDevices;


    if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled())
        return;

    pairedDevices = mBluetoothAdapter.getBondedDevices();
    if (pairedDevices.size() > 0) {
        // There are paired devices. Get the name and address of each paired device.
        for (BluetoothDevice device : pairedDevices) {
            String deviceName = device.getName();
            String deviceHardwareAddress = device.getAddress(); // MAC address
            //TODO: check whether this is OBD and whether it is connected
            //by sending a command and check response
            if (deviceName.contains("OBD")) {
                mOBDDevice = device;
                uuid = device.getUuids()[0].toString();
                break;
            }
        }
    }
    mBluetoothAdapter.cancelDiscovery();
}

/**
 * Start the chat service. Specifically start AcceptThread to begin a session
 * in listening (server) mode. Called by the Activity onResume()
 */
public synchronized void connect()
{
    try {
        // Get a BluetoothSocket to connect with the given BluetoothDevice.
        // MY_UUID is the app's UUID string, also used in the server code.
        mSocket = mOBDDevice.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
    } catch (IOException e) {
        Log.e(TAG, "Socket's create() method failed", e);
    }

    try {
        // Connect to the remote device through the socket. This call blocks
        // until it succeeds or throws an exception.
        mSocket.connect();
    } catch (IOException connectException) {
        // Unable to connect; close the socket and return.
        try {
            mSocket.close();
        } catch (IOException closeException) {
            Log.e(TAG, "Could not close the client socket", closeException);
        }
        return;
    }
}

}

在mainactivity中,我将首先新建一个Bluetooth类,然后调用Bluetooth.connect():

mBluetooth=新蓝牙();MBluetooth.Connect();

  1. 当我的android应用程序连接到ELM327设备时,我的android手机是蓝牙客户端,我的ELM327设备是蓝牙服务器,这种理解正确吗?
  2. 是否有服务器程序运行在我的ELM327设备上监听并接受传入连接?这是ELM327协议的定义行为吗?
  3. 知道为什么msocket.connect()失败吗?对这个问题有什么看法吗?或者我的程序中有什么明显的错误?谢谢。

共有1个答案

潘弘壮
2023-03-14

问题解决了。请参阅下面的源代码:

public synchronized void connect() throws IOException {
        try {
            // Get a BluetoothSocket to connect with the given BluetoothDevice.
            // MY_UUID is the app's UUID string, also used in the server code.
            mSocket = mOBDDevice.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
        } catch (IOException e) {
            Log.e(TAG, "Socket's create() method failed", e);
        }

        try {
            // Connect to the remote device through the socket. This call blocks
            // until it succeeds or throws an exception.
            mSocket.connect();
        } catch (IOException e1) {
            Log.e(TAG, "There was an error while establishing Bluetooth connection. Falling back..", e1);
            Class<?> clazz = mSocket.getRemoteDevice().getClass();
            Class<?>[] paramTypes = new Class<?>[]{Integer.TYPE};
            try {
                Method m = clazz.getMethod("createRfcommSocket", paramTypes);
                Object[] params = new Object[]{Integer.valueOf(1)};
                mFallbackSocket = (BluetoothSocket) m.invoke(mSocket.getRemoteDevice(), params);
                mFallbackSocket.connect();
                mSocket.close();
                mSocket = mFallbackSocket;
            } catch (Exception e2) {
                Log.e(TAG, "Couldn't fallback while establishing Bluetooth connection.", e2);
                mSocket.close();
                //throw new IOException();
            }
        }
        inputStream = mSocket.getInputStream();
        outputStream = mSocket.getOutputStream();
    }
 类似资料:
  • 我想连接第三方蓝牙设备到我的Android Wear手表(三星Gear Live)。我试图找到留档如何做到这一点,但我没有任何运气。所有的搜索,我似乎都认为我想连接到手机上。 有谁知道一个很好的例子来演示如何将蓝牙心率监视器(或其他设备)连接到Android Wear,以便我在手机不存在时保存历史记录?这可能吗?它是否与从手机/平板电脑上执行相同的协议?

  • 我如何获得Android所有已连接蓝牙设备的列表,而不考虑配置文件? 或者,我看到您可以通过BluetoothManager获取特定配置文件的所有连接设备。获取连接的设备。 我想我可以通过ACTION_ACL_CONNECTED/ACTION_ACL_DISCONNECTED监听连接/断开来查看哪些设备连接...似乎容易出错。 但我想知道是否有更简单的方法来获取所有已连接蓝牙设备的列表。

  • 连接设备 接口说明 用于连接 扫描出来的蓝牙设备。 参数说明 字段 类型 必须? 说明 device RKBLEDevice 是 蓝牙设备 示例代码 Swift: RokidMobileSDK.binder.connect(device: RKBLEDevice) Objc: [RokidMobileSDK.binder connect:device]; 断开设备 接口说明 用于断开已经连接的

  • 连接蓝牙设备 接口说明 接口需传入蓝牙名称(蓝牙address重启后会变) 参数说明 字段 类型 必须? 说明 name String 是 设备名称 举个大栗子 RokidMobileSDK.binder.connectBT(name, new IBTConnectCallBack() { @Override public void onConnectSucceed(BTDevic

  • 我可以在Android中看到蓝牙设备的两种状态。1、配对2。已连接-<我正在尝试在Android系统中使用当前连接的蓝牙设备。但我只从适配器获得配对设备列表。getBondedDevices() 我需要当前连接的设备。我怎么能得到这个。请有人帮我实现这一点。提前谢谢。

  • 我有一个隐藏的蓝牙设备,但我知道它的蓝牙MAC地址。 如何使用Android连接到该设备?