总是断开连接是什么情况?
使用btool连接从机,连接上以后使用discovery char by uuid 之后,连接就断开了,原因是超时。为什么?
下面是收到的数据
[1] : <Rx> - 01:24:01.859
-Type : 0x04 (Event)
-EventCode : 0xFF (HCI_LE_ExtEvent)
-Data Length : 0x06 (6) bytes(s)
Event : 0x0509 (ATT_ReadByTypeRsp)
Status : 0x14 (Can't Perform Function When Not In A Connection)
ConnHandle : 0x0000 (0)
PduLen : 0x00 (0)
Dump(Rx):
04 FF 06 09 05 14 00 00 00
------------------------------------------------------------------------------------------------------------------------
[2] : <Info> - 01:24:01.875
Device Disconnected
Handle = 0x0000
Addr Type = 0x00 (Public)
BDAddr = 88:33:14:DD:8A:63
------------------------------------------------------------------------------------------------------------------------
[3] : <Rx> - 01:24:01.875
-Type : 0x04 (Event)
-EventCode : 0xFF (HCI_LE_ExtEvent)
-Data Length : 0x06 (6) bytes(s)
Event : 0x0606 (GAP_TerminateLink)
Status : 0x00 (Success)
ConnHandle : 0x0000 (0)
Reason : 0x08 (Supervisor Timeout)
Dump(Rx):
04 FF 06 06 06 00 00 00 08
------------------------------------------------------------------------------------------------------------------------
还发现了 有时候底层会调用GAP_UpdateLinkParamReq ,但是有时候却不会,如果调用了更新的话这边连接时间长一点~但是也会断开,这是什么原因呢?
admsadm,
你的supervision timeout时间应该设置长一点。
这个在BTool上也可以设置。记得设置好以后按一下set按钮。
GAP_UpdateLinkParamReq ()这个取决于你的外设端,有没有把DEFAULT_ENABLE_UPDATE_REQUEST设置成TRUE。
hi YAN
谢谢你的回答,但是我还有一些问题。
supervision timeout我设置成最大过的,问题还是存在,DEFAULT_ENABLE_UPDATE_REQUEST 这边默认是TRUE的。
不过我现在问题已经解决,是等到从机设备启动事件以后再进行连接,这样的话没有出现supervision timeout 这样的事情。
然后主机这也会出现Param Update ,
static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )
{
...
case GAP_LINK_PARAM_UPDATE_EVENT:
{
LCD_WRITE_STRING( "Param Update", HAL_LCD_LINE_1 );
SerialPrintString("Param Update\r\n");
}
break;
...
}
我的问题是,DEFAULT_ENABLE_UPDATE_REQUEST 一直是默认的,那为什么我从机这边会没有Param Update呢?
admsadm,
你的情况是正常的。
从机的DEFAULT_ENABLE_UPDATE_REQUEST 设置成TRUE,从机就会发送param update的一个请求,所以主机能收到GAP_LINK_PARAM_UPDATE_EVENT。
然而蓝牙协议栈规定,真正的param update更新这个动作是只能由主机来做的,从机不能做,所以从机这边没这个事件。。。
hi Yan
我在主机中查找了一下这个更新动作,是不是这个函数,如下
static void simpleBLECentral_HandleKeys( uint8 shift, uint8 keys )
{
...
if ( keys & HAL_KEY_RIGHT )
{
SerialPrintString(" [KEY RIGHT pressed!]\r\n");
// Connection update
if ( simpleBLEState == BLE_STATE_CONNECTED )
{
GAPCentralRole_UpdateLink( simpleBLEConnHandle,
DEFAULT_UPDATE_MIN_CONN_INTERVAL,
DEFAULT_UPDATE_MAX_CONN_INTERVAL,
DEFAULT_UPDATE_SLAVE_LATENCY,
DEFAULT_UPDATE_CONN_TIMEOUT );
}
}
...
}
但是这个是按键更新啊,我没有用按键来更新怎么会有param update。或者这个更新动作最终是在协议栈里面完成的么?
admsadm,
你看一下simpleBLEPeripheral里面 DEFAULT_ENABLE_UPDATE_REQUEST 是否为TRUE.
这个为TRUE的话peripheral会自动请求(注意,是请求,不是主动更新)central去更新连接参数。
谢谢 你的回答,大致已经明白了
Hi Yan,
1、在初始化函数SimpleBLEPeripheral_Init里面,有配置scanRspData的参数,GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );,然后在Slave和Master连接的过程,当Master请求扫描的时候,Slave用scanRspData[] 响应,scanRspData[] 里面有interval和latency等参数。流程大概是这样吗?
2、如果是,那DEFAULT_ENABLE_UPDATE_REQUEST 设置是否为TRUE如何影响Slave是否提出参数更新的请求
3、当peripheral请求central去更新连接参数的时候,central有权利决定是否更新,是否更新在central代码里面哪里能体现出来呢?
HI admsadm:
想请教一下,我遇到了一样的discovery services就断开的一个情况,想请问题你原先是怎么解决这个问题的?你说的从机设备启动事件后是什么意思?