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;
}
私の間違いは何ですか?私の問題を解決する別のオプションを知っている人はいますか。コード例も素晴らしいでしょう!!
ありがとう!!