欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android用tabhost实现 界面切换,每个界面为一个独立的activity操作

程序员文章站 2022-07-04 17:03:04
我就废话不多说了,大家还是直接看代码吧~补充知识:android ble中传输数据的最大长度怎么破好多小伙伴们都被一个事儿困扰过:想在gatt client上(一般是手机上)传输长一点的数据给gatt...

我就废话不多说了,大家还是直接看代码吧~

补充知识:android ble中传输数据的最大长度怎么破

好多小伙伴们都被一个事儿困扰过:

想在gatt client上(一般是手机上)传输长一点的数据给gatt server(一般是一个bluetooth smart设备,即只有ble功能的设备),但通过

writecharacteristic(bluetoothgattcharacteristic)

来写的时候发现最多只能写入20个byte的数据。

这篇文章会回答下面几个问题:

1)为什么会是20?

2)如何突破20?

3)如何更优雅的来实现?

第一个问题,为什么为限制成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的接口为:

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

大声的说出来你想要一下子传多少,调用上面的接口就可以了,然后在下面的函数中看最终结果(当然了,如果你的peripheral申请改变mtu并且成功的话,那这个回调也会被调用):

之后你就可以快乐的发送supportedmtu-3的长度的数据了。

第三个问题,如何优雅的来实现?

俗话说得好,郎有情就怕妾无意。万一对方设备不同意你的请求怎么办?

对于app来说,一般是知道自己要最大发送多少数据的,例如一次要发100个bytes,那么就首先试试申请一下103,失败的话,则申请一下53,即二分法,剩下的只能自己分段拆着发了。

一般来讲,app的开发者和对端设备的开发者都是同一伙儿人,这是好事儿,他们可以根据自己设备的硬件情况,来商量mtu应该是多少。

总之,把事儿摆到桌面上,提前做好,会使得你的程序更加professional。

以上这篇android用tabhost实现 界面切换,每个界面为一个独立的activity操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。