39

Bluetooth デバイスに接続する以下の 2 つの方法の違いは何ですか。

1)

UUID uuid = UUID.fromString(Values.SPP_UUID); //Standard SerialPortService ID
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 

2)

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);

最初の方法は常に機能するとは限りません。時には機能することもありますが、Bluetooth デバイスを閉じると、再び機能しなくなります。2 番目の方法は常にうまく機能します。Bluetoothと通信するためにチャネル1を開くだけであることは知っていますが、uuidを使用せずにBluetoothデバイスに接続する方法がわかりませんか?

4

1 に答える 1

60

番号で指定したポートへの TCP 接続を開くことと、 から名前で検索するポートへの TCP 接続を開くことの違いに少し似ていると考えてください/etc/services

createRfcommSocketToServiceRecord渡された UUID を取得し、SDP を使用して、接続に使用する無線チャネルを決定します。また、サーバーが同じ UUID でリモート エンドポイントをリッスンしていることも確認します。このようにして、接続を取得する最も信頼性の高い方法です。常に正しいチャネルを使用し、接続を開くことに成功した場合、相手側の何かがプロトコルを理解できることがわかります。

対照的に、createRfcommSocketあなたが伝えたチャンネルに接続するだけです。リモート エンドポイントで何かがリッスンしているかどうかを知る方法はありません。デバイスがそこにあることだけがわかります。また、ラジオ チャンネルの選択が完全に不適切である可能性があります。そのため、この関数は API で公開されておらず、他の関数が優先されます。

createRfcommSocket最初はより信頼性が高いように見えるかもしれませんが、それは他のエンドポイントでリスナーの存在をチェックしていないためです.いくつかのエラーケースを無視しています. これは実験には問題ないかもしれませんが、ユーザーが他のエンドポイントでサーバーを起動するのを忘れてしまい、アプリが混乱した方法で失敗することが多いため、実稼働システムでは役に立ちません。

もちろん、createRfcommSocketAPI で公開されていないため、Android の将来のリリースで引き続き機能するという保証はありません。

于 2013-09-02T23:29:46.357 に答える