# Android Ble蓝牙App(六)请求MTU与显示设备信息 站点:答源(https://www.dandroid.cn/) 原文:https://www.dandroid.cn/archives/21080 Canonical:https://www.dandroid.cn/archives/21080 作者:admin 发布日期:2023-09-25 最后更新:2023-09-25 16:44 分类:Android应用源码 / 硬件使用 内容类型:post 说明:本页是原文的纯文本镜像,供大模型与检索器完整读取;不含导航、广告、付费框。引用请以上方「原文」链接为准。 ## 正文 前言   在上一篇文章中已经了解了数据操作的方式,而数据交互的字节长度取决于我们手机与蓝牙设备的最大支持长度。 正文   本文中我们需要请求Mtu,然后做一些利用使用的UI改变,比如增加菜单,和显示设备操作信息。 一、请求MTU的概念   在 Android 的 BLE(Bluetooth Low Energy)开发中,requestMtu 是一个用于请求修改 BLE 连接的最大传输单元(MTU)的方法。MTU 是指在一个蓝牙数据包中能够传输的最大数据量。   通过调用 requestMtu 方法,你可以请求增加或减少 BLE 连接中的 MTU 大小。较大的 MTU 可以提高数据传输效率,因为每个数据包可以携带更多的数据。而较小的 MTU 可以降低延迟,因为数据可以更快地分割成较小的包进行传输。   获取MTU,蓝牙一般默认支持的MTU长度是23个字节,一个字节为类型操作码,两个字节为类型操作句柄,实际传输数据就是20字节。通过gatt.requestMtu(mtu)。会触发onMtuChanged回调。这里mtu 的范围在23 ~ 517之间,目前市面上Android版本高的手机基本上都是247。也就是说即使你mtu = 517,回调中的mtu可能还是247,为什么呢?因为你的Android手机上的蓝牙最大支持247。而在传输的时候你还需要-3,也就是244。单次传输的最大字节数据为244个字节。那么如果你有1000个字节需要进行传输,则需要对字节进行分包处理,例如一次最大传输244个字节,则需要分成5个包进行传输,前4个包,每个包为244个字节,最后一个包为24个字节。注意:在 Android 版本低于 5.0 的设备上,MTU 大小是固定的,无法通过此方法进行修改。 二、创建使用菜单   下面我们进行实操环节,首先我们需要增加一个请求MTU的入口,而当前页面上似乎并没有多余的入口了,那么我们就可以增加一个菜单了,首先在res下新建一个menu文件夹,在此文件夹下新建一个menu_main.xml文件,代码如下所示: 然后去MainActivity中增加菜单,首先在onCreate函数中增加如下代码: //设置支持ActionBar setSupportActionBar(binding.toolbar)   因为我们在主题中使用的是NoActionBar,而菜单实际上就是在ActionBar上的,所以设置我们的ToolBar支持ActionBar即可,然后在MainActivity中重写下面两个方法: /** * 创建选项菜单 */ override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main, menu) return true } /** * 选项菜单Item选中 */ override fun onOptionsItemSelected(item: MenuItem): Boolean { if (!bleCore.isConnected()) { showMsg("设备已断开连接") return false } when(item.itemId) { R.id.item_request_mtu -> showRequestMtuDialog() } return true }   这两个方法的意图很明显,一个创造菜单,一个监听菜单Item选中,在操作之前判断是否连接,在点击请求Mtu的菜单Item之后显示一个弹窗。 三、请求MTU弹窗   下面我们来写这个弹窗,首先在layout下创建一个dialog_request_mtu.xml文件,代码如下所示: