Соединение Bluetooth между Android и Linux (RPi) потеряно при первом действии записи

Итак, я работал над проектом, в котором устройство под управлением Android (уровень API = 14) должно подключаться к серверу под управлением Linux (а именно: Raspberry Pi) через Bluetooth. Когда соединение установлено, приложение отправляет зашифрованную строку XML в RPi. RPi должен расшифровать эту строку, проанализировать XML и выполнить соответствующее действие. Результат действия отправляется обратно на устройство Android.

Пока мне удалось создать соединение между приложением и RPi (на котором работает последняя версия пакета Bluez < / а>). RPi имеет ключ Bluetooth 4.0 от Targus. Точка, в которой я застрял, - это когда я пытаюсь отправить строку из приложения в 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 я, по сути, запускаю следующий пример сценария сервера из пакет 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"

Я пробовал различные UUID, предложенные сообщениями, которые я читал на SO, включая 00001101-0000-1000-8000-00805F9B34FB, 94f39d29-7d6d-437d-973b-fba39e49d4ee и 00000003-0000-1000-8000-00805F9B34FB (всегда одинаковые на обоих концах соединения). Похоже, что первый правильный, поскольку я даже не могу установить соединение при использовании другого UUID.

Что может быть причиной сброса соединения с помощью RPi? Если кто-нибудь сможет указать мне правильное направление, я был бы признателен.


person Kaj Nelissen    schedule 20.06.2013    source источник
comment
Не могли бы вы опубликовать решение в качестве ответа, чтобы этот вопрос не появлялся, когда люди ищут вопросы, на которые нет ответов? Спасибо!   -  person smheidrich    schedule 12.09.2015


Ответы (1)


Оказалось, что конфигурация Bluez по умолчанию в Debian была причиной проблем с подключением (как описано в этом ответе. Отключение pnat в /etc/bluetooth/main.conf разрешен обмен данными между Android и RPi.

DisablePlugins = pnat

Для справки в будущем, UUID, используемый приложениями, - 00000003-0000-1000-8000-00805F9B34FB.

person Kaj Nelissen    schedule 16.09.2015