导航:首页 > 操作系统 > androidrequestmtu

androidrequestmtu

发布时间:2023-02-09 13:46:49

㈠ ios 是否有蓝牙mtu设置方法 requestmtu

电信修改的是电信路由器的MTU,叫做Max Transission Unit,你改动你的路由器的MTU是没有任何作用的。。。

android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码)

万物互联的物联网时代的已经来临,ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点,抽时间梳理下这块的知识点。

涉及ble蓝牙通讯的客户端(开启、扫描、连接、发送和接收数据、分包解包)和服务端(初始化广播数据、开始广播、配置Services、Server回调操作)整个环节以及一些常见的问题即踩过的一些坑。

比如
1、在Android不同版本或不同手机的适配问题,扫描不到蓝牙设备
2、如何避免ble蓝牙连接出现133错误?
3、单次写的数据大小有20字节限制,如何发送长数据

蓝牙有传统(经典)蓝牙和低功耗蓝牙BLE(Bluetooth Low Energy)之分,两者的开发的API不一样,本文主讲Ble蓝牙开发,传统蓝牙不展开,有需要的可以自行了解。

相对传统蓝牙,BLE低功耗蓝牙,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输。

客户端

服务端

Android4.3(API Level 18)开始引入BLE的核心功能并提供了相应的 API。应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等操作。

BLE蓝牙协议是GATT协议, BLE相关类不多, 全都位于android.bluetooth包和android.bluetooth.le包的几个类:
android.bluetooth.
.BluetoothGattService 包含多个Characteristic(属性特征值), 含有唯一的UUID作为标识
.BluetoothGattCharacteristic 包含单个值和多个Descriptor, 含有唯一的UUID作为标识
.BluetoothGattDescriptor 对Characteristic进行描述, 含有唯一的UUID作为标识

.BluetoothGatt 客户端相关
.BluetoothGattCallback 客户端连接回调
.BluetoothGattServer 服务端相关
.BluetoothGattServerCallback 服务端连接回调

android.bluetooth.le.
.AdvertiseCallback 服务端的广播回调
.AdvertiseData 服务端的广播数据
.AdvertiseSettings 服务端的广播设置
.BluetoothLeAdvertiser 服务端的广播

.BluetoothLeScanner 客户端扫描相关(Android5.0新增)
.ScanCallback 客户端扫描回调
.ScanFilter 客户端扫描过滤
.ScanRecord 客户端扫描结果的广播数据
.ScanResult 客户端扫描结果
.ScanSettings 客户端扫描设置

BLE设备分为两种设备: 客户端(也叫主机/中心设备/Central), 服务端(也叫从机/外围设备/peripheral)
客户端的核心类是 BluetoothGatt
服务端的核心类是 BluetoothGattServer 和 BluetoothLeAdvertiser
BLE数据的核心类是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor

下面详细讲解下客户端和服务端的开发步骤流程

安卓手机涉及蓝牙权限问题,蓝牙开发需要在AndroidManifest.xml文件中添加权限声明:

在搜索设备之前需要询问打开手机蓝牙:

注意: BLE设备地址是动态变化(每隔一段时间都会变化),而经典蓝牙设备是出厂就固定不变了!

通过扫描BLE设备,根据设备名称区分出目标设备targetDevice,下一步实现与目标设备的连接,在连接设备之前要停止搜索蓝牙;停止搜索一般需要一定的时间来完成,最好调用停止搜索函数之后加以100ms的延时,保证系统能够完全停止搜索蓝牙设备。停止搜索之后启动连接过程;

BLE蓝牙的连接方法相对简单只需调用connectGatt方法;

参数说明

与设备建立连接之后与设备通信,整个通信过程都是在BluetoothGattCallback的异步回调函数中完成;

BluetoothGattCallback中主要回调函数如下:

上述几个回调函数是BLE开发中不可缺少的;

当调用targetdDevice.connectGatt(context, false, gattCallback)后系统会主动发起与BLE蓝牙设备的连接,若成功连接到设备将回调onConnectionStateChange方法,其处理过程如下:

判断newState == BluetoothGatt.STATE_CONNECTED表明此时已经成功连接到设备;

mBluetoothGatt.discoverServices();

扫描BLE设备服务是安卓系统中关于BLE蓝牙开发的重要一步,一般在设备连接成功后调用,扫描到设备服务后回调onServicesDiscovered()函数,函数原型如下:

BLE蓝牙开发主要有负责通信的BluetoothGattService完成的。当且称为通信服务。通信服务通过硬件工程师提供的UUID获取。获取方式如下:

具体操作方式如下:

开启监听,即建立与设备的通信的首发数据通道,BLE开发中只有当客户端成功开启监听后才能与服务端收发数据。开启监听的方式如下:

BLE单次写的数据量大小是有限制的, 通常是20字节 ,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,数据包和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。
监听成功后通过向 writeCharacteristic写入数据实现与服务端的通信。写入方式如下:

其中:value一般为Hex格式指令,其内容由设备通信的蓝牙通信协议规定;

若写入指令成功则回调BluetoothGattCallback中的onCharacteristicWrite()方法,说明将数据已经发送给下位机;

若发送的数据符合通信协议,则服务端会向客户端回复相应的数据。发送的数据通过回调onCharacteristicChanged()方法获取,其处理方式如下:

通过向服务端发送指令获取服务端的回复数据,即可完成与设备的通信过程;

当与设备完成通信之后之后一定要断开与设备的连接。调用以下方法断开与设备的连接:

源码上传在CSDN上了,有需要的可以借鉴。

=====> Android蓝牙Ble通讯Demo示例源码–扫描,连接,发送和接收数据,分包解包

BLE单次写的数据量大小是有限制的,通常是20字节,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,数据包和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。
总体流程如下:
1、定义通讯协议,如下(这里只是个举例,可以根据项目需求扩展)

2、封装通用发送数据接口(拆包)
该接口根据会发送数据内容按最大字节数拆分(一般20字节)放入队列,拆分完后,依次从队列里取出发送

3、封装通用接收数据接口(组包)
该接口根据从接收的数据按协议里的定义解析数据长度判读是否完整包,不是的话把每条消息累加起来

4、解析完整的数据包,进行业务逻辑处理

5、协议还可以引入加密解密,需要注意的选算法参数的时候,加密后的长度最好跟原数据长度一致,这样不会影响拆包组包

一般都是Android版本适配以及不同ROM机型(小米/红米、华为/荣耀等)(EMUI、MIUI、ColorOS等)的权限问题

蓝牙开发中有很多问题,要静下心分析问题,肯定可以解决的,一起加油;

㈢ Android BLE设置MTU大小(2020-08-20)

MTU是指在一个协议数据单元中( Protocol Data Unit, PDU ) 有效的最大传输 Byte 。

不同的蓝牙版本最大MTU不同,例如:蓝牙4.2的最大MTU=247Byte(不一定正确,也有说是257Byte、也有说是241Byte),蓝牙5.0的最大MTU=512Byte,有效的最大MTU还需要减去协议Byte、Opcode和Handler。
蓝牙4.2:1Byte(Opcode)+2Byte(Handler)+244Byte(BATT)=247Byte(不一定正确)
蓝牙5.0:512Byte不一定正确)

Added in API level 21
在 Android 中修改MTU很简单只需要调用 BluetoothGatt#requestMtu(int MTU) 方法即可。 requestMtu(intMTU) 必须在发现蓝牙服务并建立蓝牙服务连接之后才能调用,否则 MTU 会默认为 20Byte 。如果调用成功会自定回调 BluetoothGattCallback 类中的 onMtuChanged(BluetoothGatt gatt, int mtu, int status) 方法。

注意:我看到一些文档提到在 public void onServicesDiscovered(BluetoothGatt gatt, int status) { } 方法中设置 MTU ,但是亲自尝试之后不起作用。所以在连接成功之后立即设置 MTU ,成功之后再去搜索服务。

㈣ Android 低功耗蓝牙(Ble) 开发总结

Android 从 4.3(API Level 18) 开始支持低功耗蓝牙,但是只支持作为中心设备(Central)模式,这就意味着 Android 设备只能主动扫描和链接其他外围设备(Peripheral)。从 Android 5.0(API Level 21) 开始两种模式都支持。

低功耗蓝牙开发算是较偏技术,实际开发中坑是比较多的,网上有很多文章介绍使用和经验总结,但是有些问题答案不好找,甚至有些误导人,比如 :获取已经连接的蓝牙,有的是通过反射,一大堆判断,然而并不是对所有手机有用,关于Ble传输速率问题的解决,都是默认Android每次只能发送20个字节,然而也并不是,,,下面进入正文。

这里用的是 Android5.0 新增的扫描API,

这里说一下,如果做蓝牙设备管理页面,可能区分是否是已连接的设备,网上又通过反射或其他挺麻烦的操作,也不见得获取到,官方Api 就有提供

与外围设备交互经常每次发的数据大于 mtu的,需要做分包处理,接收数据也要判断数据的完整性最后才返回原数据做处理,所以一般交互最少包含包长度,和包校验码和原数据。当然也可以加包头,指令还有其他完整性校验。下面分享几个公用方法:

我自己封装的一个BleUtil ,因为涉及跟公司业务关联性太强(主要是传输包的协议不同)就先不开源出来了,如果这边文章对大家有帮助反馈不错,我会考虑上传个demo到github供大家使用,
在这先给大家推荐一个不错 Demo ,里面除了没有分包,协议,和传输速率。基本的功能都有,而且调试数据到打印到界面上了。最主要是它可以用两个个手机一个当中心设备一个当外围设备调试。

首先传输速率优化有两个方向,1 外围设备传输到Android 。2 Android传输到外围设备。
我在开发中首先先使用上面那位仁兄的demo调试,两个Android 设备调试不延时,上一个成功马上下一个,最多一秒发11个20字节的包。

后来和我们的蓝牙设备调试时发现发送特别快,但是数据不完整,他蓝牙模块接收成功了,但是透传数据到芯片处理时发现不完整,我们的硬件小伙伴说因为 波特率 限制(差不多每10字节透传要耗时1ms)和蓝牙模块的buff (打印时是最多100byte,100打印的)限制,就算蓝牙模块每包都告诉你接收成功,也是没透传完就又接收了。后来通过调试每次发20K数据,最后是 Android 发是 20字节/130ms 稳定。给Android 发是 20字节/ 8ms 。 (天杀的20字节,网上都是说20字节最多了)

后来看了国外一家物联网公司总结的 Ble 吞吐量的文章(上面有连接),知道Android 每个延时是可以连续接收6个包的。就改为 120字节/ 16ms (为啥是16ms,不是每次间隔要6个包吗,怎么像间隔两次,这时因为波特率影响,多了5个包100字节,差不多 我们的单片机透传到蓝牙模块要多耗时不到10ms )
而Android 发数据可以申请 我们设备的mtu 来得到最多每次能发多少字节。延时还是130ms,即:241字节/ 130ms 提高12倍,这个速度还可以。

根据蓝牙BLE协议, 物理层physical layer的传输速率是1Mbps,相当于每秒125K字节。事实上,其只是基准传输速率,协议规定BLE不能连续不断地传输数据包,否则就不能称为低功耗蓝牙了。连续传输自然会带来高功耗。所以,蓝牙的最高传输速率并不由物理层的工作频率决定的。

在实际的操作过程中,如果主机连线不断地发送数据包,要么丢包严重要么连接出现异常而断开。

在BLE里面,传输速度受其连接参数所影响。连接参数定义如下:

1)连接间隔。蓝牙基带是跳频工作的,主机和从机会商定多长时间进行跳频连接,连接上才能进行数据传输。这个连接和广播状态和连接状态的连接不是一样的意思。主机在从机广播时进行连接是应用层的主动软件行为。而跳频过程中的连接是蓝牙基带协议的规定,完全由硬件控制,对应用层透明。明显,如果这个连接间隔时间越短,那么传输的速度就增大。连接上传完数据后,蓝牙基带即进入休眠状态,保证低功耗。其是1.25毫秒一个单位。

2)连接延迟。其是为了低功耗考虑,允许从机在跳频过程中不理会主机的跳频指令,继续睡眠一段时间。而主机不能因为从机睡眠而认为其断开连接了。其是1.25毫秒一个单位。明显,这个数值越小,传输速度也高。

蓝牙BLE协议规定连接参数最小是5,即7.25毫秒;而Android手机规定连接参数最小是8,即10毫秒。iOS规定是16,即20毫秒。

连接参数完全由主机决定,但从机可以发出更新参数申请,主机可以接受也可以拒绝。android手机一部接受,而ios比较严格,拒绝的概率比较高。

参考:
在iOS和Android上最大化BLE吞吐量
最大化BLE吞吐量第2部分:使用更大的ATT MTU

㈤ Android ble (蓝牙低功耗) 中的坑和技巧

new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString("00007777-0000-1000-8000-00805f9b34fb");

此时可以根据manfacturerData来匹配自己设定的外围设备

在BluetoothGattCallback中的关于此问题有三步回调
1、 public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState)

2、 public void onServicesDiscovered(BluetoothGatt gatt, int status)
mBluetoothGatt.discoverServices()执行后得到的callback,如果状态为GATT_SUCCESS,则可以获取ble旁支发起广播的service和descriptor,把广播设为enable

3、 public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status)
只有这一步status == BluetoothGatt.GATT_SUCCESS,才可以真正的传输数据,如果在第一步或者第二步就开始传输数据,会在某些特定的case下导致未知的bug或者空指针错误

所以,在中心设备跟外围开始连接后,你可以设定一个超时时间,在超时时间过后,依然没能回调onDescriptorWrite并获得BluetoothGatt.GATT_SUCCESS,则此次过程失败,你可以根据实际情况进行重连或者提示错误

如果要传输大于20字节的数据怎么办?

1、 系统mtu可以支持修改到512字节,完成大数据量的传输。但是由于涉及到中心和旁支都需要修改,会造成很大的局限性和底层修改量,而且会触发比如某些设备第一次修改不生效,另一个设备一次连接中只能修改一次等bug,非常不可取,十分不建议。

2、分包传输,自己设计协议分包传输是最可取的方案,需要注意的是在分包后,每一个包之间写入数据需要设置间隔,比如100ms。

在做好5和6的基础上,依然会在一些设备上出现,由于系统原因,ble刚开始的发送第一个数据出现丢包,请对此做出特殊处理。

㈥ 安卓BLE知识及EasyBle的使用

BLE(Bluetooth low energy)蓝牙低功耗是蓝牙4.0新增的子规范,其具有低能耗、低成本、低延迟、传输距离长等特点,自安卓4.3(api level 18)起,安卓开始支持BLE。BLE与经典蓝牙对比如下图():

在讲链接参数之前,需要先了解连接事件Connection Events
1)Conection Events(连接事件)
蓝牙设备建立连接后,所有信息的交换都是通过Connetion Events进行的,主设备在Connection Events开始起发送数据包,从属设备在Connection Events期间回复。Connection Events是周期性出现的且时间间隔很短,在一个Connection Events中,器件最大电流为十几mA,平均电流1uA,这便是BLE功耗较低的原因。Connection Events如下图()

2)链接参数
在两个蓝牙设备建立连接进入连接状态前,蓝牙设备需要设置一系列的链接参数,链接参数是在中心设备向外围设备发起连接请求时传递的:

当外围设备认为中心设备请求的链接参数不合适时,外围设备可在连接期间发送一个 Connetion Parameter UpdateRequest 请求中心设备更改链接参数。当中心设备收到请求时可接受或拒绝外围设备的链接参数更新请求

GATT层级图如下(图片来自 蓝牙官网 )

MTU(Maximum Transmission Unit): 即数据的最大传输单元。具体是指一个Chracteristic一次性可传输的数据大小。
蓝牙核心规范(core spec)中定义了ATT的默认MTU为23byte,除去ATT的opcode一个字节以及ATT的handle2个字节之后,剩下的20个字节便是留给GATT的了。由于ATT的最大长度为512byte,故一般认为MTU的最大长度为512个byte。
注:core spec规定每一个设备都必须支持MTU为23。

用系统api开发参见 安卓BLE开发官方文档
这里介绍使用第三方库 EasyBle 快速开发BLE

在项目根gradle中添加

在具体mole的gradle中添加

1)判断设备是否支持BLE并打开蓝牙

安卓版本不小于6.0的,扫描必须要有定位权限,若版本为Android10及以上,则需精确定位权限(即 Manifest.permission.ACCESS_FINE_LOCATION )

当需要结束扫描时用以下方法结束扫描,建议在扫描到目标设备后停止扫描

当需要断开与设备的连接时可使用以下任一方法断开设备连接

notify和indicate都使用以下方法

当需要取消notify或indicate时调用以下方法

如果一次性写入的数据长度大于MTU即最大传输单元(默认是20字节),则可以使用下列方法进行分批写入

当结束BLE通信时不要忘了调用destroy


㈦ 安卓系统的手机如何修改MTU值

  1. 进入系统后,输入ifconfig 命令查看可用网络

(7)androidrequestmtu扩展阅读:

通常来说MTU越小,设备所发送包的频率越快,在一些游戏和网络软件中可以通过更改MTU获得更好的效果。MTU代表的是封装包的大小,封闭包的大小决定你发送包的发送频率。

有条件的用户可以跟根据自己的需要来调整MTU值。以ISP(电信服务商)的MTU为基准,每下级设备的MTU都最好比上级设置的略低为好。例如在ISP=>猫=>路由器=>电脑的布局中,ISP的MTU是1466,那么下级的猫可以设置成1464,再下级的路由器可以设置成1462,再下级的电脑的MTU可以设置成1460,以此类推。

㈧ Android BLE中传输数据的最大长度怎么破

一般限制长度会变成20,主要原因:core spec里面定义了ATT的默认MTU为23个bytes,除去ATT的opcode一个字节以及ATT的handle2个字节之后,剩下的20个字节便是留给GATT的了。考虑到有些Bluetooth smart设备功能弱小,不敢太奢侈的使用内存空间,因此core spec规定每一个设备都必须支持MTU为23。在两个设备连接初期,大家都像新交的朋友一样,不知对方底细,因此严格的按照套路来走,即最多一次发20个字节,是最保险的。由于ATT的最大长度为512byte。因此一般认为MTU的最大长度为512个byte就够了,再大也没什么意义,你不可能发一个超过512的ATT的数据,就像是孙猴子跑不过五行山一样。所以ATT的MTU的最大长度可视为512个bytes。
变成20之后如何突破:改变传输的ATT的MTU就行了,大家经过友好的协商,得到双方都想要的结果,是最好的。在Android上(API 21),改变ATT MTU的接口为:

1
2
3
4
5
6
7
8
9
10
11
12
13

public boolean requestMtu (int mtu)

Added in API level 21
Request an MTU size used for a given connection.

When performing a write request operation (write without response), the data sent is truncated to the MTU size. This function may be used to request a larger MTU size to be able to send more data at once.

A onMtuChanged(BluetoothGatt, int, int) callback will indicate whether this operation was successful.

Requires BLUETOOTH permission.

Returns
true, if the new MTU value has been requested successfully

阅读全文

与androidrequestmtu相关的资料

热点内容
哪个网站下载源码不要钱 浏览:738
筹码源码指标公式股旁网 浏览:402
农商银行的app是什么名字 浏览:247
德国服务器适合做什么 浏览:138
java权限系统源码 浏览:163
androidmk编译aidl 浏览:880
单片机取8位 浏览:994
如何在云服务器上安装2s 浏览:7
怎么把王者安卓号转移到苹果 浏览:779
思科密码加密后怎么登录 浏览:591
安卓手机生态垃圾怎么办 浏览:113
fy187 浏览:597
python中文文字识别 浏览:882
日本蕾丝边电影 浏览:796
斯坦福编译原理讲义 浏览:147
国外大尺度漏器官电影 浏览:433
玩具解压神器怎么做 浏览:299
安卓手机如何共存歌曲 浏览:426
简单的游戏代码源码 浏览:346
金蝶服务器怎么改 浏览:595