一、多应用持有BluetoothGattServer实例
车机端打开了多个应用,每个应用都持有BluetoothGattServer实例
BluetoothGattServer gattServer = bluetoothManager.openGattServer(context, new BluetoothGattServerCallback() {
@Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
// 处理连接状态变化
LogUtils.w("fuck","onConnectionStateChange " + status + " " + newState);
super.onConnectionStateChange(device, status, newState);
}
@Override
public void onServiceAdded(int status, BluetoothGattService service) {
super.onServiceAdded(status, service);
LogUtils.w("fuck", "onServiceAdded");
}
});
假设车机端A、B两个应用都持有BluetoothGattServer实例,A应用在前台发送BLE广播,手机端扫描到广播并连接成功,A、B两个应用都收到onConnectionStateChange回调。
但是B应用为了避免影响A应用,需要B应用仅针对自己关心的UUID做出响应。
二、BluetoothManager.openGattServer流程分析
文章跟踪openGattServer的调用流程,主要是AIDL的跨进程调用
BluetoothGattServer----->IBluetoothGatt----->GattService----->BluetoothGattBinder
最后就是调用到Native层gattServerRegisterAppNative方法
查表后找到
packages/modules/Bluetooth/android/app/jni/com_android_bluetooth_gatt.cpp
三、BluetoothManager.connectGatt流程分析
image.png
四、蓝牙广播数据
问题1:响应广播是如何被收到的?
// 我们发送广播时,如果传递了第三个参数(scanResponse),对端是如何解析的?
void startAdvertisingSet(
AdvertisingSetParameters parameters,
AdvertiseData advertiseData,
AdvertiseData scanResponse, // 第三个参数
PeriodicAdvertisingParameters periodicParameters,
AdvertiseData periodicData,
int duration,
int maxExtAdvEvents,
AdvertisingSetCallback callback
);
# ---------------------------------------------------------------------------------
// 对端需要主动调用下面的方法:
ScanSettings scanSettings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
bluetoothLeScanner.startScan(filters, scanSettings, scanCallback);
1. 此时会向广播端发送SCAN_REQ数据包
2.当广播端收到 SCAN_REQ 后,自动通过 scanResponse 参数生成 SCAN_RSP 数据包并发送给扫描端。
此过程由 Android 系统底层协议栈处理,无需开发者干预。
3.扫描端通过 ScanCallback 的 onScanResult() 方法接收合并后的广播数据(包含初始广播和扫描响应)
问题2:BLE广播的数据为什么最大是31个字节?
广播包的格式如下,Android应用应用层能控制的数据只有Payload的AdvData,其他都是系统封装的。
广播数据包的完整格式
PDU的数据格式
另外还有PDU Type的定义:
广播报文类型
五、蓝牙信号强度RSSI计算距离
在手车互联中,有主动连接和回连两种场景:
- 主动连接:车机端会发送BLE广播,手机检测RSSI的信号强度来决定是否弹窗连接。
- 回连:需要车机判断手机是否在附近,可以通过发现可用的蓝牙设备及RSSI信号强度来决定用户是不是再车附近,此时需要手机和车机的蓝牙已经配对并且知道要回连的手机蓝牙地址。
代码块












网友评论