【问题标题】:Why cant I connect to the hands free service on my device?为什么我无法连接到设备上的免提服务?
【发布时间】:2018-09-06 14:27:25
【问题描述】:

我的 gear s2 手表 (tizen 2.3.2) 使用 Tizen 蓝牙 API 通过蓝牙连接到我的三星 Galaxy s3 (android 4.3)。据我了解,使用手机的 MAC 地址,我能够“发现”16 个不同的 UUID,包括 0000111F-0000-1000-8000-00805F9B34FB,即 HFP 服务的 UUID。但是当我尝试连接到该服务时,我没有收到任何响应,无论是successCallback 还是errorCallback。有趣的是,对串口 UUID(1101)做同样的事情,当我的手机接到电话或短信时,我可以连接到服务,甚至可以通过套接字获取消息,没问题。那么,为什么我在尝试连接免提服务 (UUID 111F) 时没有得到响应?
这是我正在使用的代码:

function getPhoneBatteryLevel()
{
    try {
        writeLog("Initializing.");          
        bluetoothAdapter = tizen.bluetooth.getDefaultAdapter();
        bluetoothAdapter.getDevice("50:A4:C8:D4:95:E2",onGetDeviceSuccess,onGetDeviceError);
        writeLog("Looking for device.");
    }
    catch (err)
        {writeLog("getPhoneBatteryLevel-ERROR:"+err);}
}

function onGetDeviceSuccess(device)
{
    try {
        if (device.isBonded && device.isConnected){
            writeLog("Found connected Device.");
            var uuidStr="";
            for (var i=0;i<device.uuids.length;i++)
                {
                    if (device.uuids[i].substr(4,4)==="111F")
                        {
                            uuidStr = device.uuids[i];
                            writeLog("Found UUID at "+i+":"+uuidStr);
                            break;
                        }
                }
            if (uuidStr.length>0)
                {
                    device.connectToServiceByUUID(uuidStr, onServiceConnectSuccess, onServiceConnectError);             
                    writeLog("Attempted Connect To Service.");
                }
        }
        else {
            writeLog("Device not connected.");
            }
    }
    catch (err)
        {writeLog("onGetDeviceSuccess-ERROR:"+err);}
}
function onServiceConnectSuccess(socket)
{
    writeLog("Connected to service UUID="+socket.uuid);
}

运行此代码后,我的日志文件如下所示:

Initializing. 
Looking for device. 
Found connected Device.
Found UUID at 6:0000111F-0000-1000-8000-00805F9B34FB
Attempted Connect To Service.

就是这样......我希望/希望在通过successCallback成功连接时看到“连接到服务UUID = 0000111F-0000-1000-8000-00805F9B34FB”..或至少写入类似的错误通过errorCallback登录,但我都没有。然而,免提服务似乎正在手机上运行。当然,当手机在我的车里时,免提功能可以正常工作,所以我知道手机支持它。我哪里错了?

更新:经过几次测试,我有了一些额外的线索。我有两台设备:iPhone S5 (iOS 11.2.6) 和 Galaxy S3 (android 4.3)。在“发现”并连接到每个服务之后,我能够遍历服务(uuid)。 0x111F 在两者上。这两种设备还有其他几个共同的 uuid。我尝试在两台设备上连接到所有这些常用服务。与这两种设备相关的结果是相同的——在这两种设备上,我都能够连接到一些服务,在其他设备上出现 NotFound 错误,而在我真正感兴趣的设备上,我根本没有收到任何回调。所以,请允许我完善我的问题。我能够连接到我的两台设备共有的以下服务:110A [A2DP]、110C [AVRCP]、112F [PBAP]、1132[MAP]

但是,即使 UUID 0x1200 在两个设备的可用 UUIDS 列表中,对我尝试连接到服务的响应也会调用我的 errorCallBack 例程,并出现“未找到”错误。这发生在两个设备上。为什么它在有效 UUID 列表中时找不到?

最令人失望的是(无论如何对我来说),当我尝试连接到免提配置文件服务 0x111F 时,我仍然没有得到任何响应(没有成功回调和错误回调)。为什么我不会收到响应 - 无论是成功回调还是错误回调?

【问题讨论】:

  • 您可以从 Tizen Studio 查看蓝牙示例应用程序
  • 谢谢!该示例很有帮助,因为它确认了我正在尝试做的事情,但并没有帮助我理解为什么找不到 0x111F。我确实多玩了一点,得到了更多的线索。我用这个附加信息编辑了我原来的问题。
  • 在 111F 的情况下,我收到 Not Found 消息 .... 而对于 112F,我可以通过调用 readData 函数进行连接,但只能获得“[]”!虽然我在我的 Galaxy S6 手机中收到一条弹出消息以允许电话簿(112F)
  • 感谢您的尝试!你得到不同的结果给了我新的希望。您介意发布您使用的代码吗?我想看看我做了什么不同的事情。另外,我看到您使用 Galaxy S6 进行了测试……这是来自 Galaxy Gear s2 还是 s3?如果是这样,我假设您使用了 Tizen 蓝牙 API,是吗?顺便说一下,112F 是电话簿访问配置文件。在那种情况下,我得到的结果和你一样。

标签: bluetooth tizen rfcomm spp hfp


【解决方案1】:

我尝试将 Gear S3 连接到我的 Galaxy S6 Edge 的免提服务。起初我试图获取我设备的可用服务列表。我找到了一个 uuid 列表。这是这些的前缀

1103
1105
110A
110C
1112
1115
1116
111F
112D
112F
1200

我看到这里有 111F。我以为我能把它连接起来。 此日志显示在connectToServiceByUUID 的错误回调中

Error while connecting: 0000111F-0000-1000-8000-00805F9B34FB service Not found 

之后我尝试使用 112F(即电话簿访问配置文件)。在这种情况下,我已成功连接到服务并在我的 S6 Edge 上收到一条弹出消息以允许请求(这意味着代码是正确的)。但是我通过调用readData函数发现了空数据。

Entered BluetoothDevice.connectToServiceByUUID()
socket connected on service 0000112F-0000-1000-8000-00805F9B34FB 
Opened connection to remote device Galaxy S6 edge 
Entered BluetoothSocket.readData()
[] 

我的主要代码 sn-p 在这里, var 适配器 = tizen.bluetooth.getDefaultAdapter();

    adapter.getDevice('08:EE:8B:40:E9:38', onBondingSuccessCallback, onErrorCallback);

       function onBondingSuccessCallback(device) { 
              console.log(device.uuids.join("\n"));
              var serviceUUID = '0E4D4A34-00A0-B708-EAAC-6043A45596ED';
              device.connectToServiceByUUID(serviceUUID,function(sock{
              console.log('socket connected on service '+ serviceUUID);
              console.log ("Opened connection to remote device " + sock.peer.name);
             console.log(sock.readData());
           // socket = sock;
             console.log ("The socket is " + sock.state + " and service's UUID to which it is connected is  " + sock.uuid);
        }, function(error) {
             console.log('Error while connecting: '+ serviceUUID+ ' service ' + error.message);
        });
    }

    function onErrorCallback(e) {
        console.log('Cannot get a bonded device , reason: ' + e.message);
    }

后来我尝试使用三星 Z3 而不是 S6 Edge。结果是一样的。所以我不确定 API 是否有问题或者我做错了什么。当您要求发布我的代码时,我已将其发布为答案。

【讨论】:

  • 感谢您发布此信息!我试着运行你的代码。一个问题是,在匿名函数中,您在 sock 参数之后缺少“)”。而且,我假设您正在尝试连接到我不认识的其他服务。除了这些小事之外,我能够运行您的代码,但得到的结果略有不同......再次,而不是尝试 111F 时的错误回调,我根本没有得到任何响应。在其他地方,比如 112F,我确实得到了回应。顺便说一句,您的读取应该只在调用 socket.onMessage 时完成。电话簿配置文件可能会要求您在发送消息之前发送数据。
  • 我认为我们要去的地方是错误的,对于HFP,在建立服务连接之前有一些要求。我正在阅读 HFP 1.7 specification 。相关部分从 4.2 开始。
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 2014-12-28
  • 2011-10-11
  • 1970-01-01
  • 2019-05-17
  • 2022-01-15
  • 2015-11-22
  • 2021-09-18
相关资源
最近更新 更多