所以我目前正在开发一个实现 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 的截图