【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】

1. 背景

在前面的文章中,我们已经介绍了 carplay 在车机中的角色划分, 并实际分析了 手机主动连接车机的案例。 感兴趣可以 查看如下文章介绍。
【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】
【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】

本节 将详细分析 车机 主动 连接 iphone手机 carplay 这一过程。

先回顾一下 carplay 整个流程:

  1. EIR 广播识别

    • iPhone 开启 EIR 广播,包含 UUID_DEVICE_CARPLAY_EIR 2d8d2466-e14d-451c-88bc-7301abea291a
    • 车机通过蓝牙扫描识别支持 CarPlay 的 iPhone
  2. 蓝牙连接

    • 没有配对,需要先配对
    • iPhone 主动连接车机的 SPP Server UUID (UUID_IAP_ACCESSORY 00000000-deca-fade-deca-deafdecacaff
      • 车机需要先 listenUsingRfcommWithServiceRecord
    • 车机作为 Client 主动连接 iPhone 暴露的 Server UUID
      • (需 iPhone 开启EIR 广播)
  3. IAP2 协议交互

    • 交换设备信息、认证令牌、能力参数(支持哪种 Wi-Fi 架构)
  4. Wi-Fi 建链

    • 手机连接车机热点,或车机连接手机热点,完成 IP 建立
  5. TCP & mDNS 发现 CarPlay 服务

    • 建立 TCP 通信,寻找 _carplay._tcp.local 服务,启动 CarPlay Session
  6. 启动投屏/音频/导航服务

上面总过分为 6 步: 但是涉及到蓝牙的只有 1 、 2、 3 步。 那我们就来分别来介绍一下 在当前 车机主动连手机的情形。这三步是如何具体实操的。

2. 车机 主动 连接 手机

1. EIR 广播

【android bluetooth 案例分析 04】【Carplay 详解 2】【Carplay 连接之手机主动连车机】 中已经详细介绍了:

  • 手机 广播 EIR , 车机扫描 的过程。
  • 车机 广播 EIR, 手机扫描 的过程。

这里不再介绍。

2. 蓝牙连接 iap 并通信

没有配对,需要先配对 : 这个是常规操作, 这里不分享了。

这里主要分析一下。 车机 主动连接 手机 iap 的过程:

当我们在车机 carplay app 连接界面 中 点击 连接 手机时:

车机将执行如下 代码:

c 复制代码
public static final UUID CLINET_SPP_UUID = UUID.fromString("00000000-deca-fade-deca-deafdecacafe");


BluetoothSocket mClientSocket = device.createRfcommSocketToServiceRecord(CLINET_SPP_UUID);

mClientSocket.connect();

// 之后就可以拿着 mClientSocket 来进行 iap 通信了

1. createRfcommSocketToServiceRecord 介绍

java 复制代码
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID uuid);
  • 该函数通过指定的 UUID,创建一个指向远端设备某个特定服务的蓝牙 Socket

  • 实质上,它是通过 SDP (Service Discovery Protocol) 发现对方设备是否注册了这个 UUID 所代表的服务,并建立一个 RFCOMM 连接(类似串口通信)。

  • createRfcommSocketToServiceRecord 并不会立即建立连接,它只是创建了一个蓝牙 Socket 实例 ,需要再调用 .connect() 才真正开始连接。

  • 该函数只适用于已配对设备之间的通信,未配对时会抛出异常或被拒绝连接。

  • UUID 必须与对方设备注册的一致,否则 SDP 查询失败,连接将报错。

2. btsnoop 日志分析

  • 车机 向 手机 发起 SDP 请求 ,查询 00000000-deca-fade-deca-deafdecacafe 服务。
  • 手机回复 当前 服务的 rfcomm 通道为 1
  • 车机拿到 手机对应的 rfcomm channel=1 后, 主动发起连接。
  • 连接成功后, 就开始对应 iap 通信。 通过 RFCOMM 通道传输配对、身份认证、Wi-Fi 架构协商、热点信息等数据。
  • 之后手机就可以 将 画面 通过wifi 投屏到车机中。

3. 总结

一般情况下 createRfcommSocketToServiceRecord 函数都是 手机侧主动连接车机 使用的,此时:

功能 Server 端 Client 端
方法 listenUsingRfcommWithServiceRecord(UUID) createRfcommSocketToServiceRecord(UUID)
主体 车机 iPhone(或其他 Bluetooth Client)
作用 注册服务监听连接 查找服务并尝试连接
CarPlay 中用途 车机开放 IAP2 服务 iPhone 主动发起连接

但是 在车机 侧如果 调用 createRfcommSocketToServiceRecord 去连手机时, 正好和上述反了。此时手机侧 是 服务段。 所以猜测手机 使用了 listenUsingRfcommWithServiceRecord 作为服务端了。

  • 本文就是对 该场景的分享。

对应 createRfcommSocketToServiceRecord 函数的分析,我将单独 一篇文章分析。

相关推荐
fengci.1 天前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php
你怎么知道我是队长1 天前
经典蓝牙(Classic Bluetooth / BR/EDR)--- 核心协议层1 --- 经典蓝牙(BR/EDR)物理层核心机制详解
bluetooth
stevenzqzq1 天前
Android 矢量图(Vector Drawable)核心坐标与尺寸机制技术文档
android
plainGeekDev1 天前
运行时获取依赖 → 编译时注入
android·java·kotlin
Wiktok1 天前
Vue3(Vite)打包安卓APP 完整最佳实践
android·vue
Co_Hui1 天前
Android 系统服务的添加
android
杉氧1 天前
用 Compose 挑战交互与动效天花板:ComposeCraftLab 开源实验室全解析
android·前端·kotlin
朝与同歌暮同酒1 天前
冒泡社区《幻想三国》还能玩吗?安卓手机与电脑模拟器试玩记录
android·智能手机·电脑
音视频牛哥1 天前
从数字孪生到机器人操控:Android Unity3D下RTMP/RTSP多路低延迟播放实践
android·unity·音视频·unity rtsp播放器·unity rtmp播放器·rtsp player·rtmp player
用户69371750013841 天前
了解一下 Agent Harness
android·前端·后端