连接多从机例程里,创建连接超时用 0xFFFF应该会断开所有连接吧,这不会导致断开已有连接吗?可以只断开创建失败的连接吗?
if(events & ESTABLISH_LINK_TIMEOUT_EVT) { GAPRole_TerminateLink(INVALID_CONNHANDLE); return (events ^ ESTABLISH_LINK_TIMEOUT_EVT); }
连接多从机例程里,创建连接超时用 0xFFFF应该会断开所有连接吧,这不会导致断开已有连接吗?可以只断开创建失败的连接吗?
if(events & ESTABLISH_LINK_TIMEOUT_EVT) { GAPRole_TerminateLink(INVALID_CONNHANDLE); return (events ^ ESTABLISH_LINK_TIMEOUT_EVT); }
建立连接后是会分配不同的连接给不同的handle,在断开连接的时候同样需要调用该handle进行断开。因此是在填写为对应handle则对应的连接断开,GAPRole_TerminateLink,直接传入0xFF是没有意义的。
这个不是连接建立成功后执行断开连接的任务,而是创建连接超时后执行的。
GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE, ?????????????????????????????DEFAULT_LINK_WHITE_LIST, ?????????????????????????????centralDevList[i].addrType, ?????????????????????????????centralDevList[i].addr); tmos_start_task(centralTaskId,?ESTABLISH_LINK_TIMEOUT_EVT,?ESTABLISH_LINK_TIMEOUT);
case?GAP_LINK_ESTABLISHED_EVENT: { ????tmos_stop_task(centralTaskId,?ESTABLISH_LINK_TIMEOUT_EVT);
if(events?&?ESTABLISH_LINK_TIMEOUT_EVT) { ????GAPRole_TerminateLink(INVALID_CONNHANDLE); ????return?(events?^?ESTABLISH_LINK_TIMEOUT_EVT); }
而且0xFFFF也是在头文件有定义的,所以是废弃了?
/** @defgroup GAP_CONN_HANDLE_DEFINES GAP Special Connection Handles
* Used by GAP_TerminateLinkReq()
* @{
*/
#define GAP_CONNHANDLE_INIT ? ? ? ? ? ? ? ? ? ? 0xFFFE ?//!< terminates a link create
#define GAP_CONNHANDLE_ALL ? ? ? ? ? ? ? ? ? ? ?0xFFFF ?//!< terminates all links for the matching task ID.
/** @} End GAP_CONN_HANDLE_DEFINES */
所以现在问题的关键是,如何在没有获取到handle的时候,断开连接。
最后,这个是例程中的代码,如果是超时断开有意义的,希望能提供一个对多从机的解决方案。
如果没有意义,那我就把这部分代码删除了
蓝牙建立连接是一个过程。在建立连接的过程中(此时还没有完全建立连接),也就是打印Connecting...的地方。这里还没有分配连接的handle。如果连接超时没有成功建立连接,则会由主机主动发起断开,也就是调用GAPRole_TerminateLink(INVALID_CONNHANDLE)。
如果蓝牙已经建立连接,也就是打印Connected...的地方,则不同的连接会分配不同的handle。在彻底建立连接后,需要断开则需要传递在建立连接地方的handle,如果传输INVALID是无法断开连接的。
针对你的问题,INVALID_CONNHANDLE会断开当前连接过程中的连接,理论上不会断开已经建立连接(因为已有建立连接会重新分配handle)。
上面你的说法,在建立连接过程中使用INVALID_CONNHANDLE进行断开是没问题的。如依此思路使用存在问题,可以发送邮件至邮箱lpc@wch.cn,我们这里进行查看。