Почему не работает / usr / bin / rfcomm (утилита Linux), но функция C завершается успешно? - PullRequest
1 голос
/ 13 декабря 2011

У меня есть программа на 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...