У меня есть программа на C, которая успешно установила соединение rfcomm с устройством Bluetooth.
void doConnect( char const* btaddr )
{
int sock = socket( AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM );
bdaddr_t ba;
struct sockaddr_rc addr;
str2ba( btaddr, &ba );
memset( &addr, 0, sizeof(addr) );
addr.rc_family = AF_BLUETOOTH;
memcpy( &(addr.rc_bdaddr), &ba, sizeof(ba) );
addr.rc_channel = 1;
int result = connect( sock, (struct sockaddr *)&addr, sizeof(addr ) );
...
}
Однако, когда я запускаю служебную программу rfcomm (http://linux.die.net/man/1/rfcomm), как:
/usr/bin/rfcomm connect bt_addr
Я получаю ошибку:
"Can't find a config entry for rfcomm0"
С помощью команды:
rfcomm connect bt_addr
Я получаю ошибку:
"Can't connect RFCOMM socket: Host is down"
Итак, чем отличается rfcomm connect от моей программы на C и почему он не может установить соединение? Я неправильно использую утилиту?
== изменить ==
Результаты strace из моей программы на C:
socket(PF_BLUETOOTH, SOCK_STREAM, 3) = 3
...
connect(3, {sa_family=AF_BLUETOOTH, sa_data=">\16\303O!\0\1\0\0\0\0\0\0\0"}, 10) = 0
Результаты strace из программы / usr / bin / rfcomm:
socket(PF_BLUETOOTH, SOCK_RAW, 3) = 3
socket(PF_BLUETOOTH, SOCK_STREAM, 3) = 4
bind(4, {sa_family=AF_BLUETOOTH, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 10) = 0
connect(4, {sa_family=AF_BLUETOOTH, sa_data="\0\0\0\0\0\1\1\0\0\0\0\0\0\0"}, 10) = -1 EHOSTDOWN (Host is down)