2013-06-20 67 views
20

因此,我一直在研究一個運行Android(API級別= 14)的設備必須連接到運行Linux的服務器(具體爲:a樹莓派)通過藍牙。建立連接後,應用程序會將加密的XML字符串發送到RPi。 RPi必須解密此字符串,解析XML並執行相應的操作。該操作的結果將發送回Android設備。Android和Linux(RPi)之間的藍牙連接在第一次寫入時丟失

到目前爲止,我已經成功創建了應用程序和RPi(運行最新版本Bluez package)之間的連接。 RPi有一個Targus的藍牙4.0加密狗。當我試圖從應用程序發送一個字符串到RPi時,我陷入了困境。到那時藍牙插座似乎被關閉。 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的一側,我基本上運行下面的例子來自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" 

我試過了我在SO上讀過的帖子所建議的各種UUID,包括00001101-0000-1000-8000-00805F9B34FB94f39d29-7d6d-437d-973b-fba39e49d4ee00000003-0000-1000-8000-00805F9B34FB(連接兩端總是相同的)。它似乎是第一個是正確的,因爲我使用其他UUID時甚至無法建立連接。

連接被RPi重置的原因是什麼?如果任何人能夠指出我的方向正確,我會很感激。

+0

您可以將解決方案作爲答案發布,以便當人們尋找未答覆的問題時不會顯示此問題嗎?謝謝! – pmos

回答

1

原來在Debian默認配合bluez配置爲的連接問題的原因(如在this answer描述禁用在/etc/bluetooth/main.confpnat插件允許Android和RPI之間的通信。

DisablePlugins = pnat 

對於未來的參考,應用程序使用的UUID是00000003-0000-1000-8000-00805F9B34FB