2016-03-19 13 views
0

BLEデバイスと通信するために、Linux OSでBluezライブラリを使用しました。しかし、私は私のコードを実行すると、時々私はデバイスと接続中に失敗の状態を受け取りました。この機能をご覧ください。connect()関数を使用しているときにerrno EMLINKを受け取りました

static int l2cap_le_att_connect(bdaddr_t *src, bdaddr_t *dst, uint8_t dst_type, 
            int sec) 
{ 
    int sock; 
    struct sockaddr_l2 srcaddr, dstaddr; 
    struct bt_security btsec; 

    if (verbose) { 
     char srcaddr_str[18], dstaddr_str[18]; 

     ba2str(src, srcaddr_str); 
     ba2str(dst, dstaddr_str); 

     printf("btgatt-client: Opening L2CAP LE connection on ATT " 
        "channel:\n\t src: %s\n\tdest: %s\n", 
        srcaddr_str, dstaddr_str); 
    } 

    sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); 
    if (sock < 0) { 
     perror("Failed to create L2CAP socket"); 
     return -1; 
    } 

    /* Set up source address */ 
    memset(&srcaddr, 0, sizeof(srcaddr)); 
    srcaddr.l2_family = AF_BLUETOOTH; 
    srcaddr.l2_cid = htobs(ATT_CID); 
    srcaddr.l2_bdaddr_type = 0; 
    bacpy(&srcaddr.l2_bdaddr, src); 

    if (bind(sock, (struct sockaddr *)&srcaddr, sizeof(srcaddr)) < 0) { 
     perror("Failed to bind L2CAP socket"); 
     close(sock); 
     return -1; 
    } 

    /* Set the security level */ 
    memset(&btsec, 0, sizeof(btsec)); 
    btsec.level = sec; 
    if (setsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &btsec, 
          sizeof(btsec)) != 0) { 
     fprintf(stderr, "Failed to set L2CAP security level\n"); 
     close(sock); 
     return -1; 
    } 

    /* Set up destination address */ 
    memset(&dstaddr, 0, sizeof(dstaddr)); 
    dstaddr.l2_family = AF_BLUETOOTH; 
    dstaddr.l2_cid = htobs(ATT_CID); 
    dstaddr.l2_bdaddr_type = dst_type; 
    bacpy(&dstaddr.l2_bdaddr, dst); 

    printf("Connecting to device..."); 
    fflush(stdout); 

    if (connect(sock, (struct sockaddr *) &dstaddr, sizeof(dstaddr)) < 0) { 
     perror(" Failed to connect"); 
     close(sock); 
     return -1; 
    } 

    printf(" Done\n"); 

    return sock; 
} 

問題は、CONNECT()関数の戻り値-1で、errnoには、私は多くの文書を読んで、私はこのバグの原因を見つけることができませんEMLINK です。私を助けてください。ありがとうございます

+0

@AnttiHaapala:EMLINKにエラーがあると思いますか? – Viet

+0

私は外見上以外のBluetoothのスタックに精通していないので、私はこれをgoogleにしました。これについてはそれほど分かりません。http://comments.gmane.org/gmane.linux.bluez.user/3917 –

+0

まあ、 'EMLINKはBluetoothエラー0x9'です(https://github.com/torvalds/linux/blob/1b1050cdc5cdde43177b375b5f22dc070d45d8f8/net/bluetooth/lib.c) –

答えて

0

LinuxカーネルマップBluetooth error code 0x9 to EMLINK。 Bluetoothエラー0x9は「接続が多すぎます」という意味です。あなたのデバイスは、これらの種類の接続をサポートしていない可能性があります。あるいは、接続をあまりにも開いてしまっても、今でもまだ生きていると思っています。

免責事項、私はBluetoothの専門家ではありません。

+0

私はconnect()がソケットの機能だと思いますか?違いますか? – Viet

+0

はいです。 'connect'マニュアルは 'EMLINK'について言わない。それはL2CAPに固有でなければなりません –

+1

私のコードを見直しました。プロセスが終了すると、私は靴下を閉じません。これがEMLINKエラーの原因だと思いますか? – Viet

関連する問題