Android と Linux (RPi) 間の Bluetooth 接続が最初の書き込みアクションで失われました 質問する

Android と Linux (RPi) 間の Bluetooth 接続が最初の書き込みアクションで失われました 質問する

そこで私は、Android (API レベル = 14) を実行しているデバイスが、Bluetooth 経由で Linux (具体的には Raspberry Pi) を実行しているサーバーに接続するプロジェクトに取り組んでいます。接続が確立されると、アプリは暗号化された XML 文字列を RPi に送信します。RPi はこの文字列を復号化し、XML を解析して、対応するアクションを実行する必要があります。アクションの結果は、Android デバイスに送り返されます。

これまでのところ、私はアプリとRPi(最新バージョンのBluez パッケージ)。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 の出力は次のとおりです。

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)

RPi側では、基本的に次のサンプルサーバースクリプトを実行しています。ピブルーズパッケージ:

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-00805F9B34FB私は、、 (接続の両端で常に同じ)94f39d29-7d6d-437d-973b-fba39e49d4eeなど、SO で読んだ投稿で提案されたさまざまな UUID を試しました00000003-0000-1000-8000-00805F9B34FB。他の UUID を使用すると接続すらできないので、最初のものが正しいようです。

RPi によって接続がリセットされる原因は何でしょうか? どなたか正しい方向を示していただけるとありがたいです。

ベストアンサー1

DebianのデフォルトのBluez設定が接続問題の原因であることが判明しました(この答えpnatプラグインを無効にすると/etc/bluetooth/main.conf、Android と RPi 間の通信が可能になります。

DisablePlugins = pnat

今後の参考までに、アプリケーションで使用される UUID は です00000003-0000-1000-8000-00805F9B34FB

おすすめ記事