簡體   English   中英

取消L2CAP套接字上的重傳

[英]Cancelling retransmissions on a L2CAP socket

我想知道是否有人可以協助我解決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; } 

我怎么了 有誰知道解決我問題的另一種選擇。 代碼示例也將很棒!

謝謝!!

設置自動刷新超時的這段代碼似乎是正確的。 您可以通過確保響應此命令的命令完成事件而獲得“成功”來確保。

我懷疑問題可能出在您的數據包發送代碼中,請注意,要使自動刷新超時生效,單個數據包應標記為可自動刷新。HCI數據包具有Packet_Boundary_Flag,您可以發送該數據包以指示單個數據包是否可沖洗的。

還要注意,刷新超時必須足夠大,以留出足夠的時間,以便數據包能夠進行傳輸嘗試,定義刷新超時的方式可能導致即使沒有一次傳輸數據包也將刷新數據包,因此您需要調整它。 根據定義,當數據包排隊等待傳輸時,刷新超時開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM