0

Android以外のデバイス(Bluetoothドングルを搭載したPCなど)からデータを受信する必要があるシナリオを経験しています。自分のUIを表示する必要があり、アプリケーション自体で受信データを処理したい。したがって、この目標を達成するための良い方法はありますか。

- 編集

@Trevorが彼の回答で述べたように、次のパラグラフは意味がありません。私はこのトピックについて少し長い間研究した後で初めて事実を理解しました。とにかく、そこに提案をありがとう。

これまで試してみましlistenUsingRfcommWithServiceRecord(...)createRfcommSocketToServiceRecord(...)が、このように、両方のデバイスでアプリケーションを実行する必要があります。現在、私の場合ではありません。

- 編集

では、Android以外のデバイスからデータを受信する良い方法はありますか?

前もって感謝します...

4

2 に答える 2

2

使用しようとしているBluetoothデバイスに接続しようとしたときに発生した問題を正確に説明していないため、質問は少しあいまいです。2番目の段落(「これまで、listenUsingRfcommWithServiceRecord(...)とcreateRfcommSocketToServiceRecord(...)を試してみましたが、このように、両方のデバイスでアプリケーションを実行する必要があります。現在、私の場合ではありません。」)私には理にかなっています。

ただし、接続しようとしているのはSPPデバイス(つまり、Bluetoothからシリアルへのインターフェイス、または仮想COMポートでセットアップされたUSB PC Bluetoothドングル)であると想定しています。この場合、SPP UUIDを使用するという重要な変更を除いて、Bluetoothチャットのサンプルコードをほとんどそのまま使用できます。

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

ちなみに、プロジェクトのベースとしてBluetoothチャットの例を使用する場合は、Bluetoothチャットコードで見つかったバグに注意してください。このバグにより、入力速度よりも速い速度で受信した場合、受信した文字が失われます。これについては、ここにある私の答えを参照してください:Android InputStreamが最初の2バイトをドロップします(変更されたBluetoothChat)

于 2013-03-25T11:17:45.727 に答える
0

android sdkサンプルで、BluetoothChatを見てください。

データを通信するには2つのスレッドが必要です

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 に答える