Я пытаюсь реализовать пользовательский сервис 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;
}
Задача ещё не решена.
Других решений пока нет …