取消L2CAP套接字上的重新传输

时间:2012-03-15 15:39:17

标签: sockets bluetooth ioctl hci l2cap

我想知道是否有人可以帮助我解决我使用C蓝牙编程(Linux Bluez)的问题。 我使用的是Ubuntu 10.04,BlueZ 4.60。 我的目标是建立一个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;
}

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

我的错误是什么? 有谁知道另一个可以解决我的问题的选项。 代码示例也很棒!!

谢谢!

1 个答案:

答案 0 :(得分:1)

设置自动刷新超时的代码似乎是正确的。 您可以确保在响应此命令的命令完成事件时获得“成功”。

我怀疑问题可能出在您的数据包发送代码中,请注意,为了使自动刷新超时生效,应将各个数据包标记为自动刷新,HCI数据包具有您可以发送的Packet_Boundary_Flag以指示是否个别数据包可以冲洗。

另请注意,Flush超时必须足够大以允许足够的时间以使数据包获得传输尝试,定义刷新超时的方式可以导致数据包被刷新,即使数据包没有被传输,所以你需要调整它。根据定义当数据包排队进行传输时,刷新超时开始。