2012-03-15 14 views
1

私はC Bluetoothプログラミング(Linux Bluez)の問題を誰かに助けてくれるのだろうかと思っていました。 私はUbuntu 10.04、BlueZ 4.60を使用しています。 私の目標は、2台のコンピュータ間でデータを送信するための遅延が最小限になるL2CAPソケットを持つことです。 これまでのところ、私はL2CAPソケットを開くことができましたが、このソケットには無限の再送信があり、私はそれを変更しようとしています。最小限の遅延でデータを高速に転送する必要があるため、データの信頼性は重要ではないため、再送は全く必要ありません。L2CAPソケットでの再送信のキャンセル

私は、ソケットのフラッシュタイムアウトを変更することを扱ったオンラインの例を見つけました。それは、パケットが一定時間後にアックされずにバッファ内の次のデータが送信された場合に起こります。 問題は、この例では、ここで

:-(動作しないということですが、私のコードで、このメソッドは、bindコマンドの後に呼び出されます。

int set_flush_timeout(bdaddr_t *ba, int timeout) { int err = 0, dd, dev_id; struct hci_conn_info_req *cr = 0; struct hci_request rq = { 0 };

struct { 
     uint16_t handle; 
     uint16_t flush_timeout; 
    } cmd_param; 

    struct { 
     uint8_t status; 
     uint16_t handle; 
    } cmd_response; 

    // find the connection handle to the specified bluetooth device 
    cr = (struct hci_conn_info_req*) malloc(
       sizeof(struct hci_conn_info_req) + 
       sizeof(struct hci_conn_info)); 
    bacpy(&cr->bdaddr, ba); 
    cr->type = ACL_LINK; 
    dev_id = hci_get_route(NULL); 
    dd = hci_open_dev(dev_id); 
    if(dd < 0) { 
     err = dd; 
     goto cleanup; 
    } 

    err = ioctl(dd, HCIGETCONNINFO, (unsigned long) cr); 
    if(err) goto cleanup; 

    // build a command packet to send to the bluetooth microcontroller 
    cmd_param.handle = cr->conn_info->handle; 
    cmd_param.flush_timeout = htobs(timeout); 
    rq.ogf = OGF_HOST_CTL; 
    rq.ocf = 0x28; 
    rq.cparam = &cmd_param; 
    rq.clen = sizeof(cmd_param); 
    rq.rparam = &cmd_response; 
    rq.rlen = sizeof(cmd_response); 
    rq.event = EVT_CMD_COMPLETE; 

    // send the command and wait for the response 
    err = hci_send_req(dd, &rq, 1); 
    if(err) goto cleanup; 

    if(cmd_response.status) { 
     err = -1; 
     errno = bt_error(cmd_response.status); 
    } 

cleanup: 
    free(cr); 
    if(dd >= 0) close(dd); 
    return err; 
} 

私のミスで何 誰もが知っていますか?私の問題を解決する別のオプション。 コード例も

+0

あなたが表示されているコードが正しいようです。 「うまくいかない」という意味を明確にすることはできますか?応答のステータスコードは何ですか?タイムアウトに使用しようとしている価値は何ですか?タイムアウトの単位はスロット(625マイクロ秒)にあり、最大値は0x7ffです。 – TJD

+0

"それは動作しません"という意味です。 "err = ioctl(dd、HCIGETCONNINFO、(unsigned long)cr);" 私はerr = -1となり、何らかの問題があることを意味します。 私はさまざまなタイムアウト値(すべて正しい範囲内)で試していますが、それらはすべて-1を返します。 – eranre

答えて

1

!!素晴らしい!!

おかげで自動に設定するには、このコードになりますフラッシュタイムアウトが正しいようです。 このコマンドのコマンド完了イベントに応答して、「成功」になっていることを確認してください。

パケットの送信コードに問題がある可能性がありますが、自動フラッシュタイムアウトを有効にするには、個々のパケットに自動的にフラッシュ可能とマークする必要があります.HCIデータパケットには、Packet_Boundary_Flag個々のパケットがフラッシュ可能な場合

また、Flushタイムアウトは、パケットが送信試行を取得するのに十分な時間を確保するために十分な大きさでなければならず、フラッシュタイムアウトが定義されている方法により、パケットが送信されなくても一度、あなたはそれを調整する必要があります。定義により、パケットが送信のためにキューに入れられたときに、フラッシュタイムアウトが開始されます。

+0

問題は初期段階です。フラッシュタイムアウトを設定しても機能しません。コマンド "err = ioctl(dd、HCIGETCONNINFO、(unsigned long)cr);" -1を返します。 – eranre