2

C Bluetooth プログラミング (Linux Bluez) で私が抱えている問題について誰かが私を助けてくれるかどうか疑問に思っていました。Ubuntu 10.04、BlueZ 4.60 を使用しています。私の目標は、2 台のコンピューター間でデータを送信する際の遅延が最小限になる 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;
}

私の間違いは何ですか?私の問題を解決する別のオプションを知っている人はいますか。コード例も素晴らしいでしょう!!

ありがとう!!

4

1 に答える 1

1

自動フラッシュ タイムアウトを設定するこのコードは正しいようです。このコマンドのコマンド完了イベントに応答して「成功」を取得していることを確認することで確認できます。

問題はパケット送信コードにある可能性があると思われます。自動フラッシュ タイムアウトを有効にするには、個々のパケットを自動的にフラッシュ可能としてマークする必要があることに注意してください。HCI データ パケットには Packet_Boundary_Flag があり、個々のパケットが流せる。

また、フラッシュ タイムアウトは、パケットが送信を試行できるように、十分な時間を確保するために十分な大きさである必要があることに注意してください。調整する必要があります。定義によると、パケットが送信のためにキューに入れられると、フラッシュ タイムアウトが開始します。

于 2012-03-15T16:41:40.723 に答える