1、BLE设备首先执行GAP广播流程。
2、BLE设备接收连接请求,进入连接状态。
3、BLE设备做为GATT服务器,手机做为GATT客户端,手机使用GATT流程来查找BLE设备定义的服务、特征、并读写特征值属性和特征描述符属性。
打开SKB501的EVK物料套件,里面包含了SKB501 EVB板一块,Micro USB 电电源线一根,以及4条串口连接的杜邦线。
详细阅读EVB 使用手册,了解EVB板的基本功能。
下载PL2303串口驱动程序,并在用于调试蓝牙模块SKB501的电脑上安装该驱动程序PL2303_Prolific_DriverInstaller_v150exe
将Micro-USB电源线的USB端连接到计算机,另一端连接到EVB板,打开计算机设备管理器查看是否有相应的com端口
V_OUT 与 V_IN 用短路帽连接,蓝牙模块SKB501,将TX连接到P001、RX和P002。打开电源开关,电源指示灯亮,可以工作。
在调试电脑上下载并安装串口调试助手XCOM V20exe,打开并运行串口调试助手
选择相应的com端口,波特率为115200,发送命令执行相关 *** 作,实例发送“AT”的反馈结果表示硬件连接正常。
Bluetooth BR/EDR和BLE是两种不同的蓝牙技术,它们在使用上有一些区别,具体如下:
技术特性:BR/EDR是传统蓝牙技术,主要用于高速数据传输和音频传输,而BLE则是低功耗蓝牙技术,主要用于物联网设备和传感器等低带宽应用。
传输速率:BR/EDR的最高传输速率为3Mbps,而BLE的最高传输速率为1Mbps,但BLE的传输速率在实际应用中通常更低。
范围:BR/EDR的通信范围较广,可达到约100米,而BLE的通信范围较短,通常为10米左右。
能耗:BLE比BR/EDR更节能,因为它的工作方式更为简单,使用的功率更低,因此更适合低功耗设备。
兼容性:BR/EDR是传统蓝牙技术,与大多数蓝牙设备兼容,而BLE只能与支持BLE的设备进行通信。
总之,BR/EDR和BLE各有优缺点,在不同的应用场景中应选择适合的技术。
这次介绍一下蓝牙协议栈(BLE)的基础知识,蓝牙协议栈组成如下图所示,首先我们说说GAP和GATT
GAP层是负责连接的,其中包含广播、扫描、连接、断开的过程和参数
11 角色
蓝牙设备的角色主要有中心(Central)和外围设备(Peripheral)两种,中心设备向外围设备发起连接。链路层的主机(Master)和从机(Slave)的概念跟中心和外围的概念是对应的。
除了中心和外围之外,还有Observer和Broadcaster角色,Observer一直进行监听,Broadcaster一直进行发送,这两种角色都只广播,不能发起连接或者被连接,这里就不详细说了
12 广播
建立连接之前,外围设备每隔一段时间发送一个广播包,让正在扫描的设备知道这是一个可以连接的设备,扫描设备才能对外围设备开始连接,这个广播包的时间间隔叫advertising interval,这个间隔可以在10ms到1024s之间,间隔的长短会影响建立连接所花时间。
中心要收到广播包之后才能发送连接请求,相应的,外围设备在发送广播包之后会等待连接请求。
蓝牙广播包最多可以包含31字节数据,包含设备名称和一些标志。中心收到广播包之后可以发送Scan Request以请求更多的广播信息,外围设备会回复一个同样是31个字节的Scan Response。
BLE有37个数据信道和3个广播信道,广播包,Scan Request,Scan Response使用广播信道
13 扫描
扫描是指中心监听广播包并且发送Scan request。扫描中有两个参数:Scan window(扫描窗口) 和Scan interval(扫描间隔)
14 发起连接
中心发起连接的过程类似于扫描的过程,中心收到广播包之后会发送一个连接请求给外围设备
15 连接
中心和外围设备连接上之后,中心会按照一定的连接间隔(Connection interval)向外围设备请求数据,这个间隔是由中心定的,在75ms到4s之间。
如果要提高吞吐量,可以在一个连接间隔中传输多个数据包,每个包最多可以包含20字节数据。如果要省电,并且外围设备并没有什么数据需要传输,可以跳过几个连接间隔,这称之为Slave latency。
如果外围设备没有在规定时间内响应中心的请求就会认为是连接中断,称之为Supervision Time-out(01s-32s),所以在使用Slave latency的时候要注意不要引起Supervision Time-out
这些参数是建立连接的时候中心确定的,如果建立连接之后外围设备想要更改,可以向中心发送Connection parameter update request。
整个数据交换的过程会在不同的频段中跳频(除了广播频段),跳频是自动完成的,不需要我们去管。
设备之间的数据传输是在GATT这层完成的
21 角色
除了GAP里面的角色,BLE在GATT里面也定义了两个角色,分别是GATT Server 和GATT Client,一般来说产生数据的设备是GATT Server,访问数据的设备是GATT Client,一个设备可以既是GATT Server也是GATT Client。这两个角色跟GAP中的角色并没有关系。
22 GATT结构
GATT Server通过属性表(Attribute table)来组织数据,
221 Attribute
上图中每一行就是一个属性Attribute。
每个属性具有一个handle,一个UUID,和一个Value。
Handle是Attribute的一个索引,每个Attribute的Handle都是唯一的。
UUID(universal unique identifier)表示的是Attribute中数据的类型信息。UUID在一个设备里面不是唯一的,可以有多个Attribute的UUID都一样
222 Characteristic
可以把Characteristic看作是上图中几行的集合(几个Attribute的集合)
每个Characteristic至少有两个Attribute,其中一个是声明,另一个包含数据。前面说过,蓝牙传输数据是通过GATT来传的,更具体的来说,是通过一个个Characteristic来传的。
223 Descriptors 描述符
Characteristic除了包含声明和数据之外,还可以有描述符(Descriptors,但不是必须有),Descriptors是用来进一步描述Characteristic(但不提供数据)的Attribute,比如说用自然语言描述该Characteristic是用来干什么的。
有一类特殊的描述符,叫CCCD(Client Characteristic Configuration Descriptor),支持Notify和Indicate的Characteristic 必须包含CCCD
224 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的信息
225 Profile
一个或者多个Service组合在一起称为Profile。Profile 是逻辑上的概念,自己并不具备单独的Attribute。
23 标准和自定义的Service和Characteristic
蓝牙联盟定义了一些标准的Profile, Service, Characteristic 和Attribute。由于Profile和Service是在具体应用中规定的,所以用户可以进行自定义
24 UUID
图2中每一个Attribute都有UUID,UUID是一个128位的数字,是用来描述Attribute的类型的
241 蓝牙联盟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。
25 空中接口 *** 作和属性
由于每个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的一些基础知识和示例
Android 从 43(API Level 18) 开始支持低功耗蓝牙,但是只支持作为中心设备(Central)模式,这就意味着 Android 设备只能主动扫描和链接其他外围设备(Peripheral)。从 Android 50(API Level 21) 开始两种模式都支持。
低功耗蓝牙开发算是较偏技术,实际开发中坑是比较多的,网上有很多文章介绍使用和经验总结,但是有些问题答案不好找,甚至有些误导人,比如 :获取已经连接的蓝牙,有的是通过反射,一大堆判断,然而并不是对所有手机有用,关于Ble传输速率问题的解决,都是默认Android每次只能发送20个字节,然而也并不是,,,下面进入正文。
这里用的是 Android50 新增的扫描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)连接间隔。蓝牙基带是跳频工作的,主机和从机会商定多长时间进行跳频连接,连接上才能进行数据传输。这个连接和广播状态和连接状态的连接不是一样的意思。主机在从机广播时进行连接是应用层的主动软件行为。而跳频过程中的连接是蓝牙基带协议的规定,完全由硬件控制,对应用层透明。明显,如果这个连接间隔时间越短,那么传输的速度就增大。连接上传完数据后,蓝牙基带即进入休眠状态,保证低功耗。其是125毫秒一个单位。
2)连接延迟。其是为了低功耗考虑,允许从机在跳频过程中不理会主机的跳频指令,继续睡眠一段时间。而主机不能因为从机睡眠而认为其断开连接了。其是125毫秒一个单位。明显,这个数值越小,传输速度也高。
蓝牙BLE协议规定连接参数最小是5,即725毫秒;而Android手机规定连接参数最小是8,即10毫秒。iOS规定是16,即20毫秒。
连接参数完全由主机决定,但从机可以发出更新参数申请,主机可以接受也可以拒绝。android手机一部接受,而ios比较严格,拒绝的概率比较高。
参考:
在iOS和Android上最大化BLE吞吐量
最大化BLE吞吐量第2部分:使用更大的ATT MTU
31打开蓝牙,搜索设备,显示蓝牙列表:
以上代码是实现搜索蓝牙设备并点击item选择对应蓝牙设备进行连接 *** 作。
32需要用到两个BLE *** 作的工具类BluetoothLeClass和BleUtils(从网上找的开源代码),代码上有版权声明,直接上代码:
33链接获取对应需要 *** 作的渠道,BLE和之前的蓝牙版本有所不同的地方在于它对蓝牙进行了进一步的封装,通常会分成三个通道:读 ,写,广播。
BLE,blooth low power,即蓝牙低功耗技术。
该技术具有低成本、短距离、可互 *** 作的特性,工作在免许可的24GHz ISM射频频段。
蓝牙系统核心包括射频收发器,基带和协议栈。核心系统协议包括射频(RF)协议、链路控制(LC)协议、链路管理(LM)协议、逻辑链路的控制和适配(L2CAP)协议。 蓝牙核心系统最底三层是射频,链路控制,链路管理协议,通常会把这三者归为一个子系统——蓝牙控制器。把往上的其他层一起称为为蓝牙主机。在蓝牙控制器和蓝牙主机之间实现通信通常需要有主机-控制器接口,Host to Controller Interface(HCI)。蓝牙系统的具体应用apps,就是建立在蓝牙主机之上。而host部分由蓝牙软件厂商开发和维护,control部分由蓝牙的硬件厂商提供,两部分通过hci(主机控制器接口)进行通信和数据交互。
厂商提供的测试模块,可以通过HCI或者串口直接控制蓝牙的物理层来让它收发数据包
负责数据和语音的发送和接收,特点是短距离、低功耗。蓝牙天线一般体积小、重量轻,属于微带天线。
1Mbps自适应跳频GFSK(高斯频移键控),运行在免费的工业频段24GHz。
LL层为RF控制器,控制设备处于准备(standby)、广播、监听/扫描(scan)、初始化、连接,这五种状态中一种。
五种状态切换描述为:未连接时,设备广播信息,另外一个设备一直监听或按需扫描,两个设备连接初始化,设备连接上了。
发起聊天的设备为主设备,接受聊天的设备为从设备,同一次聊天只能有一个意见领袖,即主设备和从设备不能切换。
HCI层为接口层,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制。
L2CAP层提供数据封装服务,允许逻辑上的点对点通讯。
基于包的协议,将包传输到HCI,对于无主机系统,就将包传给链路管理器LM。支持多路复用,包的分割和重组,以及向上层协议提交服务质量信息。
SM层提供配对和密匙分发,实现安全连接和数据交换。
ATT层负责数据检索,允许设备向另外一个设备展示一块特定的数据称之为属性,在ATT环境中,展示属性的设备称之为服务器,与它配对的设备称之为客户端。链路层的主机从机和这里的服务器、客服端是两种概念,主设备既可以是服务器,也可以是客户端。从设备毅然。
GATT层定义了使用 ATT 的服务框架和配置文件(profiles)的结构。BLE 中所有的数据通信都需要经过GATT。
它定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。GATT 就是使用了 ATT(Attribute Protocol)协议,ATT 协议把 Service, Characteristic遗迹对应的数据保存在一个查找表中,次查找表使用 16 bit ID 作为每一项的索引。
GAP直接与应用程序或配置文件(profiles)通信的接口,处理设备发现和连接相关服务。另外还处理安全特性的初始化。对上级,提供应用程序接口,对下级,管理各级职能部门,尤其是指示LL层控制室五种状态切换,指导保卫处做好机要工作。
GAP给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。
外围设备 :这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
中心设备 :中心设备相对比较强大,用来连接其他外围设备。例如手机等
BLE(Bluetooth low energy)蓝牙低功耗是蓝牙40新增的子规范,其具有低能耗、低成本、低延迟、传输距离长等特点,自安卓43(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中添加
在具体module的gradle中添加
1)判断设备是否支持BLE并打开蓝牙
安卓版本不小于60的,扫描必须要有定位权限,若版本为Android10及以上,则需精确定位权限(即 ManifestpermissionACCESS_FINE_LOCATION )
当需要结束扫描时用以下方法结束扫描,建议在扫描到目标设备后停止扫描
当需要断开与设备的连接时可使用以下任一方法断开设备连接
notify和indicate都使用以下方法
当需要取消notify或indicate时调用以下方法
如果一次性写入的数据长度大于MTU即最大传输单元(默认是20字节),则可以使用下列方法进行分批写入
当结束BLE通信时不要忘了调用destroy
以上就是关于蓝牙ble的写响应到底是什么流程全部的内容,包括:蓝牙ble的写响应到底是什么流程、蓝牙4.0ble开发板 怎样连接电脑、Bluetooth BR/EDR和BLE的区别.md等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)