私はC Bluetoothプログラミング(Linux Bluez)の問題を誰かに助けてくれるのだろうかと思っていました。 私はUbuntu 10.04、BlueZ 4.60を使用しています。 私の目標は、2台のコンピュータ間でデータを送信するための遅延が最小限になるL2CAPソケットを持つことです。 これまでのところ、私は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;
}
私のミスで何 誰もが知っていますか?私の問題を解決する別のオプション。 コード例も
あなたが表示されているコードが正しいようです。 「うまくいかない」という意味を明確にすることはできますか?応答のステータスコードは何ですか?タイムアウトに使用しようとしている価値は何ですか?タイムアウトの単位はスロット(625マイクロ秒)にあり、最大値は0x7ffです。 – TJD
"それは動作しません"という意味です。 "err = ioctl(dd、HCIGETCONNINFO、(unsigned long)cr);" 私はerr = -1となり、何らかの問題があることを意味します。 私はさまざまなタイムアウト値(すべて正しい範囲内)で試していますが、それらはすべて-1を返します。 – eranre