2025-03-14——蓝牙相关

2025-03-16  本文已影响0人  orgcheng

一、多应用持有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计算距离

在手车互联中,有主动连接和回连两种场景:


代码块
上一篇 下一篇

猜你喜欢

热点阅读