CC2541 SimpleBLECentral工程建立连接后,无法发现服务及特征
SDK版本:BLE-CC254x-1.4.2.2
SimpleBLEObserver、SimpleBLEPeripheral两个工程可以正常跑通,SimpleBLECentral工程扫描广播正常,调用GAPCentralRole_EstablishLink后,可以收到连接建立事件,再发出发现服务命令后,无法正常进入simpleBLEGATTDiscoveryEvent回调,最后超时进入,pMsg->msg.findByTypeValueRsp.numInfo为0。
各位有遇到过这样的问题吗?
您是直接跑的例程?有修改过吗?
主机从机如果都是ti的254x、且使用默认协议栈,肯定没问题。
显然你有些必要说明的环境没有说清楚,例如主从机机协议栈是否做了改动、是否从机端是CC254X。
工程除了按键,PA设置,没有改过。从机设备不是CC2541,是一个已经量产的设备(手机可以正常连接),从机也是CC2541的实验过两天做实验。但是CENTRAL总不能只能连接CC2541的从机吧?
当然不是只能连CC2541。
举个例子,你跟张三一起跑步,但很快你就跟丢了张三。我跟张三一起跑步,一直在一起跑完全没问题。
问题来了,我跟张三一起跑步没问题,而你跟丢了张三,问题出在哪里?
反过来说蓝牙,你说你的手机跟CC2541从机没问题,但CC2541主机跟CC2541从机出问题了,你觉得问题出在哪里?
1、你跟丢张三的可能原因有两个:
1)你本身没跑起来。
2)你跟张三步调不统一。
2、CC2541主机跟CC2541从机出问题的可能原因有两个:
1)CC2541主机没正常跑起来。
2)CC2541主从机连接参数不统一。
如何分别排查以上两点蓝牙问题?
1)CC2541主机不变,从机换成CC2541官方代码。确保CC2541主机本身是可以正常运行的。
2)检查CC2541从机的连接参数与官方连接参数的差异。
谢谢提醒,让我想到了一个问题,连接之后不能下断点,只要主机停止运行,从机就断开了。
现在主机已经可以发现从机服务了,发现另一个问题,如果处于连接状态,主机调用GAPCentralRole_TerminateLink( 0xFFFF )可以快速的断开连接,但是如果此时把从机一下子断电,主机调用GAPCentralRole_TerminateLink( 0xFFFF )不起作用,一定要几十秒超时后方可收到GAP_LINK_TERMINATED_EVENT事件,请问这是什么原因?
1、你打电话过程中如果你随意睡着,你看对方挂不挂你电话?
所以,断点不能随意设置。
2、看我个性签名档的博客地址,《CC2541之连接参数》。
那篇博客看过了,是说主机超时需要重新设置从机的连接超时参数。我的意思是既然主机想主动放弃了,不应该再根据这个从机的超时参数来决定。因为我们需要做一些ROLE切换,主动调用GAPCentralRole_TerminateLink( 0xFFFF )这个函数,还要等那个超时时间,有点说不过去了。
告诉你了就改改看呗,你不动手怎么知道行不行。光谈理论不如动手实测一下。
参数就那么几个,改了如果没用也就没办法了。
我改了试过了,改为6秒确实起作用了,我们的要求是主动放弃就不要等,改为几秒又有什么用呢?我们之前用QN9021就不用等,这个是不是这个SDK不能解决的问题?
这里不是写清楚了吗,改小可以缩短时间。我不知道你改什么6秒。
1. 从机是别人开发的,已经改不了。
2. 现在通过如下函数改变了从机的连接参数,超时时间可以短点了。但这样改变连接参数,功耗会变大。
GAPCentralRole_UpdateLink( simpleBLEConnHandle,
DEFAULT_UPDATE_MIN_CONN_INTERVAL,
DEFAULT_UPDATE_MAX_CONN_INTERVAL,
DEFAULT_UPDATE_SLAVE_LATENCY,
DEFAULT_UPDATE_CONN_TIMEOUT );
数据通信快了自然就功耗大了,这是蓝牙基础知识。
可能你还没明白我的意思,就是说我们想放弃对方的连接了,不管对方连着还是断电了,就要主动放弃,不要等。我们用QN9021也没有改变原先对接的从机设备的连接参数,原先从机的功耗根本没改变,想放弃就放弃,要的就是这个效果。
描述一下产品工作方式:
1. 上电后,工作在CENTRAL模式,可以对接一些BLE外设读取数据,这些外设可以工作在连接间隔比较大的情况下,以降低功耗。
2. 按一个按键,切换到PERIPHERAL模式,手机可以连接上来设置产品的参数,比如要对接的外设的种类等。
现在的问题是,在CENTRAL模式下,如果故意让对接的BLE外设断电,根据SimpleBLESwitch的做法,要等到连接断开事件发出来,才能切换到PERIPHERAL模式,在主机上即使调用GAPCentralRole_TerminateLink( 0xFFFF )也没有用,这个断开事件超时来的太慢了,用户体验不好。
或者说有没有一种方法,可以直接不管CENTRA模式的状态,直接切换到PERIPHERAL模式?