Я пытаюсь создать соединение Bluetooth из Raspberry Pi 3B (Debian Linux) в приложение для Android. Моя проблема заключается в том, что для платформы Android (AFAIK) требуется использование UUID, например. createRfcommSocketToServiceRecord (UUID). Код фрагмента:Как подключиться от Linux к разъему Bluetooth Bluetooth
// CREATE SPP SOCKET
mSock = device.createRfcommSocketToServiceRecord(uuid);
if(mSock == null) {
return(-1);
}
// TRY TO CONNECT
mSock.connect();
Приведенный выше код отлично работает Android-to-Android.
Linux, с другой стороны, требует только «номер канала rc» (целое число). Ниже приведен пример кода примера из MIT:
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
int main(int argc, char **argv)
{
struct sockaddr_rc addr = { 0 };
int s, status;
char dest[18] = "XX:XX:XX:XX:XX:XX"; // android address here
// allocate a socket
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
// set the connection parameters (who to connect to)
addr.rc_family = AF_BLUETOOTH;
addr.rc_channel = (uint8_t) 1;
str2ba(dest, &addr.rc_bdaddr);
// connect to server
status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
// send a message
if(status == 0) {
status = write(s, "hello!", 6);
}
if(status < 0) perror("uh oh");
close(s);
return 0;
}
Я не могу понять, как свести эти два мира.
Помощь!
я половина понял, ответ, пытаясь подключиться к каждому номеру канала 1-31. Я получил успешную связь на каналах 3, 4, 5, 6. В моем приложении для Android указано соединение на 6. Таким образом (по-видимому) каждый UUID для активного Android-сервера получает сопоставление с номером канала. Вопрос о том, как правильно определить номер канала. Я считаю, что ответ заключается в использовании «протокола обнаружения служб» (SDP). Я не совсем понял, как это сделать, но, по крайней мере, в конце туннеля есть свет. Я отправлю полный ответ, как только я (надеюсь) выясню это. – DontPanic