CH573 CH582 CH579 peripheral通用外设讲解 演示设备主动断开连接
顾名思义,在实际使用中可能需要从机主动与主机的连接,重新进入广播状态或者睡眠状态等,以下示例从原理和实现角度讲述从机主动断开连接具体过程。
从机主动断开连接很简单,LIB提供了接口函数可以直接调用。
/** * @brief Terminates the existing connection. * * @return SUCCESS or bleIncorrectMode */ extern bStatus_t GAPRole_TerminateLink( uint16_t connHandle );
关于该函数的使用,举个简单的例子(以peripheral 为例程)
//peripheral例子中定义了一个结构体用于保持连接信息,具体如下,其中connHandle 连接的handle值在断开连接时需要用到 typedef struct { uint16_t connHandle; // Connection handle of current connection uint16_t connInterval; uint16_t connSlaveLatency; uint16_t connTimeout; } peripheralConnItem_t; // Connection item list static peripheralConnItem_t peripheralConnList;
连接参数是在连接刚刚建立时获取并保存下来的
有了连接handle值后就可以随时调用 GAPRole_TerminateLink(uint16_t connHandle)主动断开连接
以下演示一种实现
在连接参数更新时,10s后启动断开连接的任务
if(events & SBP_DISCONNECT_EVT) { PRINT("peripheral 主动断开\r\n"); GAPRole_TerminateLink(peripheralConnList.connHandle); return (events ^ SBP_DISCONNECT_EVT); }
当任务开始执行,会进入BLE的状态回调函数 static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEvent_t *pEvent),并打印具体断连原因
对应具体的断连原因是0x16
0x16的断连原因在协议文档的具体解释是
顺便看下BLE分析仪 WCH_BLEAnalyzer.zip - 南京沁恒微电子股份有限公司 )抓包的的数据
从机发给主机的断连原因0x13(注意上图抓包的方向S->M)
所以592主动调用断开,592显示的断连原因是0x16
主机端显示的断连原因是592发给主机的,0x13