嗨,我正在开发蓝牙聊天应用程序,无法通过蓝牙连接到其他设备

时间:2017-07-19 11:14:24

标签: android bluetooth uuid

我查看了开发者网站并获得了一些开发蓝牙聊天应用程序的帮助。我无法连接到其他设备。我使用了开发者网站蓝牙聊天示例中提到的UUID。我知道它应该是独一无二的,但我不知道如何找到。请告诉我。我正在使用三星Galaxy J7。

1 个答案:

答案 0 :(得分:0)

蓝牙聊天示例有助于如何根据sample

执行类似的应用
  

此应用程序允许两个Android设备通过蓝牙进行双向文本聊天。它演示了所有基本的蓝牙API功能,例如:(1)扫描其他蓝牙设备(2)查询配对蓝牙设备的本地蓝牙适配器(3)建立RFCOMM通道/插座(4)连接到远程设备(5) )通过蓝牙传输数据

样本不容易学习,我需要一些帮助。

如何根据样本制作蓝牙聊天应用

蓝牙连接在客户端和服务器方法中工作,即使您连接2个设备,所有设备都将是客户端和服务器(设备连接到其他设备并且也接受来自其他设备的连接)。

UUID

UUID代表通用唯一标识符,您的UUID必须是唯一的,但是,唯一性并不总是有保证,并且生成相同UUID的机会很低,您不必担心唯一性。如果你愿意,谷歌" UUID generator"并且您会找到this等网站。

生成UUID后,请为客户端和服务器使用相同的UUID。

连接到其他设备

要连接到其他设备,您必须首先枚举配对设备,BluetoothAdapter包含初始设置的所有内容。 android.bluetooth.*包中包含您应用的所有内容。

BluetoothAdapter是一个Singleton,因此您可以多次调用方法BluetoothAdapter.getDefaultAdapter()而不会产生太多实例。

BluetoothAdapter.getDefaultAdapter()

我们将mBluetoothAdapter指定为BluetoothAdapter.getDefaultAdapter()

确保蓝牙已开启,如果蓝牙已关闭,请开启。

if (!mBluetoothAdapter.isEnabled()) mBluetoothAdapter.enable();

打开蓝牙需要几秒钟。

枚举配对设备

让我们列举配对设备,BluetoothDevice包含有关特定设备的信息,"已绑定"意味着"配对"。

List<BluetoothDevice> devices = new ArrayList<>();
for (BluetoothDevice device : mBluetoothAdapter.getBondedDevices()) {
    devices.add(device);
}
//Let's add the bonded devices to an ListView
MyBluetoothAdapter adapter = new MyBluetoothAdapter(this, devices);
mListView.setAdapter(adapter);

MyBluetoothAdapter就是一个例子,您需要制作自己的ArrayAdapter以满足您的需求。

连接到设备

当选择某个项目时,蓝牙将连接到设备,以防止UI冻结,将使用不同的线程在后台进行连接。

BluetoothDevice device = yourMethodToGetTheDevice();
ConnectThread mConnectThread = new ConnectThread(device);
mConnectThread.start();

ConnectThread代码在这里(我建议创建一个内部类来访问父类方法):

示例使用的蓝牙协议是RFCOMM。 mUUID是使用上述网站生成的UUID。

private class ConnectThread extends Thread {

    public ConnectThread(BluetoothDevice device) {
        try {
            mBluetoothSocket = device.createRfcommSocketToServiceRecord(mUUID);
        } catch (IOException e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }

    @Override
    public void run() {
        try {
            Log.i(TAG, "Connecting...");
            mBluetoothSocket.connect();
            new ConnectedThread(mBluetoothSocket);
            Log.i(TAG, "Connected");
        } catch (IOException e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }

}

建立连接后,您就可以发送数据了。

接受连接

接受他人&#39;连接,你必须启动一个持续检查连接的后台线程。

private class AcceptThread extends Thread implements Closeable {

    private BluetoothServerSocket mBluetoothServerSocket;
    private volatile boolean running = true;

    public AcceptThread(String name) {
        mBluetoothServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(name, mUUID);
    }

    @Override
    public void run() {
        while (running) {
            try {
                mBluetoothSocket = mBluetoothServerSocket.accept();
                if (mBluetoothSocket != null) {
                    close();
                    new ConnectedThread(mBluetoothSocket);
                }
            } catch (IOException e) {
                Log.e(TAG, e.getMessage(), e);
                break;
            }
        }
    }

    @Override
    public void close() throws IOException {
        mBluetoothServerSocket.close();
        mBluetoothServerSocket = null;
        running = false;
    }

}

此代码限制与单个设备的连接。

通信

设备连接后,ConnectedThread将启动。

private class ConnectedThread extends Thread implements Closeable {

    private InputStream in;
    private OutputStream out;
    private volatile running = true;

    public ConnectedThread(BluetoothSocket socket) {
        try {
            in = socket.getInputStream();
            out = socket.getOutputStream();
        } catch (IOException e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }

    @Override
    public void run() {
        //The maximum amount of data to receive is 4KB, if you want to receive more data, you'll have to receive large data by chunks using while loop.
        //Usually text isn't as large as 4KB.
        byte[] data = new byte[4096];
        int length;
        while (running) {
            try {
                length = in.read(data);
                String text = new String(data, 0, length);
                Log.i(TAG, text);
            } catch (IOException e) {
                Log.e(TAG, e.getMessage(), e);
                //Connection was lost
                break;
            }
        }
    }

    public void write(byte[] data) throws IOException {
        out.write(data);
    }

}

要发送数据,例如文本,请使用以下代码:

mConnectedThread.write("MY TEXT".getBytes());

要接收数据,请使用ConnectedThread中的代码并处理String text变量。