This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于BLE蓝牙连接Connection Interval值的问题

Other Parts Discussed in Thread: CC2541

两个BLE设备按照一定的间隙时间进行连接,也就是Connection Interval。BLE从设备可以配置Connection Interval的最大值和最小值,但是当建立一个连接的时候,主设备会指定这个参数,成功连接之后,从设备可以请求修改参数,但是主设备也不一定会同意。所以对从设备来说,Connection Interval值是不可控的。

1,请问我以上理解是否正确?

2,我通过调用GAP_SetParamValue()设置 TGAP_CONN_EST_INT_MIN, TGAP_CONN_EST_INT_MAX来设置BLE从设备的Connection Interval最大最小值,是否正确?

3,建立了一个连接之后,我怎样得知当前实际的Connection Interval?

  • 1、严格说来,从设备也可以修改Connection Interval【虽然主设备可以不同意】。对于从设备,先把#define DEFAULT_ENABLE_UPDATE_REQUEST FALSE 改为true,然后设置#define DEFAULT_UPDATE_MIN_CONN_INTERVAL     和     #define DEFAULT_UPDATE_MAX_CONN_INTERVAL  这两个参数,如果你使用BTool的话,可以在里面设置Connection settings。
    2、对,这两个参数是针对simpleBLECentral的,即主设备。
    3、查看ADV_CONNECT_REQ packet 。

  • Hi Mahone,

    好久没听到你的名字了, 我不是越狱迷, 但是我还是认识你, 你的好兄弟scofield呢? 怎么跑来搞BLE了? 

    well,

    1. 对于IOS设备来说, 苹果设置了一系列规定, 不允许从设备的配置超出这些范围. 其他主设备来说目前还没有听说有什么具体范围设定. Android设备目前google也还没有明确规定. 所以换句话说, 只要符合主设备的要求, 从设备是可以在主设备规定的范围内请求主设备对connection interval进行改变的.

    2. 你通过GAP_SetParamValue()只是设置了参数, 最后是需要通过发送到主设备那里去请求修改的. 所以这里不正确.请参考 GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, ..) 函数的做法.

    3. 你可以通过packet sniffer抓包, 在时间戳上很清楚能看到connection interval. 或者你也可以自己加点代码, 从程序里面获取, 或者以notify方式发给主设备, 从主设备看, 总之, 方法很多哈.

    另外附上苹果对connection interval的要求, 其实还有其他的连接参数要求, 比如slave latency, supervision timeout, 如果不满足这些, IOS设备会拒绝.

    The connection parameter request may be rejected if it does not comply with all of these rules:
    Interval Max * (Slave Latency + 1) ≤ 2 seconds
    Interval Min ≥ 20 ms
    Interval Min + 20 ms ≤ Interval Max
    Slave Latency ≤ 4
    connSupervisionTimeout ≤ 6 seconds
    Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout

  • Hi ,Yan:

        you found me,scofield and me are creating some  weapons base on BLE, in preparation for the next jailbreak.

        多谢你的解答,前面两个问题我明白了。

        第三个问题我还有些疑问,抓包是一个方法,可以从交互的报文中看到,可是有没有其他方法可以看到从设备 实际的 connection interval值?

        我之前在和iphone连接的从设备上设置了一些连接参数(现在我知道了这些参数不符合苹果的要求),然后把GAPROLE_PARAM_UPDATE_ENABLE参数设置为Enable之后,iphone很快就提示连接断开,我猜想这次修改参数的请求没有成功,而结果apple按照原来的参数运行,从设备按修改之后的参数运行,所以导致断开。

        我理解这种保持链路的连接,是Link Layer的工作,我该在哪里加代码从程序中获取呢?比如有没有地方可以加入代码,在每一次connection时执行?

        其实这个问题已经不影响工作,我只要把参数设置在ios允许的范围内就可以避开了,不过我还想弄清楚这个问题,烦请解惑。


    附:我使用的BLE软件版本是1.2.1

  • Hi Mahone,

    1.2.1是在IOS 5发布之前TI提供的协议栈, 所以跟后面的IOS 5以及6有兼容性问题, 因为苹果修改了IOS 5以后的自带BLE协议栈. 所以请用TI最新的1.3版本协议栈.

    你的理解是正确的.

    另外, 你可以通过GAPRole_GetParameter(GAPROLE_CONN_INTERVAL, *pValue) 来得到当前的connection interval. 前提是连接建立以后.

  • YAN  你好!   想请问你一个苹果修改连接参数的问题: 我现在按照苹果的规定每次连接之后就去设定连接参数, 而且苹果也能接受,  但是如果我主动让我的设备不停地和IOS设备断开然后再连接的话,某个时候就会出现IOS设备永远拒绝修改连接参数的状况,现象就是每次我的设备和IOS设备连接上之后因为我的设备连上后要去修改IOS的连接参数,但是IOS设备此时又拒绝修改并且会强制断开与我的设备的连接。  这样就会出现我的设备和IOS设备一直连上又断开连上又断开,只有把IOS设备的蓝牙给关掉再重新打开才能恢复正常。

             我的问题是:IOS设备在什么情况下会拒绝修改连接参数?

                                     我对IOS开发不了解,不知道我能从哪里得到IOS关于BLE的资料?

    谢谢

  • 请问下从设备怎么主动断开连接呢?谢谢

  • 我也想问这问题,从设备如何主动断开连接呢?

  • Derek,

    你可以直接调用 GAPRole_TerminateConnection() 来主动断开连接。

  • Yan 说:

    Derek,

    你可以直接调用 GAPRole_TerminateConnection() 来主动断开连接。

    Thank you Yan

    我的具体流程是按键后开始广播,如果此时是在连接状态,要先断开连接,再广播

    调用GAPRole_TerminateConnection() 会发出GAP_LINK_TERMINATED_EVENT吗?

    如果会,是不是要等到确认断开连接了才开始广播,即收到GAP_LINK_TERMINATED_EVENT之后启动广播

     

  • Derek,

    那个函数调用后,连接顺利断开后会收到 GAP_LINK_TERMINATED_EVENT 事件。

    在这个事件之后,你再重新启动广播,即可。

  • Yan 说:

    Derek,

    那个函数调用后,连接顺利断开后会收到 GAP_LINK_TERMINATED_EVENT 事件。

    在这个事件之后,你再重新启动广播,即可。

    了解,谢谢!

  • Yan  您好

         上面讨论我还有一个问题没清楚,就是iOS有没有接口可以修改者3个参数? connect request 和 conn update request

  • Derek,

    据我的了解,iOS 没有接口可以修改着几个参数,这是iOS底层,或者芯片做的,用户看不到。

    但是你可以通过外设发送parameter update request 请求来要求iOS设备更新到你需要的单数。iOS设备收到请求后应该会自动完成这个动作。

    你可以追踪一下CC2541代码里面的DEFAULT_ENABLE_UPDATE_REQUEST 定义 以及相关函数。这个是发送参数更新请求的。

  • 好的

     

    设备端用的是CC2541  ,iOS开发app客户端,在iOS上用RSSI信号测定距离

    关于RSSI值如何换算成距离,有没有经验公式可供参考

     

    谢谢!

  • Derek,

    RSSI换成距离没有固定公式可以参考。

    每个设备不同的射频性能都会有不同结果。

    所以,针对你自己的产品,你只能通过实测去估计。 

  • Hi Yan:

    连接苹果设备,对于更新连接参数的频率有没有要求。

    我测试了一下,如果1分钟之内有两次更新连接参数,设备就会断开连接。也就是说,必须要隔60s左右才能 第二次更新连接参数。是这样的吗?

    谢谢

  • Leoric,

    苹果的要求如下,但是并没有提到间隔多久才能做第二次更新:

    Interval Max * (Slave Latency + 1) ≤ 2 seconds
    Interval Min ≥ 20 ms
    Interval Min + 20 ms ≤ Interval Max
    Slave Latency ≤ 4
    connSupervisionTimeout ≤ 6 seconds
    Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout

  • Hi Yan:

    The problem has been resolved

    Refer to section 9.3.9.2, Vol 3,Part C of the Core 4.0 BT spec. The application should retry the 'connection paramter update' procedure after time TGAP(conn_param_timeout) which is 30 seconds.

    所以必须要等30s之后才能进行第二次更新。

    这个论坛回帖速度很快啊,以后常来逛逛。O(∩_∩)O

  • Hi Derek:

    在空旷的地带,是有一个公式可以参考,但是理论值和实际值肯定是有些差距的。

    理论解释如下:

    无线通讯中功率与距离的关系如下:

    P(dbm)=A-10*n*lg(r)

    其中A可以看作是信号传输1米远时接收信号的功率,n是传播因子(它受障碍,温度和湿度等影响),r是节点之间的距离。当确定了常数An的值后,距离r就可以根据P(dBm)计算出来。

     

  • 请问一下,我对connection interval的设置如下:

    interval min = 100ms

    interval max = 1000ms

    slave latency = 4

    supervision timeout = 6s

    以上设置不没有达到苹果的要求,但是却能连上。我对其参数进行修改来满足IOS对蓝牙ble设备的连接要求后,反而在连接成功后一小段时间内自动断开了,这让我很诧异,不知道其中是什么原因。

    以下为满足要求的设置:

    interval min = 100ms

    interval max = 200ms

    slave latency = 4

    supervision timeout = 6s

  • Hi Yan,

    这是您2013年3月发表的回复,ios的这些参数限制不知道最近有没有更新,20ms-40ms的interval对于我来时还是略大,求解答,要是有官方文档就更好了。谢谢谢谢!

  • 苹果的连接参数已经改变了

    https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf

    connect interval最小变成15ms了

  • 好新的资讯,帮了很多人