Не удается получить соединение Bluetooth SCO для работы на Android

Поэтому в настоящее время я разрабатываю службу Android, которая реализует профиль HFP для последующего использования с графическим интерфейсом, я смог успешно и легко реализовать часть RFCOMM, куда отправляются AT-команды, такие как ATA(прием вызова), но я застрял с Прием аудио соединения SCO в приложении. так что в основном я тестирую с ролью Iphone AG и ролью HF на андроидном планшете, которая запускает мое приложение, чтобы открыть соединение SCO, я пытался вызвать AudioMAnager.startBluetoothSco(); без какой-либо удачи, и даже сделал сокет-сервер Bluetooth SCO в C, используя ndk, который прослушивает соединение. но реальная проблема заключается в том, что Iphone, похоже, не пытается соединиться с гнездом sco, поэтому я сбросил трафик с планшета Android и увидел, что, когда Iphone запрашивает соединение SCO, android hci автоматически отвечает Отклонение причины: соединение отклонено из-за ограниченных ресурсов (0x0d), что бы я ни делал, может я что-то упустил? есть идеи? Благодарю. забыл упомянуть, что оба устройства сопряжены с помощью приложения настроек os, и соединение устанавливается путем подключения к планшету Android из приложения родных настроек ios.

AudioHandler.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);

}

все работает без ошибок, и я вижу строку "LIsening for SCO Connection ", но она никогда не принимает, потому что Android hci отклоняет соединение, прежде чем что-либо может быть сделано... скриншот из wireshark

0 ответов

Другие вопросы по тегам