低功耗蓝牙BLE之连接事件、连接参数和更新方法

转自:http://blog.csdn.net/zzfenglin/article/details/51304084

连接事件

在一个连接当中,主设备会在每个连接事件里向从设备发送数据包。一个连接事件是指主设备和从设备之间相互发送数据包的过程。连接事件的进行始终位于一个频率,每个数据包会在上个数据包发完之后等待 150μs 再发送。

连接间隔决定了主设备与从设备的交互间隔;它是指两个连续的连接事件开始处的时间距离,可以是7.5ms ~ 4s内的任意值,但必须为 1.25ms 的整数倍。要确定从设备与主设备的实际交互间隔,需要用到从设备延迟这一参数,代表从设备在必须侦听之前可以忽略多少个连接事件。

如下图所示,连接事件被一个个的连接间隔分开。从主设备发送数据包开始,每个连接事件可以持续进行,直至主设备或从设备停止响应。在连接事件之外,主从设备之间不发送任何数据包。

举个例子,如果连接间隔为 100ms,从设备延迟是 9,那么从设备可以忽略 9 个链接事件,但不得不侦听第 10 个连接事件。换言之,从设备必须每秒侦听一次,而此时监控超时的最小值应为 1010ms。反过来,另一个极端的例子是,如果监控超时使用了 32s 的最大值,对于间隔为 100ms 的链路,从设备延时必须小于等于 319。

虽然如此,如果将从设备延迟设为可行的最大值,在监控超时发生前从设备只能获得唯一一次侦听主设备的机会,这可不是一个好主意。因此,建议至少给从设备留出 6 次侦听的机会。在前面的例子中,如果连接间隔为 100ms ,从设备延迟为 9,那么监控超时应该至少为 6s,这样一来,链路在最终断开前从设备至少会有 6 次侦听的机会。

连接参数介绍

主设备和从设备建立连接之后,所有的数据通信都是在连接事件(Connection Events)中进行的。

尖刺的波就是连接事件(Connection events),剩下的Sleeping是睡眠时间,设备在建立连接之后的大多数时间都是处于Sleeping,这种情况下耗电量比较低,而在连接事件(Connection events)中,耗电量就相对高很多,这也是BLE为什么省电的原因之一。

每个连接事件(Connection events)中,都需要由Master发起包,再由Slave回复。

Master即主机,简称M;Slave即从机,简称S。抓包过程中看到的M->S或者S->M即主机到从机或者从机到主机。

连接参数 (Connection Parameters):

通过修改下面三个参数,就可以设置BLE连接过程中的传输速度和功耗。

1.Connection Interval(连接间隔)

Connection Interval(GAPROLE_MIN_CONN_INTERVAL && GAPROLE_MAX_CONN_INTERVAL)连接间隔,在BLE的两个设备的连接中使用跳频机制。两个设备使用特定的信道发送和接收数据,然后过一段时间后再使用新的信道(BLE协议栈的链路层处理信道的切换)。两个设备在切换信道后发送和接收数据称为一个连接事件。尽管没有应用数据被发送和接收,两个设备仍旧会交换链路层数据(空包 Empty PDU)来维持连接。

这个连接间隔就是指在一个连接事件(Connection events)的开始到下一个连接事件(Connection events)的开始的时间间隔。连接间隔以1.25ms为单元,连接间隔的范围是6 ~ 3200既7.5ms ~ 4s之间。

2.Slave Latency(从设备延迟或者从设备时延)

允许Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件(Connection events),在这些连接事件(Connection events)中不必回复Master(主设备)的包,这样就能更加省电。

范围可以是0 ~ 499

更详细的使用解析如下:

Slave Latency = OFF也就是Slave Latency为0时,Master发包,Slave必须回复,如果不回复,Master就会认为Slave那边接收不正常。

Slave Latency = ON也就是Slave Latency不为0的时候,图中Slave Latency为 3。Master发包,Slave没有数据要回复的时候,就会忽略 3 个连接事件,在第 4 个连接事件接收到Master发送的数据之后,回复Master。如果Slave有数据要发送就会唤醒,也就是说即使Slave Latency为 3,但是在Master发第二包的时候Slave有数据要回复,这个时候就会立即回复Master而不是等到 3 个连接事件之后的第 4 个连接事件去回复。

3.Supervision Timeout(超时时间或者监控超时)

这个参数设定了一个超时时间,如果BLE在这个时间内没有发生通信的话,就会自动断开。

单位是 10ms,该变量的范围是10 ~ 3200,折算成时间范围是100ms ~ 32s 。

连接间隔、从机时延以及超时时间这三者必须满足如下公式:

Supervision Timeout  > (1 +slaveLatency)* (connectionInterval)

上述公式必须满足,否则连接就会不正常断开。

这三个连接参数不同情况下对通信速率和功耗的影响:

1.Connection Interval缩短,Master和Slave通信更加频繁,提高数据吞吐速度,缩短了数据发送的时间,当然也增加了功耗。

2.Connection Interval增长,通信频率降低,数据吞吐速度降低,增加了数据发送的时间,当然,这种设置降低了功耗。

3.Slave Latency减少或者设置为 0,每次Connection Events中都需要回复Master的包,功耗会上升,数据发送速度会提高。

4.Slave Latency加长,功耗下降,数据发送速度降低。

连接参数更新规程

连接建立时,主设备通过链接请求数据包发送连接参数。当连接活跃了一段时间,连接参数也许不再适用于当前使用的服务。出于提高效率的目的,连接参数需要进行更新。较之首先断开连接、接着更换新参数重新连接,还有一种在链路中更新参数更为简单的途径,如下图所示:

为此,主设备向从设备发送连接更新请求,即LL_CONNECTION_UPDATE_REQ,当中携带了新的参数。这些参数不必进行协商,从设备或者接受和使用它们,或者断开链路。连接更新请求中包含了早先创建连接时用过的一部分参数,还有一个称为瞬时(instant)的新参数:

1.传输窗口大小

2.传输窗口偏移量

3.连接间隔

4.从设备延迟

5.监控超时

6.瞬时

瞬时参数决定了连接更新的开始时刻。发送消息时,主设备为连接更新选定一个未来的时间点,并且放在消息中。接到消息后,从设备会记住这个未来的时刻,届时再切换至新的连接参数。这有助于解决无线系统里的一个最大问题----报文重传。只要数据包的重传次数足够,并最终在瞬时之前传输成功,上述过程执行起来就不会有问题。但是,如果该数据包届时没能完成传输,链路就有可能丢失。

由于低功耗蓝牙没有时钟,要决定瞬时时刻只有依靠计算连接事件的个数。因此,每一个连接事件都会被计数,链路上的第一个连接事件,也就是在连接请求之后的位于首个传输窗口里的连接事件记为 0。因此,瞬时实际上是一个连接事件的计数器,相应的连接事件到来时就使用新的参数。为了让从设备收到数据包,主设备必须为其提供足够的机会。不过从设备延迟是多少,都应该至少保证 6 次数据发送机会。也就是说,如果从设备延迟为 500ms,那么瞬时通常被设定在 3s 之后的某个未来时刻。

瞬时到来时,从设备开始侦听发送窗口,就好像连接建立的过程那样。主设备能够调整从设备的计时,总体而言不超过 1.25ms。不过,由于主设备可能还是一个经典蓝牙设备,上述调整使其得以协调低功耗蓝牙从设备,从而更好地完成调度。一旦该过程结束,新的连接间隔、监控超时、从设备延迟值将投入使用。

连接参数的修改

“连接参数更新请求”命令可以让从设备更新链路层的连接参数,如下图所示。这些参数包括连接间隔(从设备希望主设备允许从设备发送数据包的频率)、从设备延迟(从设备能够忽略主设备的连接事件的最大值)以及监控超时。

在连接中,如果从设备希望修改当前的连接参数则可以使用该命令。比方说,如果连接事件的间隔有可能太快了,导致过多的电量浪费。这在从设备时延很大时没有问题,但如果不是这样,从设备将会频繁的侦听链路。这在一些情况下是必要的,例如设备间首次绑定、互发多个数据包、探索服务和设备特性等。但在很多其他情况下,尽可能地减少从设备必须侦听连接事件的数量对提高电池寿命至关重要。

连接参数更新请求命令仅用于从设备向主设备发送,这是由于主设备随时都能启动链路层连接参数更新控制(Connection Parameter Update Control)规程。如果该命令由主设备发送,从设备会将其视为一个错误,并返回带有“命令不理解”原因代码的“命令拒绝”命令。

从设备可以在任何时候发送该命令;收到该信息的主设备如果可以修改连接参数,则将返回“连接参数更新响应”(Connection Parameter Update Response),其中的结果代码设为“接受(accepted)”。随后,主设备将会启动链路层连接参数更新控制规程。

当然,如果主设备不同意从设备的请求参数,它可以发送结果代码为“拒绝(rejected)”的连接参数更新响应命令以拒绝请求。此时从设备有两个选择:要么接受主设备希望的正在使用的连接参数,要么终止连接。终止连接的做法咋看起来可能让人觉得很激进,但是,假如使用当前的参数从设备将会在一周内耗尽电量,而使用请求的参数则可以持续数年,很明显,合理的选择只有一个。

修改连接参数时,如果要减少主设备拒绝从设备请求的可能性,可以在请求里设置一个可接受的参数范围。经过精心设计的从设备会乐意接受很宽的参数范围。由于主设备可能正忙于实时会话音频连接或者高质量语音连接等任务,它可以接受一定范围内的连接间隔参数。设备可接受的间隔参数会根据当前任务的不同而不同,可能有别于上一次设备连接时的参数。

要提高主设备接受连接参数的机率,还有个方法是从设备提供一个合理的从设备延迟。主设备可以选择最合适的连接事件间隔,从设备则使用最佳功耗的从设备延迟参数。

举个例子,如果从设备想每 600ms 同步一次,它可以请求范围 100ms ~ 750ms 的连接间隔参数,并带上从设备延迟5。如果主设备选择 100ms,则从设备每6个连接事件同步一次;如果主设备选择 200ms,则从设备每 3 个连接事件同步一次,实现其所期望的 600ms 间隔;如果主设备选择 300ms,则从设备忽略每隔一个连接事件同步一次;如果主设备选择 400ms,则从设备每 400ms 同步一次。

下面介绍一下在TI的CC2540和CC2541中,连接参数修改的方法。

(一)连接成功建立之后从设备自动申请修改连接参数。

我们以TI 1.4.0协议栈中的“simpleBLEPeripheral”工程为例来进行讲解,在这个工程的“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”应用文件中定义了如下的宏:

[cpp] view plain copy

  1. // Whether to enable automatic parameter update request when a connection is formed
  2. #define DEFAULT_ENABLE_UPDATE_REQUEST         TRUE

从上面的注释中,我们可以看出这个宏的作用是当一个连接建立的时候,是否需要自动申请连接参数更新。当设置为“TRUE”的时候就是需要,当设置为“FALSE”的时候就是不需要。那这个宏到底是如何起作用的呢?下面我们来看一下。

1.“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”应用文件中的“SimpleBLEPeripheral_Init”初始化方法里对该宏进行了处理,源码如下:

[cpp] view plain copy

  1. uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;
  2. GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );

2.我们看下“GAPRole_SetParameter”方法里面的相关的操作,相关操作在“Projects\ble\Profiles\Roles\peripheral.c”文件里,源码如下:

[cpp] view plain copy

  1. case GAPROLE_PARAM_UPDATE_ENABLE:
  2. if ( (len == sizeof ( uint8 )) && (*((uint8*)pValue) <= TRUE) )
  3. {
  4. gapRole_ParamUpdateEnable = *((uint8*)pValue);
  5. }
  6. else
  7. {
  8. ret = bleInvalidRange;
  9. }
  10. break;

3.从上面的代码不难看出,将我们设置的宏赋给了“gapRole_ParamUpdateEnable”全局变量,下面我们在本文件中搜索一下该全局变量使用的地方,发现在如下源码中用到了:

[cpp] view plain copy

  1. // 连接成功建立之后底层返回的事件
  2. case GAP_LINK_ESTABLISHED_EVENT:
  3. {
  4. gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg;
  5. if ( pPkt->hdr.status == SUCCESS )
  6. {
  7. VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN );
  8. gapRole_ConnectionHandle = pPkt->connectionHandle;
  9. gapRole_state = GAPROLE_CONNECTED;
  10. if ( gapRole_RSSIReadRate )
  11. {
  12. // Start the RSSI Reads
  13. VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate );
  14. }
  15. // Store connection information
  16. // 保存连接刚建立时的连接参数
  17. gapRole_ConnInterval = pPkt->connInterval;
  18. gapRole_ConnSlaveLatency = pPkt->connLatency;
  19. gapRole_ConnTimeout = pPkt->connTimeout;
  20. // Check whether update parameter request is enabled
  21. // 检测更新连接参数请求是否被使能
  22. if ( gapRole_ParamUpdateEnable == TRUE )
  23. {
  24. // Get the minimum time upon connection establishment before the
  25. // peripheral can start a connection update procedure.
  26. // 获取设置的时间间隔,从机将在连接建立之后
  27. // 延时至少该时间间隔之后触发连接参数更新事
  28. // 件。
  29. uint16 timeout = GAP_GetParamValue( TGAP_CONN_PAUSE_PERIPHERAL );
  30. // 在延时timeout*1000 ms之后触发连接参数更新事件
  31. osal_start_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT, timeout*1000 );
  32. }

4.上面的注释非常清楚了,在连接成功建立返回的事件中判断我们设置的宏,如果设置为“TRUE”,那就获取我们设置的时间间隔,在延时我们设置的时间间隔(上面注释中提到至少,因为用的是系统定时器,有可能在执行别的事件,所以实际的延时时间会大于我们设置的时间,当然,一般情况下偏移的那点时间是可以忽略的)之后,触发连接参数更新事件,进行连接参数的更新。那上面源码中获取的时间间隔以及后面要更新的连接参数是在什么地方设置的呢?下面我们继续回到应用层文件中查看相关设置。

5.在“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”文件中定义了如下宏用来设置自动更新连接参数时,相关连接参数的值,源码如下:

[cpp] view plain copy

  1. // Minimum connection interval (units of 1.25ms, 80=100ms) if automatic parameter update request is enabled
  2. // 如果自动更新连接参数请求被使能的话,用到的最小连接间隔,单位1.25 ms
  3. #define DEFAULT_DESIRED_MIN_CONN_INTERVAL     80
  4. // Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
  5. // 如果自动更新连接参数请求被使能的话,用到的最大连接间隔,单位1.25 ms
  6. #define DEFAULT_DESIRED_MAX_CONN_INTERVAL     800
  7. // Slave latency to use if automatic parameter update request is enabled
  8. // 如果自动更新连接参数请求被使能的话,用到的从机时延
  9. #define DEFAULT_DESIRED_SLAVE_LATENCY         0
  10. // Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled
  11. // 如果自动更新连接参数请求被使能的话,用到的超时时间,单位10 ms
  12. #define DEFAULT_DESIRED_CONN_TIMEOUT          1000
  13. // Connection Pause Peripheral time value (in seconds)
  14. // 如果自动更新连接参数请求被使能的话,用到的时间间隔,单位s
  15. #define DEFAULT_CONN_PAUSE_PERIPHERAL         6

6.通过上述宏进行相应设置的地方在“Projects\ble\SimpleBLEPeripheral\Source\simpleBLEPeripheral.c”文件的“SimpleBLEPeripheral_Init”初始化方法中,源码如下:

[cpp] view plain copy

  1. VOID GAP_SetParamValue( TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL );
  2. uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
  3. uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
  4. uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;
  5. uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;
  6. GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );
  7. GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );
  8. GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );
  9. GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );

上述操作在“Projects\ble\Profiles\Roles\peripheral.c”文件里的具体实现我们就不一起看了,因为里面其实就是一个赋值的过程,所以大家自行查看即可。

(二)连接成功建立之后从设备在需要的时候去修改某个连接参数或者全部的连接参数。

1.修改单个连接参数的方法

修改最小连接间隔

[cpp] view plain copy

  1. uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
  2. GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );

修改最大连接间隔

[cpp] view plain copy

  1. uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
  2. GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );

修改从设备延迟

[cpp] view plain copy

  1. uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;
  2. GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );

修改超时时间

[cpp] view plain copy

  1. uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;
  2. GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );

2.所有连接参数一起修改的方法

[cpp] view plain copy

  1. uint16 minConnInterval;
  2. uint16 maxConnInterval;
  3. uint16 slaveLatency;
  4. uint16 timeoutMultiplier;
  5. // Update connection parameters
  6. GAPRole_SendUpdateParam( minConnInterval, maxConnInterval, slaveLatency, timeoutMultiplier, GAPROLE_TERMINATE_LINK);

GAPRole_SendUpdateParam传入的前四个参数在之前都已经介绍过了,下面介绍下最后一个参数,最后一个参数设置的是连接参数更新失败后的操作,可取值定义在peripheral.h文件中,如下:

[cpp] view plain copy

  1. /**
  2. *  Possible actions the peripheral device may take if an unsuccessful parameter
  3. *  update is received.
  4. *
  5. *  Parameters for GAPRole_SendUpdateParam() only
  6. */
  7. #define GAPROLE_NO_ACTION                    0 // Take no action upon unsuccessful parameter updates
  8. #define GAPROLE_RESEND_PARAM_UPDATE          1 // Continue to resend request until successful update
  9. #define GAPROLE_TERMINATE_LINK               2 // Terminate link upon unsuccessful parameter updates

GAPROLE_NO_ACTION:没有任何动作

GAPROLE_RESEND_PARAM_UPDATE:重新发送参数更新请求

GAPROLE_TERMINATE_LINK:断开连接

对于上述介绍的两种修改连接参数的方法,个人建议还是采用第二种方法,因为第一种方法在修改某一个参数的时候,可能会导致其他参数的变化,比如我们只修改了连接间隔,但从机延时可能会随之改变,这样我们就无法根据自己的需求控制连接参数的更新。

第二种方法在使用的时候有可能碰到一种情况,就是我们只想修改某一个或者某两个连接参数,剩下的参数想保持原有的,这样的话,我们需要在修改连接参数之前先去读取连接参数,然后将需要修改的参数进行重新设置即可,读取连接参数的代码如下:

[cpp] view plain copy

  1. uint16 interval;
  2. uint16 latency;
  3. uint16 timeout;
  4. GAPRole_GetParameter(GAPROLE_CONN_INTERVAL, &interval);
  5. GAPRole_GetParameter(GAPROLE_CONN_LATENCY, &latency);
  6. GAPRole_GetParameter(GAPROLE_CONN_TIMEOUT, &timeout);

下面我们通过一个实例来具体了解下连接参数修改的方法,需求是将连接间隔修改为25,从机延迟修改为8,超时时间不修改,更新失败后重新发送参数更新请求,本实例中主设备是安卓设备,从设备是CC2541。代码实现如下:

[cpp] view plain copy

  1. uint16 interval;
  2. uint16 latency;
  3. uint16 timeout;
  4. GAPRole_GetParameter(GAPROLE_CONN_INTERVAL, &interval);
  5. GAPRole_GetParameter(GAPROLE_CONN_LATENCY, &latency);
  6. GAPRole_GetParameter(GAPROLE_CONN_TIMEOUT, &timeout);
  7. GAPRole_SendUpdateParam( 25, 25, 8, timeout, GAPROLE_RESEND_PARAM_UPDATE);

该过程抓包显示如下:

从抓到的包中我们看到首先是S->M,即从设备发送连接参数更新请求,请求中带有申请的连接参数,然后M->S,即主设备返回连接参数更新响应,Result为0,表示同意修改更新。最后M->S发送Data type为Control的链路层连接参数更新控制规程,携带同意的连接参数,这样,新的连接参数就会投入使用。

注意修改连接参数的时候要满足一定的要求:

1.安卓设备作主设备时,连接参数满足的要求见本篇博文第二节“连接参数介绍”中提到的内容。另外实际开发过程中发现安卓设备作主设备时存在一个问题,就是部分安卓设备连接BLE设备之后,只能进行一次连接参数的修改。

2. 苹果系统设备作主设备时,连接参数更新的要求比较苛刻,如下:

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

即:

最大连接间隔时间 *(从机延迟 + 1) ≤ 2s

最小连接间隔时间 ≥ 20 ms

最小连接间隔时间 + 20 ms ≤ 最大连接间隔时间

从机延迟 ≤ 4

超时时间 ≤ 6s

最大连接间隔时间 *(从机延迟 + 1)* 3  < 超时时间

所以如果你的BLE从设备需要被iOS主设备连接,那你的BLE从设备的默认申请的连接参数一定要满足上述要求,并且连接过程中修改连接参数的时候也要满足上述要求。

时间: 2024-10-12 20:44:08

低功耗蓝牙BLE之连接事件、连接参数和更新方法的相关文章

使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释

转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释 演示样例源代码: https://github.com/junkchen/BleLib/tree/master/sample Android ble4.0开发基础篇:http://blog.csdn.net/kjunchen/article/details/50339549 BleLib是An

低功耗蓝牙BLE之AES-128加密算法

版权声明: 博主:枫之星雨 声明:本文为博主原创文章,转载请注明原文出处. 博文地址:http://blog.csdn.net/zzfenglin 邮箱:[email protected] QQ号:454086991(申请加好友时请备注"技术交流") 加密 在连接时,可以对净荷中的数据进行加密,确保数据的机密性,从而抵御攻击者.机密性是指第三方"攻击者"由于没有加密链路的共享密钥,因此无法拦截.破译或读取消息的原始内容. 加密数据包含一个消息完整性校验值,表明该数据

深入浅出低功耗蓝牙(BLE)协议栈

BLE协议栈为什么要分层?怎么理解BLE"连接"?如果BLE协议只有ATT层没有GATT层会发生什么? 协议栈框架 一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提.在深入BLE协议栈各个组成部分之前,我们先看一下BLE协议栈整体架构. 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后在协议栈上开发自己

Android 低功耗蓝牙BLE 开发注意事项

基本概念和问题 1.蓝牙设计范式? 当手机通过扫描低功耗蓝牙设备并连接上后,手机与蓝牙设备构成了客户端-服务端架构.手机通过连接蓝牙设备,可以读取蓝牙设备上的信息.手机就是客户端,蓝牙设备是服务端. 手机做为客户端可以连接多个蓝牙设备,所以手机又可以叫中心设备(Central),蓝牙设备叫外围设备(Peripheral). 还有另外一个称谓:手机叫主设备(Master),蓝牙设备叫从设备(Slave). Android4.3 开始支持低功耗蓝牙,此版本只支持单模式:同时只能工作在中心设备模式或者

Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)

段时间,公司项目用到了手机APP和蓝牙设备的通讯开发,这里也正好对低功耗蓝牙(蓝牙4.0及以后标准)的开发,做一个总结. 蓝牙技术联盟在2010年6月30号公布了蓝牙4.0标准,4.0标准在蓝牙3.0+HS标准的基础上增加了对低功耗蓝牙(BLE)的支持.相比原有的普通蓝牙和高速蓝牙,BLE最大的特点就是低功耗,低延时,快速的搜索和连接速度,但数据传输速度相比传统蓝牙低.接下去将从BLE的概念以及代码两个方面介绍Android下的BLE. 先来说说基本概念: 1.BLE相关概念 1.1 GATT.

Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

一.Android 低功耗蓝牙(BLE)的API简介 从Android 4.3(API 18)才支持低功耗蓝牙(Bluetooth Low Energy, BLE)的核心功能, BLE蓝牙协议是GATT协议, BLE相关类不多, 全都位于android.bluetooth包和android.bluetooth.le包的几个类: android.bluetooth. .BluetoothGattService 包含多个Characteristic(属性特征值), 含有唯一的UUID作为标识 .Bl

蓝牙协议分析(7)_BLE连接有关的技术分析

转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connection)是一个相当消耗资源(power和带宽)的过程.特别是当没有数据传输的时候,所消耗的资源完全被浪费了.因而,对很多蓝牙设备来说(特别是功耗敏感的设备),希望在无数可传的时候,能够断开连接.但是,由于跳频(hopping)以及物理通道(Physical Channel)划分的缘故,经典蓝牙连接

低功耗蓝牙(BLE)在 Android APP 中的应用

低功耗蓝牙(BLE)在 Android APP 中的应用 前言 最近公司接了一个新项目,用户可以把自己的乐器跟Phone或Pad连接起来,当弹奏乐器的时候,会把演奏情况同步反馈到设备上,方便用户练习,有点类似于之前玩过的一款叫[ 吉他英雄 ]的游戏.不过这次不用插线,直接蓝牙无线连接就可以了. 那么问题来了,因为弹奏的时候数据传输一直在进行,但是如果要一直打开蓝牙的话是很费电的,也许没几首曲子下来设备的电量就耗掉了不少,这当然是无法接受的.那有没有什么好的解决方案呢? 运气真好,Android在

[蓝牙] 2、蓝牙BLE协议及架构浅析&amp;&amp;基于广播超时待机说广播事件

第一章 BLE基本概念了解 一.蓝牙4.0和BLE区别 蓝牙4.0是一种应用非常广泛.基于2.4G射频的低功耗无线通讯技术.蓝牙低功耗(Bluetooth Low Energy ),人们又常称之为BlueTooth Smart,是由SIG( the Bluetooth Special Interest Group) 在2010年6月起草,在原有标准的蓝牙4.0核心协议上添加的一种低功耗技术. 蓝牙低功耗不等同于蓝牙4.0,只是蓝牙4.0的一个分支.蓝牙4.0是蓝牙3.0+ HS(高速蓝牙)规范的