精华内容
下载资源
问答
  • 什么是MTUMTU(Maximum Transmission Unit),最大传输单元,是...为什么要设置MTUAndroid BLE传送数据时,MTU的默认值是23byte,除掉GATT协议往包头加上的3个字节,留给开发人员的就是20byte,也就是说正常情况下,A...

    什么是MTU

    MTU(Maximum Transmission Unit),最大传输单元,是指一种通信协议的某一层上面所能通过的最大数据报大小(以字节为单位)。而在Android BLE开发中,则指每包数据能携带的最大字节上限。

    为什么要设置MTU

    Android BLE传送数据时,MTU的默认值是23byte,除掉GATT协议往包头加上的3个字节,留给开发人员的就是20byte,也就是说正常情况下,App通过BLE每包传输的数据最多只能是20byte。当某个功能需要传输大量的数据时,比如固件升级,我们的固件虽然只有几百KB大小,却居然要分上万个包,传输需要十多分钟,显然效率太低。而通过设置MTU,最高可以将MTU调整到512Byte,从而大大提高数据传输的效率。

    前提条件

    动态设置MTU,需要传输的双方都支持才行,此外还有一些前提条件:

    软件层面,Android API版本>=21(Android 5.0),才支持设置MTU。

    硬件层面,蓝牙4.2及以上的模块,才支持设置MTU。

    对于第一个限制,比较好适配,编码时只需要判断手机系统版本,API>=21才走动态设置MTU的逻辑即可。

    对于第二个限制,稍微麻烦,因为目前没有接口可以查询手机蓝牙的版本,只能在请求设置MTU的回调里进行判断,如果设置失败,则仍然走默认的逻辑,相当于仍然使用默认的20byte。

    代码实例

    private void setMtu(int setMtu) {

    BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

    BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();

    bluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback() {

    @Override

    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {

    device.connectGatt(DemoActivity.this, true, new BluetoothGattCallback() {

    @Override

    public void onServicesDiscovered(BluetoothGatt gatt, int status) {

    super.onServicesDiscovered(gatt, status);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

    if (setMtu > 23 && setMtu < 512) {

    gatt.requestMtu(setMtu);

    }

    }

    }

    @Override

    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {

    super.onMtuChanged(gatt, mtu, status);

    mMtu = mtu;

    if (BluetoothGatt.GATT_SUCCESS == status && setMtu == mtu) {

    LogUtils.d("MTU change success = " + mtu);

    } else {

    LogUtils.d("MTU change fail!");

    }

    }

    });

    }

    });

    }

    展开全文
  • 之前一文《蓝牙4.2最大传输速率详细分析》介绍了蓝牙4.2的最大数据传送率以及限制速率的三大原因,那么问题来了,在蓝牙4.2上我们还有没有方式可以进一步提高蓝牙的数据传输率?首先,我们从原理上看一下蓝牙应用...

    之前一文《蓝牙4.2最大传输速率详细分析》介绍了蓝牙4.2的最大数据传送率以及限制速率的三大原因,那么问题来了,在蓝牙4.2上我们还有没有方式可以进一步提高蓝牙的数据传输率?

    首先,我们从原理上看一下蓝牙应用程序数据的传递路径,并讨论可以优化和利用的地方,实现吞吐量优化。

    通用属性配置文件(GATT)是开发人员经常与最习惯于接口的层次, GATT定义了两个蓝牙低功耗设备之间传输数据的协议。具有特殊属性是应用程序数据实体的唯一标识。

    属性组形成固定的特性,这些特性为唯一的一组数据添加了额外的属性,例如权限和交互规则。一组特性形成一个称为服务的大型实体,服务为给定的特征或功能添加更大的蓝图。

    例如,电池服务包括电池电量特性,其中包括给定设备的电池电量。(不是太了解BLE的层的关系可以翻阅一文)。

    属性协议(ATT)定义了传送属性数据的协议。这包括GATT相关功能,如写入请求,写入响应,通知,读取响应。简而言之,GATT为给定的应用程序定义和创建适当的属性,ATT创建,传输并分析在GATT层中定义的数据包。

    逻辑链路控制和适配协议(L2CAP)负责为诸如ATT,安全管理协议(SMP)等更高层协议服务与管理(QoS),接受链路层数据加以中继重组数据包,并传递给到ATT层和SMT层。

    链路层(LL)处理L2CAP包的传输,同时确保数据的保证传送和完整性。

    空中传输的BLE数据包格式如下:

    注意:数据字段取决于蓝牙规范。在蓝牙v4.0和4.1中,数据字段的最大大小是27个字节。蓝牙v4.2,增加了一个新功能来交换数据字段的长度。

    仔细看看数据字段

    BLE数据包的数据字段将填充L2CAP消息,如下所示:

    L2CAP头部的大小是固定的(4字节),当数据字段的最大尺寸是27字节时,允许每个BLE分组最多传送23个字节的ATT数据。

    划重点的时候到了:

    1.理想情况下,我们力求每个链路层数据包传输23个应用程序数据(链路层头数据字段长度占据4个字节)。

    2.可以从ATT层入手,加大ATT DATA使得应用程序传输大于23字节的数据包(链路层头数据字段长度占据4个字节)。

    ATT MTU

    ATT最大传输单元(MTU)是ATT分组的最大长度。 ATT MTU由L2CAP定义,可以在23和无穷之间。蓝牙堆栈的实现是确定客户端和外设的ATT MTU的关键因素。

    ATT数据包具有以下结构:

    其中OP代码表示ATT操作,例如写入命令,通知,读取响应等.ATT数据字段包含应用程序数据。

    当发送Write,Read和Notification或Indication包时,还需要包含相关的属性句柄(2个八比特组)以识别数据。

    23字节是ATT MTU的默认值,在此设置模式下,高位字节导致13%的开销数据( 3/(3+23) )。

    如果从以前的数据传输速率的文章中回想起来,我们选择了每个BLE数据包的20个字节的应用程序数据,以匹配Bluetooth v4.0和4.1中允许的默认值。

    ATT MTU测定

    当进入连接时,客户端和外可以通过交换MTU请求/响应ATT层命令交换它们的MTU。每一方不能传送比另一方指定的ATT_MTU更大的ATT值。

    例如,iPhone 6和6S ATT_MTU是185.这会导致182字节有效载荷的3/185或1.6%的头部开销。 L2CAP将传送185/23或9个链路层分组。

    当ATT_MTU是23时,185个字节的有效载荷将被分成185/20或10个ATT分组,这导致8个链路层分组。

    输出比较:

    我们的计算基于4个BLE数据包在一个连接事件和30毫秒的连接间隔。 这些设置与iOS设备类似。

    当给定的连接使用更大的ATT_MTU大小发送数据流时,我们绘制了吞吐量差异。

    结论:

    当使用更大的ATT_MTU时,吞吐量增加了大约0-15%,因为我们消除了传输ATT层开销字节并用数据替换它们。 使用23字节倍数的ATT_MTU大小或(链路层数据字段 - L2CAP头大小(4字节))是理想的。

    随着通过使用更大的ATT包增加吞吐量,这可能需要创建更少的BLE包,这也会降低功耗。

    除此双方协调ATT_MTU大小之外还可以通过以下方式提升蓝牙的数据传输率:

    1) 选择合适的连接参数,例如减小BLE Connection interval会提升数据交互频率。

    2) 选择一些不需要RSP的操作方式,例如write without rsp或notification。

    后面我们会针对一款蓝牙模块去做一个速率测评,希望大家都持续关注哦。

    展开全文
  • 一分钟读懂低功耗蓝牙连接数据包")做个对比就可以知道BLEMTU比较小(不过新的BLE标准MTU已经大幅提升,详见即将发表在VIEWTOOLBBS上的后续文章)。****************************************************************...

    一分钟读懂低功耗蓝牙连接数据

    "

    )

    做个对比就可以知道

    BLE MTU

    比较小(不过新的

    BLE

    标准

    MTU

    已经大幅提升,详见

    即将发表在

    VIEWTOOL BBS

    上的后续文章)

    ****************************************************

    ************“******

    *******************

    以太网:

    1500

    IEEE 802.3/802.2:

    1492

    X.25: 576

    BLE: 23

    =>

    这就是为什么

    WIFI

    可以用于传输视频,

    传统蓝牙

    (BT)

    可以传输音频,

    而低

    功耗蓝牙(

    BTLE

    或者

    BLE

    )只能够传输控制数据的原因了。

    ***********************************************************************

    *******************

    * MTU

    交换命令:属于

    ATT

    命令

    * MTU

    交换过程:如下图

    展开全文
  • 蓝牙5.2 spec 增加3部分:EATT, LE 功率控制,LE Isochronous Channels。1. Enhanced Attribute Protocol(EATT)EATT是ATT 增强版,通过处理交织后的L2CAP SDUS,可有效缓解BLE时延。BLE 协议栈包括两大部分 Host和 ...

    蓝牙5.2 spec 增加3部分:

    EATT, LE 功率控制,LE Isochronous Channels。

    1. Enhanced Attribute Protocol(EATT)

    EATT是ATT 增强版,通过处理交织后的L2CAP SDUS,可有效缓解BLE时延。
    BLE 协议栈包括两大部分 Host和 Controller, 如下图:

    443e046a935a5a95580c5efb2e5bc857.png
    图1 BLE 协议栈结构

    Host 中红色部分Attribute Protocol (ATT) ,在蓝牙 5.2 中做了改进,并称之为Enhanced Attribute Protocol(EATT),同时 Generic Attribute Profile (GATT) 做了相应修改。

    EATT可并行处理不同应用程序ATT PDU 交织后的L2CAP SDU(见图2)。如图2中所示,APP A 的PDU P1 在L2CAP层分成seg #1/2 ,并在中间插入APP B 的P2 SDU,因此在处理 APP B不需要太久等待时间 。同时允许ATT最大传输单元(MTU)在连接过程中动态变化。若有多个应用程序同时运行,EATT可显著减少某个程序独占堆栈时间,降低应用程序端端时延,改善用户体验。因此可以很好缓解当前蓝牙耳机卡顿,时延问题。

    BT 5.2也定义新L2CAP模式支持EATT,暂不详述。

    b78a09a87750a9bb83adaa35c15a43c7.png
    图2 L2CAP层 数据交织化

    2. LE 功率控制

    通过功率控制降低设备功耗。利用RSSI标定链路等级,提高通信可靠性。
    接收机通过计算接收信号功率(RSSI),来动态调整发射机的发射功率,让接收信号功率控制在最佳范围,解调时可获得最佳误码率(BER),避免发射功率过大或过小。

    同时通过控制发射功率,让LE设备与其他工作在2.4G频段设备共存,降低干扰。

    功率控制模块同时也提供链路损耗检测功能,根据接收信号功率(RSSI),LE设备可以将链路损耗标定在2或3个等级,如低,中或高。在蓝牙通信频点选择中有效运用信道路径损耗等级,提高通信的可靠性。3. LE Isochronous Channels

    Isochronous Channels(同步通道)分为连接和非连接模式

    连接模式,蓝牙从设备(slave)与主设备(master)双向通信,同步处理数据。解决蓝牙左右耳机不同步问题。

    非连接模式,单个或者多个蓝牙从设备(slave)单向接收主设备(master)数据,并同步处理数据。实现蓝牙广播功能。

    (1)连接工作模式使用LE连接同步流(LE-CIS)传输支持双向通信。单个LE-CIS流提供点对点同步通信。数据在指定时间内传输,否则将被丢弃。数据流传输见图。

    e26a5f03a0b42fe5fa53dc97d87ceb5c.png
    图3 连接模式数据流传输

    多个CIS流同步处理过程如下。

    首先多个CIS应归属于同一个通道组CIG(ConnectedIsochronous Groups)。

    96924c8791ca44fdf54e50b03d24fc26.png
    图4 主设备与两个从设备(左右耳机)连接工作模式

    为了达到同步处理,CIG会给每个CIS不同时延参数,让其在各自时间段后同步处理,如图。

    b59e9ce544749ee64afa482edac45b24.png
    图5 连接模式时间延时与同步处理数据

    (2)非连接工作模式使用广播同步流(BIS)单向通信。LE-S或LE-F逻辑链路传输用户数据,而LEB-C广播控制信息,如信道频点图等。单个BIS可以给不同设备传输相同的数据。

    247cbe63e7fb297d672360d4ede393ab.png
    图6 非连接模式数据流传输

    多个BIS流同步处理过程理解如下。

    首先多个BIS(最多31个)必须同属于一个广播组BIG(Broadcast Isochronous Groups),如图。一个主设备(master)可创建多个BIGS。

    66c0bdccf28980596e7c6b4fa65b0a11.png
    图7 主设备与从设备非连接工作模式

    在非连接模式下,为了达到同步处理需要两个步骤。

    (a)各个BIS接收master广播的时间信息建立同步。

    (b)根据BIG事件的开始时间,持续时间,结束时间,以及其他时间参数,实现BIS在BIG事件生命周期内同步处理。

    更多蓝牙文章,欢迎关注微信公众号“蓝牙之星”。

    (1)“为何Airpods 远距离连接信号好?谈谈蓝牙耳机接收距离与解调性能”

    (2)“蓝牙BLE 5.1 Direction Finding解析”

    展开全文
  • nRF52832 作为一个低功耗蓝牙芯片,其数据发送发送速率一直都偏低(高就不叫低功耗了^_^),作为初学者在网上找了很多资料,终于找到通过修改ATT_MTU来提升发送速率的方法,最快能达到8.2KB/s,现在就分享出来首先我用...
  • 说起 MTU 值,可能许多朋友连听都没听说过。简单来说,我们上网时所进行的操作,都是通过传输一个又一个“数据包”来实现的,而 MTU 值就是用来设定可传输数据包的最大尺寸的。很显然,MTU 值设置得过大或过小,都会...
  • 当android api大于等于21时候,我们可以调用一个修改MTU的接口,即尝试修改每包的数据长度,该值范围可以是23~252字节,3字节头+用户数据为20~249字节,如下图所示: 该接口有一个回调,如下所示: 返回的MTU就是...
  • 蓝牙MTU

    2020-04-13 00:19:36
    蓝牙MTU 值是在L2CAP(逻辑链路控制层)中定义的.
  • Android中自定义蓝牙MTU

    千次阅读 2019-01-19 13:20:46
    1、最大传输单元(Maximum Transmission Unit, MTU) ...2、蓝牙MTU默认23个Byte core spec中ATT的默认MTU为23个Byte,ATT的Opcode占1个Byte、ATT的Handle2个Byte、GATT占20个Byte。 23Byte...
  • 一分钟读懂低功耗蓝牙_BLE_MTU交换数据包
  • nRF52832 作为一个低功耗蓝牙芯片,其数据发送发送速率一直都偏低(高就不叫低功耗了^_^),作为初学者在网上找了很多资料,终于找到通过修改ATT_MTU来提升发送速率的方法,最快能达到8.2KB/s,现在就分享出来 ...
  • 调用aci_gatt_exchange_config这个api可以产生mtu交互事件。 /** * @brief Perform an ATT MTU exchange procedure. When the ATT MTU exchange procedure is completed, a @ref aci_att_exchange_mtu_resp_event ...
  • ATT_MTU throughput example in SDK 13.0.0-1.alpha, which allows you to configure various Bluetooth low energy (BLE) parameters to test out the impact on throughput and range. This demo adds some ...
  • 1.概述 * MTU: 最大传输单元(MAXIMUM TRANSMISSION UNIT) , 指在一个PDU (Protocol Data Unit: 协议数据单元,在一个传输单元中的有效传输数据)能够传输的最大数据量(多少字节可以一次性传输到对方)。...
  • 支持BLE 4.2的蓝牙SOC芯片与手机app之间的数据包长度(MTU) 在[BLE 4.2][6]之前,BLE芯片与手机通信的蓝牙数据包长度MTU是[23][6]字节,其中还包括2字节的handle值,1字节的operation码,所以留给应用层的数据长度...
  • CC2640R2F蓝牙调试——更改MTU PDU大小

    千次阅读 2018-11-14 13:52:59
    // The maximum ATT_MTU is MAX_PDU_SIZE - 4. #define MAX_PDU_SIZE 251//69 3、初始化中调用参数设置函数。 HCI_LE_WriteSuggestedDefaultDataLenCmd(APP_SUGGESTED_PDU_SIZE, APP_SUGGESTED_TX_TIME); ...

空空如也

空空如也

1 2 3 4
收藏数 80
精华内容 32
关键字:

mtu蓝牙