Отмена повторных передач на сокете L2CAP - PullRequest
1 голос
/ 15 марта 2012

Мне было интересно, может ли кто-нибудь помочь мне с проблемой, с которой я сталкиваюсь при программировании на C Bluetooth (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 };</p> <pre><code> 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 Ответ

1 голос
/ 15 марта 2012

Этот код для установки времени автоматического сброса представляется правильным.Вы можете убедиться в этом, убедившись, что вы получаете сообщение «Success» в ответ на событие завершения команды этой команды.

Я подозреваю, что проблема может быть в вашем коде отправки пакета, обратите внимание, что для тайм-аута автоматического сброса необходимо принятьэффект, что отдельные пакеты должны быть помечены как автоматически сбрасываемые, пакет данных HCI имеет Packet_Boundary_Flag, который вы можете отправить, чтобы указать, являются ли отдельные пакеты сбрасываемыми.

Также обратите внимание, что время ожидания сброса должно быть достаточно большим, чтобывремени, достаточного для того, чтобы пакеты получили попытку передачи, способ определения времени ожидания сброса может привести к сбросу пакета, даже если пакет не был передан ни разу, поэтому вам необходимо настроить его.По определению время ожидания сброса начинается, когда пакет помещается в очередь для передачи.

...