web-dev-qa-db-ja.com

androidのRS232アダプタへのBluetooth RFCOMM / SDP接続

Googleが提供するBluetoothチャットサンプル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())
_

connect()メソッドによって常にIOExceptionエラーがスローされます。例外で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:D- StopDiscoveryのバスエラー: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):+ ON RESUME + 
 I/BluetoothChat(1729):MESSAGE_STATE_CHANGE:STATE_CONNECTING 
 I/BluetoothChatService(1729):BEGIN mConnectThread 
 E/BluetoothService.cpp(1018):stopDiscoveryNative:StopDiscoveryのD-Busエラー:org.bluez.Error .Failed(Invalid discovery session)
 E/BluetoothEventLoop.cpp(1018):event_filter:Received signal org.bluez.Device:PropertyChanged from /org/bluez/1498/hci0/dev_00_06_66_03_0C_51
I/ BluetoothChatService(1729):接続がTOSTRINGに失敗しました: Java.io.IOException:サービスの検出に失敗しました
 D/BluetoothChatService(1729):setState()STATE_CONNECTING-> STATE_LISTEN 
 D/BluetoothChatService(1729):start 
 D/BluetoothChatService( 1729):setState()STATE_LISTEN-> STATE_LISTEN 
 I/BluetoothChat(1729):MESSAGE_STATE_CHANGE:STATE_LISTEN 
 V/BluetoothEventRedirector(1080):受信したAndroid.bleutooth.device.action.UUID 
 I/NotificationService(1018):enqueueToast pkg = com.example.Android.BluetoothChat callback=Android.app.ITransientNotification$Stub$Proxy@446327c8 duration = 0 
 I/BluetoothChat(1729):MESSAGE_STATE_CHANGE:STATE_LISTEN 
 E/BluetoothEventLoop.cpp(1018):event_filter:受信信号org.bluez.Device:PropertyChanged from/org/bluez/1498/hci0/dev_00_06_66_03_0C_51 
 V/BluetoothEventRedirector(1080):Received 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サポートを欠いていると推測します。

20
ThePosey

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

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

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

34
ThePosey

それはソニーエリクソンの電話のバグに関連していると思います( ここを参照 )。

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

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

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

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

2
cheng81

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

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

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

次に、ハイパーターミナルにはBlueSnapに関する既知の問題があります。 TeraTermまたはPuTTYを試すことをお勧めします。

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

1
John

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

0
user293272

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

0
Gilead