0

所以我目前正在开发一个实现 HFP 配置文件以供以后与 gui 一起使用的 android 服务,我能够成功且轻松地实现发送 AT 命令(如 ATA(accep 调用))的 RFCOMM 部分,但我坚持接受应用程序上的音频 SCO 连接。所以基本上我使用 Iphone AG Role 和运行我的应用程序的 android 平板电脑 HF Role 进行测试,打开 SCO 连接我尝试调用 AudioMAnager.startBluetoothSco(); 没有任何运气,甚至使用 ndk 在 C 中制作了一个蓝牙 SCO 套接字服务器,它监听连接。但实际问题是 Iphone 似乎没有尝试连接 sco 套接字,所以我从 android 平板电脑中转储了流量,并看到当 Iphone 请求 SCO 连接时,android hci 会自动响应 Reject of reason:Connection Rejected due to Limited Resources (0x0d) ,无论我做什么,也许我错过了什么?有任何想法吗?谢谢。忘了提到这两个设备是使用 os 设置应用程序配对的,并且连接是通过从 ios 的本机设置应用程序连接到 android 平板电脑建立的。

音频处理程序.java

public class AudioHandler implements Runnable{
static
{
    System.loadLibrary("libsco");
}

@Override
public void run()
{
    AudioManager amanager = (AudioManager) Common.APPCONTEXT.getSystemService(Context.AUDIO_SERVICE);

    amanager.setMode(AudioManager.MODE_IN_COMMUNICATION);
    amanager.startBluetoothSco();
    amanager.setBluetoothScoOn(true);


    if(amanager.isBluetoothScoOn())
    {
        int status= this.SCOINIT();
        Log.d("SCO","SCOFinished");
    }


    /*while(Common.isCallActive)
    {
        play(stream.readbytes());
    }
        this.SCOCLOSE();
        amanager.stopBSCO();
    */



}

private native int SCOINIT();}

libsco.c

void init() {
struct sockaddr_sco addr = {0}, remoteadress = {0};

int SCOServer, SCOClient;


SCOServer = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);

if (SCOServer < 0) {
    __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "SCO socket create failed.");
    print("SCO socket create failed.");
}

addr.sco_family = AF_BLUETOOTH;
bacpy(&addr.sco_bdaddr, BDADDR_ANY);

if (bind(SCOServer, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    print("failed to bind sco.");

}

if (listen(SCOServer, 1)) {
    print("Listening Failed!!");
} else {
    print("Listening for SCO connection.");

}

socklen_t addrlength = sizeof(remoteadress);

SCOClient = accept(SCOServer, (struct sockaddr *) &remoteadress, &addrlength);


if (SCOClient < 0) {
    print("Accept Failed!!");
    close(SCOClient);

} else {
    print("Conected.\n");
    close(SCOClient);
}


close(SCOServer);

}

一切运行都没有错误,我可以看到“LIstening for SCO Connection”行,但它从不接受,因为 android hci 在任何事情都可以完成之前拒绝连接...... 来自 wireshark 的截图

4

0 回答 0