android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程
Android 蓝牙低功耗ble 广播、扫描、连接、数据读写源码流程分析大全 - 点击下载
一、概述
什么是蓝牙广播?
蓝牙广播是蓝牙通信的基础,蓝牙通信是点对点,想要被对方连接,就要发送广播,意思是说我现在在运行中,你们可以来连接我,我的地址是多少多少。
广播是一种单向的发送机制,每一个固定的时间,发送一次广播数据,当从机为已广播状态时,才能被主机发现,从而进行连接,广播包会在37、38、39三个信道上广播。
广播这一个阶段是由GAP这个协议定义的。
GAP是Generic Access Profile的缩写,GAP可以让你的设备对外界可见,他定义了peripheral以及central两个角色。
主机:发起对从机的连接者(手机)
从机:广播并等待被连接(手表、耳机)
二、广播设置
广播主要包括广播设置和广播控制:
广播设置主要包括以下7大功能:
广播参数(间隔、持续时间);
广播类型(可发现可连接、可发现不可连接);
广播数据(用户信息—数据长度+数据类型+数据);
MAC地址同步(读、写、检查);
广播名称(读、写);
设置Tx Power(设备发射功率);
广播快慢切换(三方APP业务需求)。
2.1 设置广播参数
广播间隔:设备每次广播时,会在3个广播信道(37/38/39)上同时发送相同的报文。这些报文被称为一个广播事件。除了定向报文以外,其他广播事件均可以选择“20ms ~ 10.28s”不等的间隔。两个相邻广播事件之间的时间称为广播间隔。
T_AdvEvent = advInterval + advDelay
advDelay: 伪随机数,范围0~10ms
由于设备间的时钟会不同程度的漂移,两个设备可能在很长一段时间同时广播而造成干扰,为防止这一情况的发生,除定向广播之外的其他广播类型,发送时间均会被扰动。实现该扰动的方式为,在上一次广播事件后加入“0 ~ 10ms”的随机延时随机数advDelay可以在一定程度降低advInterval相同两个节点所发送的广播包的冲突。
当然,实际设置过程中没有广播间隔参数,而是设置Advertising_Interval_Min(最小广播间隔)和Advertising_Interval_Max(最大广播间隔)这两个参数来调整广播间隔,它们都是以“0.625ms”为单位。
2.2 广播信道设置
物理信道:经典蓝牙(79个信道) ,广播信道占32个,BLE蓝牙(40个信道),37/38/39未广播信道,0~36为数据信道。
广播信道频点的选择原则上是为了远离诸
如WiFi接入点的严重干扰。这些接入点
通常选择802.11信道中的3个:信道1/6/11。
这几个信道的中心频率分别为:
2412/2437/2462,宽度大概为20MHZ。
这意味着信道1占据2402-2422,
信道6占据2427-2447,
信道11占据2452-2472。
而BLE广播信道:2402MHZ,2426MHZ,2480MHZ。
2.3 广播类型设置
广播类型一般分为四种,见如下表格:
1、可发现、不定向、不可连接:表示当前设备允许被其他设备扫描,仅仅发送广播数据,但不能被连接。
2、可发现、可连接:表示当前设备既能被其他设备扫描,也能被其连接。
3、不可发现、可连接、定向:表示这个广播是为指定设备准备的。
4、可发现、不定向、不可连接:类似于在空中随意发送数据。
场景分析:这四种类型会用在哪里?
场景1:设备上电(重启状态)、设备处于断连状态、回连状态,一般需要可扫描、可连接状态;
场景2:同手机进行三方app绑定(支付宝/微信)时,此时设备当前处于连接状态,绑定三方APP时可共享 连接数据,所以广播为可扫描、不定向、不可连接。
场景3:有些设备在某些场景下需要定向广播,这时广播为不可扫描、可连接、定向广播状态。
2.4 广播数据设置
广播数据一般需要广播厂商数据和本地数据:
厂商(本地)数据:长度 + 类型 + 数据 广播数据不能超过31字节
厂商数据类型:GAP_DATA_TYPE_MANUFACTURER_SPEC(0XFF)
本地数据类型:GAP_DATA_TYPE_LOCAL_NAME(0X09)
在拼接好的数据后,只需要调用SDK设置广播数据接口将数据广播出去就可以。
注:在DA平台下类型为0X01的广播类型为系 统自带,用户不用自行设计。
0X03广播类型表示设备支持哪些服务。
2.5 MAC地址同步(读、写、检查)
MAC地址检查:蓝牙广播MAC地址是48比特长(6字节),16进制的数字组成,例如:7A:87:B2:94:C2:7C。对于蓝牙设备而言,MAC地址是通过广播数据广播出去的,对设备本身而言,MAC地址不能写全0或全F,因为在SDK的接口中,厂商会做限制,若全0或全F,会失败。
在项目开发中,需要检查MAC地址是否正确,主要方法可参考下图:
MAC地址读取:蓝牙广播MAC地址一般是从NVRAM中读取或全局变量读取,通常我们只需要调用SDK接口就可以获取到MAC地址。
MAC地址设置:同样,蓝牙广播MAC地址一般是写入NVRAM或全局变量中,通常我们只需要调用SDK接口就可以获取将MAC地址写入。
2.6 设备广播名称、Tx Power
广播名称:就是用户扫描到的设备的名称
广播名称 = 设备名称 + MAC地址(后两位)
例:
注:在手表开发中,先将拼接好的广播名称通过SDK接口设置进去,然后再将广播名称、广播数据类型、广播长度通过调用SDK接口广播出去,否则用户是搜索不到广播名称的。
Tx Power设置:设备的发射功率,表示设备发送广播包的信号强度,DATA占1个字节(-127~127dBm),开发者只需要将信号强度通过调用SDK接口就可以。
Tx Power设置有啥用呢?
其主要是调整发射功率,当两个设备距离较远时,可增大,距离较近时,减小发射功率,可达到降低功耗的效果。