20

Google が提供する Bluetooth Chat サンプル API アプリを使用して、別のデバイスに接続された Bluetooth RS232 アダプターに接続しようとしています。参考にしたアプリはこちら

http://developer.android.com/resources/samples/BluetoothChat/index.html

参考までに、RS232 コネクタのスペック シートを次に示します。

http://serialio.com/download/Docs/BlueSnap-guide-4.77_Commands.pdf

問題は、次の方法でデバイスに接続するときです。

mmSocket.connect(); (BluetoothSocket::connect())

メソッドによって常にIOExceptionエラーがスローされますconnect()。例外を実行するtoStringと、「サービスの検出に失敗しました」というメッセージが表示されます。私の質問は、ほとんどの場合IOException、接続メソッドでスローされる原因は何ですか? それらがソースのどこかにあることは知っていますが、アプリを作成する Java レイヤーと、実際のスタック インターフェイスを含む C/C++ レイヤーがどのようになっているのか正確にはわかりません。C / C ++で記述されたbluez bluetoothスタックを使用していることは知っていますが、例外をスローしていると思われるJavaレイヤーにどのように結びついているかはわかりません。この問題を分析できる場所を教えていただけると助かります。

また、RS232 アダプターとは正常にペアリングできますが、実際に接続することはできません。詳細な参照用の logcat 出力は次のとおりです。

I/ActivityManager( 1018): 表示されたアクティビティ com.example.android.BluetoothChat/.DeviceListActivity: 326 ms (合計 326 ms)
E/BluetoothService.cpp(1018): stopDiscoveryNative: StopDiscovery での D-Bus エラー: org.bluez.Error.Failed (無効な検出セッション)
D/BluetoothChat(1729): onActivityResult -1
D/BluetoothChatService( 1729): 接続先: 00:06:66:03:0C:51
D/BluetoothChatService(1729): setState() STATE_LISTEN -> STATE_CONNECTING
E/BluetoothChat( 1729): + 再開時 +
私/Bluetooth チャット (1729): MESSAGE_STATE_CHANGE: STATE_CONNECTING
I/BluetoothChatService(1729): BEGIN mConnectThread
E/BluetoothService.cpp(1018): stopDiscoveryNative: StopDiscovery での D-Bus エラー: org.bluez.Error.Failed (無効な検出セッション)
E/BluetoothEventLoop.cpp( 1018): event_filter: 信号 org.bluez.Device:PropertyChanged を /org/bluez/1498/hci0/dev_00_06_66_03_0C_51 から受信しました
I/BluetoothChatService(1729): 接続に失敗しました: java.io.IOException: サービスの検出に失敗しました
D/BluetoothChatService(1729): setState() STATE_CONNECTING -> STATE_LISTEN
D/BluetoothChatService(1729): 開始
D/BluetoothChatService(1729): setState() STATE_LISTEN -> STATE_LISTEN
私/Bluetooth チャット (1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
V/BluetoothEventRedirector( 1080): android.bleutooth.device.action.UUID を受け取りました
I/NotificationService( 1018): enqueueToast pkg=com.example.android.BluetoothChat コールバック=android.app.ITransientNotification$Stub$Proxy@446327c8 duration=0
私/Bluetooth チャット (1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
E/BluetoothEventLoop.cpp( 1018): event_filter: 信号 org.bluez.Device:PropertyChanged を /org/bluez/1498/hci0/dev_00_06_66_03_0C_51 から受信しました
V/BluetoothEventRedirector( 1080): android.bleutooth.device.action.UUID を受け取りました

接続しようとしているデバイスは、00:06:66:03:0C:51スキャンして明らかにペアリングできるデバイスです。


以下は、ここで選択した回答によって正常に解決された同様の質問からマージされています。

Androidで別の電話以外のrfcommデバイスに接続するにはどうすればよいですか?

Android API は、listenUsingRfcommWithServiceRecord() を使用してソケットをセットアップし、createRfcommSocketToServiceRecord() を使用してそのソケットに接続する例を提供ます

BlueSMiRF Goldチップを搭載した組み込みデバイスに接続しようとしています。Android に移植したい私の作業 Python コード ( PyBluezライブラリを使用) は次のとおりです。

sock = bluetooth.BluetoothSocket(proto=bluetooth.RFCOMM)
sock.connect((device_addr, 1))
return sock.makefile()

...したがって、接続するサービスは、SDP ルックアップなしで、単純にチャネル 1 として定義されます。

私が Android API で目にする唯一の文書化されたメカニズムは、UUID の SDP ルックアップを行うため、少し途方に暮れています。Linux ホストから「sdptool browse」を使用すると何も表示されないため、問題のチップには SDP サポートが欠けていると推測されます。

4

5 に答える 5

34

簡単に言うと、SPPデバイスに接続するにはこのUUIDを使用する必要がありました。

private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

インターチューブのいたるところにSPPのものが載っていたので、「1101」の部分だけが重要だと思ったので変更してみましたが、二度と接続できませんでした。どうやら、その特定のUUIDは、汎用SPPデバイスに接続するために使用されることになっているものです。とにかく、私がここに投稿することを考えたので、この種の問題を抱えている人は誰でも答えがあります。それを見つけるのに約3日かかりましたLOL!

于 2010-01-13T17:28:38.660 に答える
2

これは、sony-ericsson の携帯電話のバグに関連していると思われます (こちらを参照)。

Bluetoothと完全に作成されたUUIDを使用して、Android 2.0デバイスとMacとの間で接続できました。j2me デバイス (sony ericsson w910i) で同じことをしようとすると、Android がサーバーである場合にのみ機能し、そうでない場合はあなたと同じ例外が発生します。

私が知る限り、使用している UUID は spp プロファイルの「ベース アドレス」であり、サービス ディスカバリを発行するときにサーバー デバイスによって返される ServiceRecord の ServiceClassIDList フィールドに、UUID の後にリストされている必要があります。使用することにしました..明らかにこれは状況によっては当てはまりません (たとえば、私の電話は最初に一般的な UUID をリストし、次にカスタム UUID をリストしました)。

ここも同じ状況のようです。ServiceRecord を手動で変更して、適切な ServiceClassIDList を返すことができます。多分それはあなたのために働く..残念ながら、私のばかげた携帯電話はそれを変更することを拒否します:(

PS。奇妙なことは、ServiceRecordが「壊れている」場合でも、私のMacが実際にサービスを見ることができるということです.AndroidはServiceClassIDListの最初のUUIDを見るだけで、私のPCはすべての要素を検索するリストを調べます。しかし、これは単なる私の推測です:)

于 2010-02-10T09:38:00.723 に答える
1

設定するボー レートは、接続先のデバイスと一致する必要があります。それらにはデフォルトの 115200 または 9600 への切り替えがありますが、その他 (私の場合は測量機器用の 1200) が必要な場合は、ハイパーターミナル* とヌル モデム ケーブルを介して設定する必要があります。

* bluesnap デバイスのドキュメントではハイパーターミナルの使用が推奨されていますが、問題があります。bluesnap に数回電話をかけた後、彼らは次のように提案しました。

まず、デバイスを PC に接続するときに、115200 8、N、1、および X をオフにして、ジャンパー設定を元の位置に戻してみてください。DTE が有効になっている場合、DTR/DTE 接続専用に設計された特別なソフトウェアを使用しないと、端末接続を確立できません。

次に、HyperTerminal には BlueSnap に関する既知の問題があります。TeraTerm または PuTTY を試すことをお勧めします。

これを見つけるのに4日かかりました!

于 2012-12-12T02:16:30.850 に答える
0

Bluetooth デバイスのボーレートは何に設定されていますか? 接続していますが、ボーレートが混在している場合の典型的な文字化けしたデータが表示されます。私は 57600 に設定しています。これは、他の人が使用しているのを見たものです。ああ、あなたの結果を投稿してくれてありがとう、UUID は私も数日間働いていました。

于 2010-03-14T05:12:19.607 に答える
0

「sdptool browse」でデバイスに関する情報が報告されない場合は、「sdptool records [device-mac-here]」を試してください

于 2010-04-18T01:42:20.267 に答える