你如何在 BLUEZ 中使用 SCO?

How you use SCO in BLUEZ?

我尝试使用 Bluez 的 SCO。我按照这个例子:https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/tools/scotest.c

我的代码看起来像这样:

sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET | SOCK_NONBLOCK, BTPROTO_SCO);
if (sk < 0) {
    syslog(LOG_ERR, "Can't create socket: %s (%d)",
                        strerror(errno), errno);
    return -1;
}


/* Connect to remote device */
memset(&addr, 0, sizeof(addr));
addr.sco_family = AF_BLUETOOTH;
str2ba(svr, &addr.sco_bdaddr);

if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    syslog(LOG_ERR, "Can't connect: %s (%d)",
                        strerror(errno), errno);
}

/* Get connection information */
memset(&conn, 0, sizeof(conn));
optlen = sizeof(conn);

if (getsockopt(sk, SOL_SCO, SCO_CONNINFO, &conn, &optlen) < 0) {
    syslog(LOG_ERR, "Can't get SCO connection information: %s (%d)",
                        strerror(errno), errno);
}


if( recv(sk,buffer, bufferSize,0) < 0) {
    syslog(LOG_ERR, "Can't read: %s (%d)",
                        strerror(errno), errno);
}

每当我尝试读取数据时都会收到错误消息:“无法读取:函数未实现 (38)” 当我尝试使用 getsockopt 时,我收到一条错误消息,指出传输端点未连接。

不知道如何解决。我使用 Ubuntu 20.04 和 bluetoothd -v == 5.53

HFP SLC应该在SCO连接之前建立。 HFP Service Level Connection (SLC) 将由 oFono 建立,写入 SCO 数据由 pulseaudio 实现。

首先确保 HFP 配置文件已连接,然后您可以尝试使用上面的代码。