因此,我一直在研究一個運行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-00805F9B34FB
,94f39d29-7d6d-437d-973b-fba39e49d4ee
和00000003-0000-1000-8000-00805F9B34FB
(連接兩端總是相同的)。它似乎是第一個是正確的,因爲我使用其他UUID時甚至無法建立連接。
連接被RPi重置的原因是什麼?如果任何人能夠指出我的方向正確,我會很感激。
您可以將解決方案作爲答案發布,以便當人們尋找未答覆的問題時不會顯示此問題嗎?謝謝! – pmos