用于从非Android蓝牙设备接收数据的Android代码

时间:2013-03-25 09:45:41

标签: android bluetooth

我正在经历一个场景,我需要从非Android设备(例如带有蓝牙适配器的PC)接收数据。我需要显示自己的UI,并希望通过我的应用程序本身处理传入的数据。那么有没有什么好方法可以实现这个目标。

- 修改

正如@Trevor在他的回答中提到的,下面的段落没有任何意义,我只是在对该主题进行了一点长时间的研究后才明白这个事实。无论如何,感谢大家的建议。

到目前为止,我尝试使用listenUsingRfcommWithServiceRecord(...)createRfcommSocketToServiceRecord(...)但是这样,我们需要在两个设备中运行我们的应用程序。目前不是我的情况。

- 修改

那么,有没有什么好方法可以从非Android设备接收数据?

提前致谢...

3 个答案:

答案 0 :(得分:2)

您的问题有点模糊,因为当您尝试连接到您尝试使用的任何蓝牙设备时,您没有准确解释发生了什么问题。你的第二段(“到目前为止我尝试使用listenUsingRfcommWithServiceRecord(...)和createRfcommSocketToServiceRecord(...)但是这样,我们需要在两个设备中运行我们的应用程序。目前它不是我的情况。”< / em>)对我没有意义。

但是,我假设它是您尝试连接的SPP设备(即蓝牙到串行接口,或者设置有虚拟COM端口的USB PC蓝牙适配器)。在这种情况下,您可以使用蓝牙聊天示例代码,除了使用SPP UUID的一个重要更改:

/** UUID for Serial Port Profile */
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

顺便说一下,如果您使用蓝牙聊天示例作为项目的基础,请注意我在蓝牙聊天代码中发现的错误,如果以更快的速度收到打字速度,会导致收到的字符丢失。有关此信息,请参阅此处给出的答案:Android InputStream dropping first two bytes (modified BluetoothChat)

答案 1 :(得分:1)

我发现this link 非常有用,它展示了如何从Arduino发送以及从Android接收数据。

答案 2 :(得分:0)

在android sdk示例中查看一下BluetoothChat,

您需要两个线程来传达数据

private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        this.mmDevice = device;
        BluetoothSocket tmp = null;
        try {
            tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));
        } catch (IOException e) {
            e.printStackTrace();
        }
        mmSocket = tmp;
    }

    @Override
    public void run() {
        setName("ConnectThread");
        mBluetoothAdapter.cancelDiscovery();
        try {
            mmSocket.connect();
        } catch (IOException e) {
            try {
                mmSocket.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            connectionFailed();
            return;

        }
        synchronized (PrinterService.this) {
            mConnectThread = null;
        }
        connected(mmSocket, mmDevice);
    }

    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) {
            Log.e("PrinterService", "close() of connect socket failed", e);
        }
    }
}

private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) {
            Log.e("Printer Service", "temp sockets not created", e);
        }
        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    @Override
    public void run() {
        while (true) {
            try {
                if (!encodeData(mmInStream)) {
                    mState = STATE_NONE;
                    connectionLost();
                    break;
                } else {
                }
                // mHandler.obtainMessage(AbstractActivity.MESSAGE_READ,
                // bytes, -1, buffer).sendToTarget();
            } catch (Exception e) {
                e.printStackTrace();
                connectionLost();
                PrinterService.this.stop();
                break;
            }

        }
    }