2013-06-20 11 views
20

Androidを実行しているデバイス(APIレベル= 14)がLinuxを実行しているサーバーに接続する必要があるプロジェクトを作成しました。ラズベリーパイ)をBluetooth経由で送信します。接続が確立されると、アプリケーションは暗号化されたXML文字列をRPiに送信します。 RPiはこの文字列を解読し、XMLを解析して対応するアクションを実行する必要があります。アクションの結果はAndroidデバイスに返送されます。最初の書き込み操作でAndroidとLinux(RPi)間のBluetooth接続が失われました

これまでのところ、私はアプリとRPi(Bluez packageの最新バージョンを実行する)との間の接続を作成することができました。 RPiにはTargusのBluetooth 4.0ドングルが搭載されています。私が立ち往生しているポイントは、アプリからRPiに文字列を送信しようとするときです。それまでにBluetoothソケットが閉じられているように見えます。 LogcatはメッセージConnection reset by peerを返します。次のように

ソケットを作成するために使用されるコードは次のよう

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

Logcat出力である:RPIの側

06-20 14:29:42.224: DEBUG/RPiService(24273): ---------- [ CONNECTION ESTABLISHED ] ---------- 
06-20 14:29:42.224: DEBUG/RPiService(24273): connected, Socket Type:Secure 
06-20 14:29:42.229: DEBUG/RPiService(24273): create ConnectedThread: Secure 
06-20 14:29:43.734: DEBUG/RPiService(24273): setState() 2 -> 3 
06-20 14:29:43.739: DEBUG/RPiService(24273): Connection reset by peer 
06-20 14:29:43.744: WARN/System.err(24273): java.io.IOException: Connection reset by peer 
06-20 14:29:43.754: WARN/System.err(24273): at android.bluetooth.BluetoothSocket.writeNative(Native Method) 
06-20 14:29:43.759: WARN/System.err(24273): at android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:398) 
06-20 14:29:43.764: WARN/System.err(24273): at android.bluetooth.BluetoothOutputStream.write(BluetoothOutputStream.java:85) 
06-20 14:29:43.769: WARN/System.err(24273): at com.example.BluetoothTest.RPiService$ConnectedThread.run(RPiService.java:344) 

、Iは、本質的に以下の例を実行していPyBluezパッケージのサーバースクリプト:

from bluetooth import * 

server_sock=BluetoothSocket(RFCOMM) 
server_sock.bind(("",PORT_ANY)) 
server_sock.listen(1) 

port = server_sock.getsockname()[1] 

uuid = "00001101-0000-1000-8000-00805F9B34FB" 

advertise_service(server_sock, "SampleServer", 
    service_id = uuid, 
    service_classes = [ uuid, SERIAL_PORT_CLASS ], 
    profiles = [ SERIAL_PORT_PROFILE ] 
) 

print "Waiting for connection on RFCOMM channel %d" % port 

client_sock, client_info = server_sock.accept() 
print "Accepted connection from ", client_info 

try: 
    while True: 
     data = client_sock.recv(1024) 
     if len(data) == 0: break 
     print "received [%s]" % data 
except IOError: 
    pass 

print "disconnected" 

client_sock.close() 
server_sock.close() 
print "all done" 

00001101-0000-1000-8000-00805F9B34FB94f39d29-7d6d-437d-973b-fba39e49d4ee00000003-0000-1000-8000-00805F9B34FB(常に接続の両端で同じ)など、私がSOで読んだ投稿で示唆されたさまざまなUUIDを試しました。他のUUIDを使用しているときにも接続できないため、最初のものが正しいと思われます。

RPiによって接続がリセットされる原因は何ですか?誰かが私を正しい方向に向けることができれば、私は感謝しています。

+0

解決策を回答として投稿して、人々が未回答の質問を探すときにこの質問が表示されないようにしてください。 – pmos

答えて

1

それはthis answerで説明したようにDebianの上のデフォルトのbluez構成が(接続の問題の原因だったことが判明。AndroidとRPIの間の通信のために許可され/etc/bluetooth/main.confpnatプラグインを無効にする。

DisablePlugins = pnat 

のために今後のリファレンスでは、アプリケーションで使用されるUUIDは00000003-0000-1000-8000-00805F9B34FBです。

関連する問題