Не удается получить соединение 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