2016-03-19 16 views
0

BLE aygıtıyla iletişim kurmak için Linux işletim sisteminde Bluez kitaplığı kullandım. Ancak kodumu çalıştırdığımda, bazen cihazla bağlantı kurarken başarısızlık durumu aldım. Bu işlevi bakın:connect() işlevini kullanırken errno EMLINK'i aldı

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; 
} 

sorundur, connect() işlev dönüş -1 ve errno EMLINK olduğunu birçok belgeleri okumak ama bu hatanın neden bulamıyorum. Lütfen bana yardım et. Teşekkürler

+0

@AnttiHaapala: EMLINK hatası aldığını düşünüyor musunuz? – Viet

+0

Ben yüzeysel olarak bluetooth yığını aşina değilim, bu yüzden google bu yaptım, bu konuda fazla bir şey yok, sadece bulundu http://comments.gmane.org/gmane.linux.bluez.user/3917 –

+0

Eh, [ "EMLINK bluetooth hatası 0x9"] (https://github.com/torvalds/linux/blob/1b1050cdc5cdde43177b375b5f22dc070d45d8f8/net/bluetooth/lib.c) –

cevap

0

Linux çekirdeği haritaları Bluetooth error code 0x9 to EMLINK. Bluetooth hatası 0x9 "çok fazla bağlantı" anlamına gelir. Belki de cihazınız bu türden herhangi bir bağlantıyı desteklemez veya sizin girişimlerinizde çok fazla bağlantı açtınız ve şimdi hala canlı olduklarını düşünüyor.

Yasal Uyarı, Bluetooth uzmanı değilim.

+0

Sanırım connect() soketin işlevi mi? Yanlış mı? – Viet

+0

evet; 'connect' kılavuzları' EMLINK' hakkında L2CAP –

+1

'a özel olmalı, kodumu inceledim. İşlemden çıkıldığında, çorapları kapatmıyorum. Bunun EMLINK hatasının sebebi olduğunu düşünüyor musunuz? – Viet

İlgili konular