当前位置: 首页 > article >正文

【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 连接界面 中 点击 连接 手机时:

车机将执行如下 代码:

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 介绍

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 函数的分析,我将单独 一篇文章分析。

http://www.lryc.cn/news/2394017.html

相关文章:

  • C++学习-入门到精通【11】输入/输出流的深入剖析
  • NW969NW978美光闪存颗粒NW980NW984
  • 使用 ssld 提取CMS 签名并重签名
  • 前端基础之《Vue(17)—路由集成》
  • 大厂前端研发岗位PWA面试题及解析
  • 第十四章 MQTT订阅
  • element ui 表格 勾选复选框后点击分页不保存之前的数据问题
  • DataAgent产品经理(数据智能方向)
  • 腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务
  • 华为计试——刷题
  • 【AI-安装指南】Redis Stack 的安装与使用
  • LeetCode Hot100(矩阵)
  • spark在执行中如何选择shuffle策略
  • 前端-不对用户显示
  • WPF【10_2】数据库与WPF实战-示例
  • Hive的数据倾斜是什么?
  • Cursor奇技淫巧篇(经常更新ing)
  • Unity3D仿星露谷物语开发58之保存时钟信息到文件
  • lstm 长短期记忆 视频截图 kaggle示例
  • Spring Advisor增强规则实现原理介绍
  • 【HarmonyOS 5】鸿蒙中的UIAbility详解(二)
  • 力扣HOT100之动态规划:152. 乘积最大子数组
  • Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
  • 定制开发开源AI智能名片S2B2C商城小程序:数字营销时代的话语权重构
  • 【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)
  • ffmpeg baidu
  • spring boot 拦截器HandlerInterceptor 不生效的原因排查
  • 公网ip怎么申请和使用?本地只有内网IP如何提供外网访问?
  • 将git最后一次提交把涉及到的文件按原来目录结构提取出来
  • 利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法