你好,
我的设备是电池驱动的设备,它总是处于连接模式。因此,为了节省电池电量,我增加了conn_interval。我有以下观察。
a.当我的设备连接时,默认的conn_interval是10ms。因此,empty_pdu每隔10ms从双方(主端和从端)传输一次。
b.在检测到没有活动后,我的设备将conn_interval更改为1秒。当接收到新的conn_param_update_request后,新的conn_interval在24包后生效。(从奴隶到主人12个,从主人到奴隶12个)。所以新的conn_interval(1秒)在24 *旧的conn_interval(10毫秒)= 240ms之后才有效。
到目前为止,一切都很好。
c.现在,如果主服务器或从服务器想要做任何活动,他们会在延迟1秒后收到数据包。为了克服这个问题,我在检测到任何活动时就设置旧的conn_interval (10ms)。但它在传输24个empty_packets后才生效,然后它们开始以10ms的速度发送empty_pdu。
我的问题是,是否有办法在发送conn_param_update_request后,让更新后的conn_interval生效?
设备:

嗨Ankit,
在连接参数更新握手过程中,主服务器告诉从服务器在哪个点或哪个连接事件上应用新的连接参数。这简单地解释了你所观察到的。
因此,在您的应用程序中,我可能会建议尝试另一个连接参数,从延迟。奴隶可以选择不回答连接事件,直到奴隶延迟的次数。但是,如果slave有数据要发送,它可以选择在任何时间发送数据。这样,你就有了响应能力和电池寿命。
仅供参考,master拥有连接参数的最终决定权,这意味着您希望应用的参数可能不是实际应用的参数。这实际上取决于如何在主端实现它。
我的观察
a.主从双方都同意以1000毫秒的conn_interval发送empty_pdu。我已经通过BLE嗅探器证实了。
b.现在如果主从端要发送数据,观察到数据包是在1000ms的间隔之后发送的。为了避免这种情况,我将conn_interval减少到10毫秒,无论何时有活动。
但是这个新的conn_interval在传输12个empty_pdu之后是有效的。这12个empty_pdu以旧的conn_interval传输到1000毫秒。这意味着新的conn_interval 10毫秒在12000毫秒后有效。
我想减少这12秒的延迟。那么,延迟会起作用吗?
空闲模式conn_params
params.intv_min = MS_TO_DOUBLESLOTS (980);
params.intv_max = MS_TO_DOUBLESLOTS (1000);
参数个数。time_out = MS_TO_TIMERUNITS (3100);
参数个数。延迟= 0;
正常模式conn_params
params.intv_min = MS_TO_DOUBLESLOTS (10);
params.intv_max = MS_TO_DOUBLESLOTS (30);
参数个数。time_out = MS_TO_TIMERUNITS (1250);
参数个数。延迟= 0;
嗨Ankit,
conn_params是这样设置的
params.intv_min = MS_TO_DOUBLESLOTS (10);.params.intv_max = MS_TO_DOUBLESLOTS (30);
参数个数。time_out = MS_TO_TIMERUNITS (1250);
参数个数。延迟= 4;
主从机之间约定的连接间隔和延迟为10ms和4。然后slave被允许跳过多达4个连接事件。所以你可能会发现最好的情况是slave每50ms回答一次empty_pdu。如果slave有数据要在两者之间传输,它在下一次连接事件发送数据。
在调整这些参数时还需要注意其他事项。
这是理解。让我们讨论一下“如果slave有数据要在两者之间传输,它在下一次连接事件发送数据。”
所以,如果奴隶想要发送一些数据,可以立即发送而不等待下一个连接事件。
为此,我减少了connection_interval时间。但时间长了才有效。
嗨Ankit,
不是真的。设备必须等待连接事件才能通信。这就是BLE的设计方式。
连接事件(或称为连接瞬间)以递增的方式编号,n, n+1, n+2,等等。在命令LL_CONNECTION_UPDATE_REQ master发送给slave以更新连接参数中,有一个名为“Instant”的字段指定连接事件号。这通知从服务器,新的连接参数将在这个特定的连接事件号之后应用。
例如conn_intv == 10ms和slave_latency == 4。如果在ConnEvent n后没有数据需要从端传输,最好的情况是从端在ConnEvent n+5应答empty_pdu。如果在ConnEvent n+1发生之前有数据准备被传输,那么slave将在ConnEvent n+1传输它。因此,从数据准备到数据传输的响应延迟,大约小于10ms。
你好,我已经通过BLE嗅探器捕获了日志,在这里我详细解释我的问题。操作通过ios应用程序执行。
默认连接间隔是10ms。因此,当设备连接时,它使用10ms的conn_interval进行通信。一旦设备检测到连接现在是空闲的,并且没有更多的数据从主端或从端发送,它通过更改conn_interval 1000ms来更新连接参数。
请参阅附件pdf第1页。
连接间隔更新到1000msec请求从从服务器发送到主服务器。
请求被船长接受。
接受请求后,22个empty_pdu在旧的连接conn_interval (10ms)发送。您可以从日志中验证时间。
因此,这里1000msec conn_interval适用于22 * 10ms = 220ms之后。这种延迟是可以接受的。
但是,当主服务器或从服务器想要进行通信时,从服务器再次发送连接参数更新请求,conn_interval为10ms。因此,这种交流可以快速进行。
请参阅所附的pdf第2页。
连接间隔更新到10msec的请求从从属到主。
请求被船长接受。
接受请求后,22个empty_pdu在旧的连接conn_interval (1000ms)发送。您可以从日志中验证时间。
这意味着新的conn_interval (10msec)在22 * 1000ms = 22000 ms(22秒)之后可用。在这22秒之前,如果主从机执行任何操作,都会延迟1秒。
所以,我想知道是否有办法减少这22个empty_pdu包,使更新后的conn_inerval立即生效?
嗨Ankit,
从奴隶的角度来说,什么都做不了。这是主人决定的。在嗅探器日志中,LL_CONNECTION_UPDATE_REQ是主服务器告诉从服务器要应用哪些新参数以及何时应用的命令。