工程版本:5.0.4 使用工程为OTA工程加入扩展睡眠,因为低功耗的原因修改了广播间隔和连接间隔 广播间隔为500ms~1s 连接间隔450ms~500ms 连接间隔变长之后发现通讯距离缩短二分之一,以前可以到10m距离,现在距离缩短到5m以下 加了2.4G陶瓷天线发现也没什么大的变化,请问有什么办法可以在功耗不增加的情况下增加一点距离
Hi,
修改连接间隔之后,距离由 10m 缩短到 5m 以下,应该是有其它原因导致的距离变短。请详细描述一下您的测试步骤。
另外,根据你目前提供的信息,怀疑是超时断开:修改了连接间隔之后,有没有把超时时间也相应的加长一点:time_out、superv_to?
测试步骤: #define APP_PARAM_UPDATE_REQUEST_TO (1000)
/// Minimum interval for advertising .intv_min = 800, //500ms // 100ms = (160*0.625ms) /// Maximum interval for advertising .intv_max = 1600, // 100ms = (160*0.625ms)
上面参数固定 修改了函数user_gapm_conf .con_intv_min = MS_TO_DOUBLESLOTS(360), .con_intv_max = MS_TO_DOUBLESLOTS(400), user_connection_param_conf为 .intv_min = MS_TO_DOUBLESLOTS(360), .intv_max = MS_TO_DOUBLESLOTS(400),
以往都是没有修改,内参数为10和20,距离可以到10m,数值改大之后,距离就缩短了。
还有您怀疑的问题: .time_out = MS_TO_TIMERUNITS(1250), .superv_to = MS_TO_TIMERUNITS(1000), 他们都是10ms为为单位,按理说都在10s以上 = =, 我将其每个增加了500的量,距离没有变化
Hi,
timer unit 是 10ms 没错,宏 MS_TO_TIMERUNITS 里的参数的单位是 ms。。。
把参数都填为 5000 试试吧~~
非常感谢您的回复 按照您说的都改成5000 .superv_to = MS_TO_TIMERUNITS(5000), .time_out = MS_TO_TIMERUNITS(5000), 效果就是断开之后5s才响应user_app_disconnect这个函数,距离并没有改变。 而且处于一种很尴尬的情况:在5m~10m距离之间,安卓手机搜索不到此蓝牙,用苹果手机能搜索到蓝牙,但是不能连接(这里我的猜想:我在手机蓝牙连接设备蓝牙之后会发送一串绑定码给设备蓝牙,这串码有18位,将蓝牙间隔改长了之后,功耗确实低了不少,但是收发数据的效率相应也变低 了,所以需要差不多5s时间才能在我的方案逻辑里面判断是连接上了) 在这里面有什么好的办法吗 = =!
我们把问题分步骤解决吧:
1、修改连接间隔会导致距离变短。
理论上,如果连接参数没问题的话,修改连接间隔并不会导致距离变短。所以先解决这个问题:
a) 先排查硬件问题,做法就是使用我们官方的例程(barebone)下载到你的板子上,然后用第三方工具(lightblue)跟它连接。修改不同的连接参数,观察连接距离有无变化。
b) 再排查软件问题,你的描述“效果就是断开之后5s才响应user_app_disconnect这个函数”有个矛盾,断开之后,是会马上回调 user_app_disconnect 函数的,所以不清楚你判断断开的依据是什么?这里需要你以 user_app_disconnect 的回调作为断开的依据,再仔细测试、观察你的设备的行为,然后描述出来。
根据“5s才响应user_app_disconnect这个函数”的描述,暂且先假设为超时断开,那么你需要排查下你软件中有没有造成阻塞的操作,如连续频繁的读写flash,连续频繁的读写IIC,使用while(i--);等类似的语句占用 CPU 实现延迟等。
2、提高通讯效率、同时节省功耗
主、从连接成功之后,从设备可以发起修改连接参数的请求。
所以,将 user_connection_param_conf 配置成满足你功耗需求的参数。手机连上之后,会以比较快的速度通讯,APP_PARAM_UPDATE_REQUEST_TO 超时之后,以 user_connection_param_conf 中的参数通讯。