Подключение пользовательского приложения Android к пользовательской службе Bluetooth в Linux

Я пытаюсь реализовать пользовательский сервис Bluetooth на NCO C.H.I.P. с Debian 4.3 (на C ++) и подключиться к нему через пользовательское приложение на моем телефоне Android 6.0.1 (на Java). Использование новейших инструментов и библиотек bluez, а также последней версии AndroidStudio SDK.

‘sdptool browse —raw local’ показывает мой сервис с его UUID. Мой телефон соединяется с ЧИПом без проблем. Но все попытки подключения терпят неудачу.

Sequence
Attribute 0x0000 - ServiceRecordHandle
UINT32 0x00010005
Attribute 0x0001 - ServiceClassIDList
Sequence
UUID16 0x1400 - HDP
Attribute 0x0003 - ServiceID
UUID128 dc0f9df0-bdda-11e6-9598-0800200c9a66
Attribute 0x0004 - ProtocolDescriptorList
Sequence
Sequence
UUID16 0x0100 - L2CAP
Sequence
UUID16 0x0003 - RFCOMM
UINT8 0x1b
Attribute 0x0005 - BrowseGroupList
Sequence
UUID16 0x1002 - PublicBrowseGroup
Attribute 0x0009 - BluetoothProfileDescriptorList
Sequence
Sequence
UUID16 0x1400 - HDP
UINT16 0x0100

UUID совпадают с обеих сторон.

Запрос всех UUID (http://digitalhacksblog.blogspot.com/2012/05/android-example-bluetooth-discover-and.html) показывает только UUID службы гарнитуры, а не мой. Мой телефон не может быть ограничен от подключения к некоторым классам обслуживания: я вижу несколько «странных» UUID сервисов из моего Honda HandsFreeLink.

Попытка повторного сопряжения в то время, когда сервер был открыт сокет и слушал, без разницы.

Я изменил класс обслуживания и профиль с Health Device на Serial Port, и теперь появляется новый UUID — но это «стандартный» 16-битный UUID Bluetooth, а не тот, который я указал для службы. Попытка использовать тот UUID последовательного порта в моем приложении вместо UUID моего клиента, все еще никаких соединений.

Код сервера довольно стандартный: я получаю сообщение «Ожидание подключения клиента …», и дальше ничего не происходит.

struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 };
char buf[1024] = { 0 };
int bytes_read;
socklen_t opt = sizeof(rem_addr);

// allocate socket
g_socket = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
if (g_socket < 0) {
fprintf(stderr, "ERROR: socket(2) failed: %s\n", strerror(errno));
goto abort;
}

// bind socket to port 27 of the first available
// local bluetooth adapter
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = {0, 0, 0, 0, 0, 0};
loc_addr.rc_channel = (uint8_t) 27;
bind(g_socket, (struct sockaddr *)&loc_addr, sizeof(loc_addr));

// put socket into listening mode
listen(g_socket, 1);

printf("Waiting for client to connect...\n");
// accept one connection
client = accept(g_socket, (struct sockaddr *)&rem_addr, &opt);
if (client < 0) {
fprintf(stderr, "ERROR: accept(2) failed: %s\n", strerror(errno));
goto abort;
}

ba2str( &rem_addr.rc_bdaddr, buf );
fprintf(stderr, "accepted connection from %s\n", buf);

Так же как и код клиента: он не работает в вызове connect () с помощью:

D / BluetoothSocket: connect (): myUserId = 0

W / BluetoothAdapter: getBluetoothService () вызывается без BluetoothManagerCallback

E / MyAPP: Нет подключения: чтение не удалось, сокет может быть закрыт или истекло время ожидания, чтение ret: -1

    try {
mSocket = myDevice.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "No RFCOMM: " + e.getMessage());
return false;
}
try {
mSocket.connect();
} catch (IOException e) {
Log.e(TAG, "No connect: " + e.getMessage());
return false;
}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]