连接失败时没有收到BLE_EVT_GAP_CONNECTION_COMPLETED事件

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.wsdof.com/support.我们将在未来几天修复bug /优化搜索和标记。
9个帖子/ 0个新
最后发表
apoudret
离线
最后看到:1年7个月前
加入:2017-09-22 08:33
连接失败时没有收到BLE_EVT_GAP_CONNECTION_COMPLETED事件

你好,
我正试图连接到一个不存在的地址:

Bd_address_t peer_addr = {
.addr_type = PUBLIC_ADDRESS,
.addr={0x21, 0x21, 0x21, 0x21, 0x21, 0x21}
};
ble_gap_connect (&peer_addr &conn_params);

因为连接应该失败(没有这个地址的设备),我希望得到一个连接失败事件,就像ble_gap_connect()的文档说:

此调用发起到指定设备的直接连接过程。申请将得到[…]a::BLE_EVT_GAP_CONNECTION_COMPLETED事件,当连接过程成功或错误完成。

我的问题是,在ble_gap_connect()调用之后,我没有得到这个事件(或任何事件)。然而,我在成功连接时得到BLE_EVT_GAP_CONNECTION_COMPLETED事件。

设备:
PM_Dialog
离线
最后看到:1天9小时前
工作人员
加入:2018-02-08 11:03
嗨apoudret,

嗨apoudret,

您能否为它配置一个专用的BD地址,并检查在连接成功或失败时是否能够获得BLE_EVT_GAP_CONNECTION_COMPLETED事件?如果你仍然无法得到这个事件,你可以让我知道在不成功的连接中你得到了哪个错误?

谢谢,PM_Dialog

apoudret
离线
最后看到:1年7个月前
加入:2017-09-22 08:33
你好PM_Dialog,

你好PM_Dialog,

我最初测试的是公共地址。
我刚刚尝试使用一个私人地址的设备,我得到了相同的行为:
-如果地址是有效的,ble_gap_connect()返回BLE_STATUS_OK和我得到GAP_CONNECTION_COMPLETED事件
-如果地址无效,ble_gap_connect()仍然返回OK BLE_STATUS_OK,但我没有得到GAP_CONNECTION_COMPLETED事件

顺便说一下,我注意到一件事
-我的外围设备关机了。我试着用我的中心设备连接外围设备。我调用了ble_gap_connect(),但是没有事件。
-我在30秒后启动了我的外围设备。我在我的中心设备上获得了连接成功事件。
这意味着在整个30秒内,中心设备试图连接:它没有超时。

PM_Dialog
离线
最后看到:1天9小时前
工作人员
加入:2018-02-08 11:03
嗨apoudret,

嗨apoudret,

30秒是根据BLE规格,在这段时间内,设备正在尝试连接外设。请您澄清一下,如果您仍然无法获得BLE_EVT_GAP_CONNECTION_COMPLETED事件?

谢谢,PM_Dialog

apoudret
离线
最后看到:1年7个月前
加入:2017-09-22 08:33
你好PM_Dialog,

你好PM_Dialog,

你的答案似乎不准确:如果我等了5分钟才打开外围设备(而不是30秒),一旦外围设备打开,中央设备仍然能够连接。
你能给我指出BLE规范中规定这30秒的部分吗?

我仍然无法获得BLE_EVT_GAP_CONNECTION_COMPLETED事件。ble_gap_connect()永远不会超时。

最好的问候,
安迪

PM_Dialog
离线
最后看到:1天9小时前
工作人员
加入:2018-02-08 11:03
嗨apoudret,

嗨apoudret,

抱歉,我不明白你说的30秒是什么意思。我以为你要等30秒才能连接,而不是30秒后才打开外设。通常,根据BLE规范,最大超时时间是30秒,但在您的情况下,我不知道超时发生在哪个级别。关于你不能获得BLE_EVT_GAP_CONNECTION_COMPLETED事件的事实,首先你必须获得BLE_EVT_GAP_CONNECTED,然后如果连接过程成功或失败,你将获得BLE_EVT_GAP_CONNECTION_COMPLETED事件。因此,如果你试图连接到一个无效的BD地址,你永远不会得到BLE_EVT_GAP_CONNECTION_COMPLETED只要你从未收到BLE_EVT_GAP_CONNECTED。

谢谢,PM_Dialog

apoudret
离线
最后看到:1年7个月前
加入:2017-09-22 08:33
你好PM_Dialog,

你好PM_Dialog,

你说“如果你试图连接到一个无效的BD地址,你永远不会得到BLE_EVT_GAP_CONNECTION_COMPLETED,只要你从来没有收到BLE_EVT_GAP_CONNECTED”。

但是如果你看一下ble_gap_connect()方法的文档,它说:
“该申请将得到……a::BLE_EVT_GAP_CONNECTION_COMPLETED事件当连接过程成功完成或带有错误(在第二种情况下,::BLE_EVT_GAP_CONNECTED将不会被接收)."

由于我试图连接到一个无效的BD地址,当连接过程应该失败时,我应该得到一个GAP_CONNECTION_COMPLETED。

你说“根据BLE规范,最大超时时间是30秒”。
如果这是真的,这意味着您的SDK不遵循BLE规范,因为我没有得到任何超时,甚至在5分钟后。

最好的问候,
安迪

PM_Dialog
离线
最后看到:1天9小时前
工作人员
加入:2018-02-08 11:03
嗨apoudret,

嗨apoudret,

当您试图连接到一个无效的BD地址的外设时,扫描过程不会停止,因此您不会得到BLE_EVT_GAP_CONNECTED或BLE_EVT_GAP_CONNECTION_COMPLETED事件。如果显式调用ble_gap_connect_cancel(),那么扫描过程将停止,您将获得BLE_EVT_GAP_CONNECTION_COMPLETED事件,错误状态为0x12(由用户终止)。如果您不明确地停止扫描过程,中央设备将继续扫描,您将不会得到任何事件。也许ble_gap_connect()函数的注释有点误导人。

谢谢,PM_Dialog

apoudret
离线
最后看到:1年7个月前
加入:2017-09-22 08:33
你好PM_Dialog,

你好PM_Dialog,

谢谢你的回答。我将启动一个任务,该任务将在X秒后调用ble_gap_connect_cancel()。

安迪