|
背景
主从一体模组,具备主机、从机2种角色。当作为主机角色连接了多个从机时,自身作为从机角色,有时会出现难以被其他主机连接的情况,本文通过测试、分析,给出了解决方案,具体见文末。
具体问题描述:
S98作为主机角色,连接了4个从机设备。4个从机设备每500ms会发送大约50字节数据给S98。
S98作为从机角色,手机或E92主从一体去连接S98,发现很难连上。
分析
一、测试条件
●4个从机如下:
3个E66 透传模组,Rev09版本,BLE4.2。
1个E95 透传模组,Rev04版本,BLE5.1。
●主机如下:
1个S98 主从一体,固件Rev01,1个E92主从一体,Rev02 (见上图)
6个不同型号的手机。
二、测试方法
1、所有设备接入到串口。
2、使用上位机工具操作,S98分别连接1、2、3、4个从机,E92或其他手机连接S98B。
3、主从机间仅保持连接,或者定时每500ms向S98发送150字节数据。
三、测试过程
1、S98连接1个4.2从机
2、S98连接2个4.2从机
3、S98连接3个4.2从机
4、S98连接4个从机
四、分析
1、总结上述测试结果,可直观的看出:
●当连接从机设备数量增加时,手机能连上的概率越来越低。
●当连接全部从机时,安卓手机几乎全都不可连接。但是苹果手机可连接成功,仅有一次失败。同时E92主机可以连接S98并且全都连接成功。
2、进一步抓包分析:
在无从机连接的情况下,抓包分析安卓手机、苹果手机、E92主机连接S98的流程:
●安卓手机:
手机扫描到设备->发起连接->立即更新默认连接间隔到7.5ms->发现设备服务
●苹果手机:
手机扫描到设备->发起连接->以默认30ms连接间隔通信->发现设备服务
●E92主机:
扫描到设备->发起连接->发现设备服务
可看出,以上三种主机差异点在于,发起连接后以多少的连接间隔进行通信。
3、推测换不同主机时,连接间隔不同的原因如下:
可能的原因1:
●当安卓手机一旦发起连接,以7.5ms的连接间隔进行通信,导致S98突然要维护一个7.5ms的通信定时任务,并且要保证从机不断连,RF收发冲突,任务处理不及时导致了timeout。
●苹果手机发起连接,以30ms的连接间隔通信,对S98压力不打,所以冲突概率小。
●E92发起连接,不主动更新连接间隔,以S98默认的100ms连接间隔连接,所以每次都成功连接。
可能的原因2:
●S98处理单个事件耗时过长,导致容易和其他事件冲突。
五、验证
1、基于上述可能原因1,优化方案如下:扩大从机连接间隔,适当增加slavelatency,减小对从机事件的处理耗时,留出足够时间给安卓手机以7.5ms间隔的通信,服务发现完成后,安卓手机会将连接间隔再改回默认值。只要安卓手机7.5ms的发现服务事件过去,那么之后的连接就是稳定的。
1)具体测试,更改从机连接间隔到300ms,slave latency为5,超时为30秒。
4台从机都更新成该参数。
4台从机都以300ms间隔发100字节。
2)S98收到从机发来的数据。此时用安卓手机去连接S98。
手机连接成功,主机端也收到连接信息,并且保持连接不断开。
2、基于上述可能原因2,优化方案如下:修改协议栈参数“event_length”,减小每次事件处理耗时,将原事件处理最大时长,由25ms调整到12.5ms,留出更多时隙给其他事件处理。
1)将事件长度修改为10(即12.5ms),再进行多连接测试。
具体测试过程,同测试1,但是不更改连接间隔,保持100ms的连接间隔。
在多从机同时发送数据的情况下,再用手机去连接S98,发现手机连接成功,主机端也收到连接信息,并且保持连接不断开,收发正常。
结论
当主从一体模组连接多个从机时,作为从机角色难被主机连接,解决办法如下所示:
●扩大从机连接间隔,适当增加slavelatency。
●修改协议栈参数“event_length”,减小每次事件处理耗时。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|