2015-02-20 3 views
3

Я использую BlueZ 4.101 для встроенного проекта Linux с Kernel 3.4.79+. Обычные операции Bluetooth работают отлично, и я могу использовать многие гарнитуры с моим устройством для передачи аудио. Теперь я работаю над Bluetooth Compliance, поэтому я использую USB SIG для USB PTS Dongle. Я прохожу каждый тест, за исключением части теста входящего вызова, когда мне нужно открыть соединение SCO после принятия вызова с помощью ключа PTS.Приложение BlueZ scotest и с Linux Config Не удается подключиться к SCO Socket

Попытка подключения к SCO работает с гарнитурами, но не с помощью ключа PTS. Ошибка дается от bluetoothd как:

bluetoothd[6306]: audio/headset.c:headset_set_state() State changed /org/bluez/6306/hci0/dev_00_1B_DC_07_30_40: HEADSET_STATE_PLAY_IN_PROGRESS -> HEADSET_STATE_CONNECTED 
bluetoothd[6306]: audio/headset.c:headset_set_state() State changed /org/bluez/6306/hci0/dev_00_1B_DC_07_30_40: HEADSET_STATE_CONNECTED -> HEADSET_STATE_PLAY_IN_PROGRESS 
bluetoothd[6306]: Protocol not supported (93) 

Так я составил scotest из тестовой директории Bluez и побежал, что после соединения с ключом и получил тот же результат:

# ./scotest -s -b HELLO 00:1B:DC:07:30:40 
scotest[1687]: Can't connect: Protocol not supported (93) 
scotest[1687]: Can't connect to the server: Protocol not supported (93) 

Вот do_connect функции в scotest.c, что не удается в:

static int do_connect(char *svr) 
{ 
    struct sockaddr_sco addr; 
    struct sco_conninfo conn; 
    socklen_t optlen; 
    int sk; 

    /* Create socket */ 
    sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO); 
    if (sk < 0) { 
     syslog(LOG_ERR, "Can't create socket: %s (%d)", 
          strerror(errno), errno); 
     return -1; 
    } 

    /* Bind to local address */ 
    memset(&addr, 0, sizeof(addr)); 
    addr.sco_family = AF_BLUETOOTH; 
    bacpy(&addr.sco_bdaddr, &bdaddr); 

    if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 
     syslog(LOG_ERR, "Can't bind socket: %s (%d)", 
          strerror(errno), errno); 
     goto error; 
    } 

    /* Connect to remote device */ 
    memset(&addr, 0, sizeof(addr)); 
    addr.sco_family = AF_BLUETOOTH; 
    str2ba(svr, &addr.sco_bdaddr); 

    if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 
     syslog(LOG_ERR, "Can't connect: %s (%d)", 
          strerror(errno), errno); 
     goto error; 
    } 

    /* Get connection information */ 
    memset(&conn, 0, sizeof(conn)); 
    optlen = sizeof(conn); 

    if (getsockopt(sk, SOL_SCO, SCO_CONNINFO, &conn, &optlen) < 0) { 
     syslog(LOG_ERR, "Can't get SCO connection information: %s (%d)", 
          strerror(errno), errno); 
     goto error; 
    } 

    syslog(LOG_INFO, "Connected [handle %d, class 0x%02x%02x%02x]", 
     conn.hci_handle, 
     conn.dev_class[2], conn.dev_class[1], conn.dev_class[0]); 

    return sk; 

error: 
    close(sk); 
    return -1; 
} 

что я упускаю в Kernel Config, чтобы позволить донгл PTS ввести в состояние, играя с открытым подключением к ШОС?

Вот мой .config для Linux (я использую Backports-3.13.2-1 для поддержки модуля/WiFi TI WL1271 BT):

CPTCFG_IPV6_SUBTREES=y 
CPTCFG_NFT_RBTREE=m 
CPTCFG_BRIDGE_NF_EBTABLES=m 
CPTCFG_BRIDGE_EBT_BROUTE=m 
CPTCFG_BRIDGE_EBT_T_FILTER=m 
CPTCFG_BRIDGE_EBT_T_NAT=m 
CPTCFG_BRIDGE_EBT_802_3=m 
CPTCFG_BRIDGE_EBT_AMONG=m 
CPTCFG_BRIDGE_EBT_ARP=m 
CPTCFG_BRIDGE_EBT_IP=m 
CPTCFG_BRIDGE_EBT_IP6=m 
CPTCFG_BRIDGE_EBT_LIMIT=m 
CPTCFG_BRIDGE_EBT_MARK=m 
CPTCFG_BRIDGE_EBT_PKTTYPE=m 
CPTCFG_BRIDGE_EBT_STP=m 
CPTCFG_BRIDGE_EBT_VLAN=m 
CPTCFG_BRIDGE_EBT_ARPREPLY=m 
CPTCFG_BRIDGE_EBT_DNAT=m 
CPTCFG_BRIDGE_EBT_MARK_T=m 
CPTCFG_BRIDGE_EBT_REDIRECT=m 
CPTCFG_BRIDGE_EBT_SNAT=m 
CPTCFG_BRIDGE_EBT_LOG=m 
CPTCFG_BRIDGE_EBT_NFLOG=m 
CPTCFG_MAC_EMUMOUSEBTN=m 
CPTCFG_RTLBTCOEXIST=m 
CPTCFG_TABLET_USB_KBTAB=m 
CPTCFG_INPUT_ATLAS_BTNS=m 
CPTCFG_SND_BT87X=m 
CPTCFG_LIRC_BT829=m 
CPTCFG_USB_BTMTK=m 
CPTCFG_TOSHIBA_BT_RFKILL=m 
CPTCFG_BTRFS_FS=m 
CPTCFG_BTRFS_FS_POSIX_ACL=y 
CPTCFG_RBTREE_TEST=m 
CPTCFG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y 
CPTCFG_BTREE=y 
CPTCFG_BACKPORT_OPTION_BT_SOCK_CREATE_NEEDS_KERN=y 
CPTCFG_BT=m 
CPTCFG_BT_RFCOMM=m 
# CPTCFG_BT_RFCOMM_TTY is not set 
CPTCFG_BT_BNEP=m 
CPTCFG_BT_BNEP_MC_FILTER=y 
CPTCFG_BT_BNEP_PROTO_FILTER=y 
# CPTCFG_BT_CMTP is not set 
CPTCFG_BT_HIDP=m 
CPTCFG_BT_HCIBTUSB=m 
CPTCFG_BT_HCIBTSDIO=m 
CPTCFG_BT_HCIUART=m 
CPTCFG_BT_HCIUART_H4=y 
CPTCFG_BT_HCIUART_BCSP=y 
# CPTCFG_BT_HCIUART_ATH3K is not set 
CPTCFG_BT_HCIUART_LL=y 
CPTCFG_BT_HCIUART_3WIRE=y 
# CPTCFG_BT_HCIBCM203X is not set 
# CPTCFG_BT_HCIBPA10X is not set 
# CPTCFG_BT_HCIBFUSB is not set 
# CPTCFG_BT_HCIDTL1 is not set 
# CPTCFG_BT_HCIBT3C is not set 
# CPTCFG_BT_HCIBLUECARD is not set 
CPTCFG_BT_HCIBTUART=m 
CPTCFG_BT_HCIVHCI=m 
# CPTCFG_BT_MRVL is not set 
# CPTCFG_BT_ATH3K is not set 
CPTCFG_BT_WILINK=m 

Я инструментальный файл sco.c в Ядро с принтами.

В случае успеха с обычной гарнитурой это выглядит так после успешного открытия соединения ШОС:

*** sco_sock_create 
*** sco_sock_alloc 
*** sco_sock_init 
*** sco_sock_bind 
*** sco_sock_connect 
*** sco_connect 
*** sco_conn_add 
*** sco_chan_add 
*** __sco_chan_add 
*** sco_sock_set_timer 
*** sco_connect_cfm 
*** sco_conn_add 
*** sco_conn_ready 
*** sco_sock_clear_timer 
*** sco_sock_getsockopt 
*** sco_sock_setsockopt_old 
*** sco_sock_getsockopt 
*** sco_sock_setsockopt_old 
*** sco_sock_sendmsg 
*** sco_send_frame 
*** sco_sock_sendmsg 
*** sco_send_frame 
*** sco_sock_sendmsg 
*** sco_send_frame 

При отказе это выглядит следующим образом:

*** sco_sock_create 
*** sco_sock_alloc 
*** sco_sock_init 
*** sco_sock_bind 
*** sco_sock_connect 
*** sco_connect 
*** sco_conn_add 
*** sco_chan_add 
*** __sco_chan_add 
*** sco_sock_set_timer 
*** sco_connect_cfm 
*** sco_conn_del 
*** sco_chan_get 
*** sco_sock_clear_timer 
*** sco_chan_del 
*** sco_sock_release 
*** sco_sock_close 
*** sco_sock_kill 
*** sco_sock_clear_timer 
*** __sco_sock_connect 
*** sco_sock_kill 
*** sco_sock_kill 
*** sco_sock_destruct 

Далее инструментовка показывает сбои происходят в этом sco.c:

void sco_connect_cfm(struct hci_conn *hcon, __u8 status) 
{ 

    printk("*** sco_connect_cfm start\n"); 

    BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status); 
    printk("*** sco_connect_cfm_stat hcon %p bdaddr %pMR status %d\n", hcon, &hcon->dst, status); 
    if (!status) { 
     struct sco_conn *conn; 

     conn = sco_conn_add(hcon); 
     printk("*** sco_connect_cfm sco_conn_add: %d\n",conn); 
     if (conn) 
      printk("*** sco_connect_cfm ready\n"); 
      sco_conn_ready(conn); 
    } else 
     printk("*** sco_connect_delete: %d\n",status); 
     sco_conn_del(hcon, bt_to_errno(status)); 
} 

Эта продукция выглядит как thi s:

*** sco_sock_create 
*** sco_sock_alloc 
*** sco_sock_init 
*** sco_sock_bind 
*** sco_sock_connect 
*** sco_connect 
*** sco_conn_add 
*** sco_chan_add 
*** __sco_chan_add 
*** sco_sock_set_timer 
*** sco_connect_cfm start 
*** sco_connect_cfm_stat hcon d9ec2400 bdaddr 40:30:07:dc:1b:00 status 26 
*** sco_connect_delete: 26 
*** sco_conn_del 
*** sco_chan_get 
*** sco_sock_clear_timer 
*** sco_chan_del 
*** sco_sock_release 
*** sco_sock_close 
*** sco_sock_clear_timer 
*** sco_sock_kill 
*** __sco_sock_connect 
*** sco_sock_kill 
*** sco_sock_kill 
*** sco_sock_destruct 
+0

Вы можете распечатать связанные с Bluetooth материалы из вашего файла .config? –

+0

Спасибо, что посмотрели на это. Я добавил свой .config к вопросу. – PhilBot

+0

Вы уверены, что все вещи bluetooth включены? –

ответ

0

Проблема была не в конфигурации ядра, а в наборе драйверов, которые я использовал. Я скомпилировал версию драйверов linux backports (http://drvbp1.linux-foundation.org/~mcgrof/rel-html/backports/), потому что мне нужны драйверы с поддержкой backported wifi, и это дало мне ошибку, не поддерживаемую протоколом (93). Я переключился на драйверы, распространяемые с Kernel 3.4.79+, и это сработало.

 Смежные вопросы

  • Нет связанных вопросов^_^