首页 > 芯片 > 半导体 > ble服务列表最多可以多少,Android BLE设置MTU大小20200820

ble服务列表最多可以多少,Android BLE设置MTU大小20200820

来源:整理 时间:2024-05-02 23:29:28 编辑:亚灵电子网 手机版

1,Android BLE设置MTU大小20200820

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设置MTU大小20200820

2,flutter 蓝牙bleblue tooth同时连接多台多个设备

于是就有了写作本文的动力,-------->解决同时连接多台蓝牙设备!!! flutter_blue 适合于单台的蓝牙设备,使用起来简单 flutter_reactive_ble 适合于单台的蓝牙设备,多台蓝牙设备也可以用 flutter_ble_lib 适合于单台的蓝牙设备,多台蓝牙设备也可以用,可以在模拟器上进行调试蓝牙 感觉后2个第三方库都可以使用,本人先入为主使用了flutter_reactive_ble,所以本文以flutter_reactive_ble为基础进行介绍 先声明4个全局变量,后面会用到 开始扫描 如果扫描过程,不使用过滤条件,withServices这个参数可以给个空数组 停止扫描如下 连接设备 断开设备, 每连接成功一个设备后,就会产生一个_connectionStreamSubscription,对应设备的断开,就用对应的StreamSubscription去断开, 可以用一个HashMap,去记录 连接成功的设备 与 StreamSubscription 的对应关系 去扫描服务,并过滤服务,扫描结果服务里面是包含有特征的数组,如: serviceId:[fff0,fff1,fff2,fff3,...] 去监听上报来的数据,参数来自前面扫描到的结果serviceId--服务ID, characteristicId--特征ID,deviceId--设备ID 后面就是各位看官根据自己的需求去做逻辑处理啦。 对设备设置命令,发送请求(写操作),list为整形数据,要写的数据 读取设备的信息(读操作) flutter 多台蓝牙设备同时连接的分享就到这里喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点个赞吧~~ 后续分享更多有关flutter的文章。如果有疑问的话,请在下方留言~ 过一段时间后,我在项目把这个蓝牙库用起来了,基本能满足日常需求.效果如下:

flutter 蓝牙bleblue tooth同时连接多台多个设备

3,蓝牙BLE协议栈基础知识

这次介绍一下蓝牙协议栈(BLE)的基础知识,蓝牙协议栈组成如下图所示,首先我们说说GAP和GATT GAP层是负责连接的,其中包含广播、扫描、连接、断开的过程和参数 1.1 角色 蓝牙设备的角色主要有中心(Central)和外围设备(Peripheral)两种,中心设备向外围设备发起连接。链路层的主机(Master)和从机(Slave)的概念跟中心和外围的概念是对应的。 除了中心和外围之外,还有Observer和Broadcaster角色,Observer一直进行监听,Broadcaster一直进行发送,这两种角色都只广播,不能发起连接或者被连接,这里就不详细说了 1.2 广播 建立连接之前,外围设备每隔一段时间发送一个广播包,让正在扫描的设备知道这是一个可以连接的设备,扫描设备才能对外围设备开始连接,这个广播包的时间间隔叫advertising interval,这个间隔可以在10ms到10.24s之间,间隔的长短会影响建立连接所花时间。 中心要收到广播包之后才能发送连接请求,相应的,外围设备在发送广播包之后会等待连接请求。 蓝牙广播包最多可以包含31字节数据,包含设备名称和一些标志。中心收到广播包之后可以发送Scan Request以请求更多的广播信息,外围设备会回复一个同样是31个字节的Scan Response。 BLE有37个数据信道和3个广播信道,广播包,Scan Request,Scan Response使用广播信道 1.3 扫描 扫描是指中心监听广播包并且发送Scan request。扫描中有两个参数:Scan window(扫描窗口) 和Scan interval(扫描间隔) 1.4 发起连接 中心发起连接的过程类似于扫描的过程,中心收到广播包之后会发送一个连接请求给外围设备 1.5 连接 中心和外围设备连接上之后,中心会按照一定的连接间隔(Connection interval)向外围设备请求数据,这个间隔是由中心定的,在7.5ms到4s之间。 如果要提高吞吐量,可以在一个连接间隔中传输多个数据包,每个包最多可以包含20字节数据。如果要省电,并且外围设备并没有什么数据需要传输,可以跳过几个连接间隔,这称之为Slave latency。 如果外围设备没有在规定时间内响应中心的请求就会认为是连接中断,称之为Supervision Time-out(0.1s-32s),所以在使用Slave latency的时候要注意不要引起Supervision Time-out 这些参数是建立连接的时候中心确定的,如果建立连接之后外围设备想要更改,可以向中心发送Connection parameter update request。 整个数据交换的过程会在不同的频段中跳频(除了广播频段),跳频是自动完成的,不需要我们去管。 设备之间的数据传输是在GATT这层完成的 2.1 角色 除了GAP里面的角色,BLE在GATT里面也定义了两个角色,分别是GATT Server 和GATT Client,一般来说产生数据的设备是GATT Server,访问数据的设备是GATT Client,一个设备可以既是GATT Server也是GATT Client。这两个角色跟GAP中的角色并没有关系。 2.2 GATT结构 GATT Server通过属性表(Attribute table)来组织数据, 2.2.1 Attribute 上图中每一行就是一个属性Attribute。 每个属性具有一个handle,一个UUID,和一个Value。 Handle是Attribute的一个索引,每个Attribute的Handle都是唯一的。 UUID(universal unique identifier)表示的是Attribute中数据的类型信息。UUID在一个设备里面不是唯一的,可以有多个Attribute的UUID都一样 2.2.2 Characteristic 可以把Characteristic看作是上图中几行的集合(几个Attribute的集合) 每个Characteristic至少有两个Attribute,其中一个是声明,另一个包含数据。前面说过,蓝牙传输数据是通过GATT来传的,更具体的来说,是通过一个个Characteristic来传的。 2.2.3 Descriptors 描述符 Characteristic除了包含声明和数据之外,还可以有描述符(Descriptors,但不是必须有),Descriptors是用来进一步描述Characteristic(但不提供数据)的Attribute,比如说用自然语言描述该Characteristic是用来干什么的。 有一类特殊的描述符,叫CCCD(Client Characteristic Configuration Descriptor),支持Notify和Indicate的Characteristic 必须包含CCCD 2.2.4 Service Service 是一个或者多个Characteristic的逻辑组合 一个GATT Service 通常包含了一些相关的功能,举例来说,一个人机界面Service包含了各种人机交互输入输出的数据,而其中的每个Characteristic 是一类信号或者设备 介绍几个常见的Service。 GAP GATT Service:作为Central或者Peripheral的BLE设备都需要有这个Service。这个Service包含了如何发现和连接设备的信息 Generic Attribute Service: GATT Server都要有这个Service,这个Service包含了GATT Server的信息 2.2.5 Profile 一个或者多个Service组合在一起称为Profile。Profile 是逻辑上的概念,自己并不具备单独的Attribute。 2.3 标准和自定义的Service和Characteristic 蓝牙联盟定义了一些标准的Profile, Service, Characteristic 和Attribute。由于Profile和Service是在具体应用中规定的,所以用户可以进行自定义 2.4 UUID 图2中每一个Attribute都有UUID,UUID是一个128位的数字,是用来描述Attribute的类型的 2.4.1 蓝牙联盟UUID 蓝牙联盟把UUID分为基础UUID(base UUID)和16位UUID。 蓝牙联盟规定的UUID都具有同样的base UUID: 0x0000xxxx-0000-1000-8000-00805F9B34FB 蓝牙联盟规定了一些16位UUID,替换掉base UUID中的xxxx就组成一个完整的128位UUID了。举例来说,0x2A37是一个16位Heart Rate Measurement Characteristic,那么对应的128位的UUID就是: 0x00002A37-0000-1000-8000-00805F9B34FB。 由于所有蓝牙联盟的UUID都具有同样的base UUID,所以用16位UUID就可以区分蓝牙联盟规定的Attribute了 但我们自定义的Attribute, Characteristic, Service,不能使用这个base UUID,因此也不能用16位UUID,只能使用制造商自定义的128位UUID。 2.5 空中接口操作和属性 由于每个Attribute具有唯一的Handle,所以几乎所有的操作都是通过Handle去完成,Characteristic常用的属性有:Write, Write without response, Read, Notify, Indicate。 Characteristic的属性决定了我们可以如何使用它 Write, Write without response 这两种属性允许GATT Client 对Server的characteristic的值进行写操作,两者的区别是Write without response对写操作不会有确认 Read GATT Client可以读Server的Characteristic的值。 Notify 和Indicate 这两种属性表示的是当GATT Server 中该Characteristic 的值发生变化的时候会通知Client。两者的区别是Indicate 会进行确认但Notify不会 接下来举例说明一下前面介绍的概念 Thingy 的Services,作为Server需要有GAP Service和GATT Service,另外还有一个标准的Battery Service,后面是几个自定义的服务 详细的看看GAP Service,这个服务的Handle是1到9,那么把这些Characteristics和Attribute都打出来 可以看到这个Service的结构是这样的 这是一个标准的Service,使用标准Service/Characteristic的时候要符合蓝牙SIG对这个Service/Characteristic的规定,我们可以到 蓝牙SIG 看看是不是一致 以上就是BLE的一些基础知识和示例

蓝牙BLE协议栈基础知识

文章TAG:服务ble服务列表最多可以多少AndroidBLE设置MTU大小20200820

最近更新

  • 去偶电路,电路去耦方法去偶电路,电路去耦方法

    -电路中的寄生电容:电路中的寄生电容在断电后会继续保持一定的电压,这些电压也会形成残压。旁路(去耦):为交流电路中的一些并联元件提供低阻抗路径,增加去耦电容可以减少地面炸弹对整个电.....

    半导体 日期:2024-05-02

  • 55nm工艺 芯片合封,5毫米芯片技术55nm工艺 芯片合封,5毫米芯片技术

    台积电大规模生产2纳米芯片,华为开发7纳米芯片,而SMIC仍在努力开发55纳米芯片。台积电2纳米芯片量产技术的突破让人不禁怀疑SMIC为何仍坚持研发55纳米芯片,在40纳米和55纳米节点市场上,可.....

    半导体 日期:2024-05-02

  • 干电瓶 0电压 修复,电池电压为0干电瓶 0电压 修复,电池电压为0

    开路,修复方法:检测电池电压,激活电池修复:补水充电修复法、脉冲电压修复法、修复仪修复法、满充满放修复法。干电池可以通过脉冲修复,补充水分和充电如果电池缺水,导致掉电或无存储,您可以.....

    半导体 日期:2024-05-02

  • 锂电池测电压,如何测量铁锂电池的终止电压?锂电池测电压,如何测量铁锂电池的终止电压?

    电压法:用电压表或万用表测量锂电池的电压。锂电池的标准电压是,通过测量电池电压,我们可以知道当电池的标准电压已知时,我们可以同步知道电池的满充电电压和欠充电电压,例如,如果测量的电.....

    半导体 日期:2024-05-02

  • 通用芯片好处,芯片是通用的通用芯片好处,芯片是通用的

    先说自研芯片的好处。事实上,自研芯片的好处真的很多,补充信息:芯片卡优点:不易被复制,安全性高;不易消磁;具备闪付功能;该芯片卡使用寿命长,该技术可用于所有品牌的NANDFlash芯片,从定义中可.....

    半导体 日期:2024-05-02

  • switch芯片 作用物理开关芯片原理switch芯片 作用物理开关芯片原理

    switch的硬破芯片主要用于破解switch以达到游戏体验的目的。硬断是指通过焊接sxcore芯片使开关开裂,switch第六代芯片稳定,因此,switch第六代芯片是稳定的,第三代和第四代开关modchip的区.....

    半导体 日期:2024-05-02

  • 深水电鱼机多少钱,黄金钓位为何不上鱼深水电鱼机多少钱,黄金钓位为何不上鱼

    黄金钓位为何不上鱼这么强,支持楼主,佩服2,空手在深水秧苗捉黄鳝的高手能回答要么用茶子麸加水灌进去,要么用电鱼机打。3,哪有打深水鱼的机头卖淘宝商店有好多,我在湖北看到有好多,可以打100.....

    半导体 日期:2024-05-02

  • 电源壳子有电压波动,功放DC正负电源波动大的原因电源壳子有电压波动,功放DC正负电源波动大的原因

    电脑电源输出电压不稳定,与某些电路和元器件有关:电源输出端连接的去耦滤波电解电容损坏,导致电压输出纹波大。恒压电源输出电压空载时有两路输出电源,其电压跳变的原因有:外部因素,即外部.....

    半导体 日期:2024-05-02