你好,
我正试图连接到一个不存在的地址:
Bd_address_t peer_addr = {
.addr_type = PUBLIC_ADDRESS,
.ddr = {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事件。
设备:
嗨apoudret,
你能不能用一个私有的BD地址配置它,并检查当连接成功或失败时,你是否能够得到BLE_EVT_GAP_CONNECTION_COMPLETED事件?如果您仍然无法获得此事件,请让我知道在不成功的连接中您得到了哪个错误?
谢谢,PM_Dialog
你好PM_Dialog,
我最初的测试是公共地址。
我刚刚尝试使用一个带有私人地址的设备,我得到了相同的行为:
-如果address是有效的,ble_gap_connect()返回BLE_STATUS_OK,我得到GAP_CONNECTION_COMPLETED事件
-如果地址无效,ble_gap_connect()仍然返回OK BLE_STATUS_OK,但我没有得到GAP_CONNECTION_COMPLETED事件
顺便说一下,我注意到一件事
-我的外围设备关闭了。我试着用中心设备连接外围设备。我调用了ble_gap_connect(),但没有得到事件。
- 30秒后,我在外围设备上电动。我在我的中央设备上得到了成功的事件。
这意味着在整个30秒内,中心设备试图连接:它没有超时。
嗨apoudret,
30秒是根据BLE规格,在这段时间内,设备正在尝试连接外设。请问您是否仍然无法获得BLE_EVT_GAP_CONNECTION_COMPLETED事件?
谢谢,PM_Dialog
你好PM_Dialog,
你的回答似乎不准确:如果我等待5分钟打开外围设备(而不是30秒),中心设备仍然设法连接,一旦外围设备打开。
你能给我指出BLE规范中规定30秒的那部分吗?
我仍然无法获得BLE_EVT_GAP_CONNECTION_COMPLETED事件。ble_gap_connect()从不超时。
此致,
安迪
嗨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
你好PM_Dialog,
你说“如果你试图连接一个无效的BD地址,你将永远不会得到BLE_EVT_GAP_CONNECTION_COMPLETED,只要你从来没有收到BLE_EVT_GAP_CONNECTED”。
然而,如果你查看ble_gap_connect()方法的文档,它说:
“当成功完成连接过程时,应用程序将获得[...] :: ble_evt_gap_connection_Completed事件或者错误(在第二种情况下,::BLE_EVT_GAP_CONNECTED将不会被接收)."
因为我试图连接到一个无效的BD地址,当连接过程失败时,我应该得到一个GAP_CONNECTION_COMPLETED。
您说“根据BLE规范,最大超时为30秒”。
如果这是真的,这意味着你的SDK没有遵循BLE规范,因为我没有得到任何超时,即使在5分钟后。
此致,
安迪
嗨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
你好PM_Dialog,
谢谢你的回答。我将启动一个任务,它将在X秒后调用ble_gap_connect_cancel()。
安迪