0

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

- 编辑

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

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

- 编辑

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

提前致谢...

4

2 回答 2

2

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

但是,我假设它是您尝试连接的 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 drop first two bytes (modified BluetoothChat)

于 2013-03-25T11:17:45.727 回答
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;
            }

        }
    }
于 2013-03-25T09:54:53.940 回答