14、网络与连接:车载以太网(Ethernet),Wi-Fi 与蓝牙配置,Tethering 策略

各位同学,今天我们来聊聊车载系统里一个特别“接地气”但又极其关键的话题——网络与连接。说实话,在手机或者平板电脑上做网络开发,你基本不用太操心底层硬件,Wi-Fi 连不上?重启一下路由器。但在车机上,情况就完全不一样了。你想想看,一辆车要跑十几二十年,网络模块要是出了问题,用户可能连导航都用不了。

我个人习惯把车载网络分为三大块:车载以太网(负责车内骨干通信)、Wi-Fi 与蓝牙(负责短距无线连接)、以及Tethering 策略(负责网络共享)。这三者相互配合,构成了整车的信息高速公路。今天我就结合自己在项目里踩过的坑,跟大家好好拆解一下。

14.1 车载以太网:车内通信的“主动脉”

先说说以太网。你可能觉得奇怪,以太网不是电脑上用的吗?怎么车上也用?其实,随着智能座舱和自动驾驶的发展,传统的 CAN 总线已经扛不住了。CAN 总线最高也就 1 Mbps,而一个高清摄像头的数据流就能轻松吃掉几百 Mbps。所以,车载以太网应运而生。

核心要点:车载以太网通常使用 100BASE-T1 或 1000BASE-T1 标准,采用单对非屏蔽双绞线,比传统以太网更轻、更便宜、更抗干扰。

在 Android Automotive OS 里,以太网的管理是通过 EthernetManager 来完成的。系统会为每个以太网接口创建一个 NetworkInterface,然后通过 ConnectivityService 来评估网络质量。

我曾经在一个项目中遇到过这样的问题:车机启动后,以太网接口虽然 up 了,但系统始终不把它设为默认路由。查了半天,发现是 NetworkCapabilities 没有正确设置 NET_CAPABILITY_INTERNET 标志。嗯,这里要注意,车载以太网不一定总是连接互联网的,它可能只是连接域控制器。所以系统需要明确知道这个网络能不能上网。

// 示例:配置以太网请求
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET);
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        // 网络可用,绑定到该网络
        cm.bindProcessToNetwork(network);
    }
});

避坑指南:我曾经在调试时发现,某些车规级以太网 PHY 芯片在休眠唤醒后,需要重新初始化 MDIO 总线。如果 Android 的驱动没有处理好,就会出现“网络看起来通了,但 ping 不通”的诡异现象。建议在 HAL 层增加链路状态检测机制。

14.2 Wi-Fi 配置:不仅仅是连个热点

车载 Wi-Fi 和手机 Wi-Fi 最大的区别在于:车是移动的。你开车经过不同的地方,会不断遇到新的 Wi-Fi 热点。系统需要智能地选择连接哪个,而不是像手机一样傻傻地连上一次连过的。

在 Android Automotive 里,Wi-Fi 的配置主要通过 WifiManagerWifiAwareManager 来实现。但这里有个关键点:车机 Wi-Fi 通常有两种模式——STA(客户端模式)和 AP(热点模式)。

模式 用途 典型场景
STA 连接外部 Wi-Fi 网络 连接家庭 Wi-Fi 进行 OTA 升级
AP 提供 Wi-Fi 热点 乘客手机连接车机热点上网
P2P 点对点直连 手机投屏到车机

我个人建议,在配置 Wi-Fi 时,一定要考虑漫游策略。比如,当车辆进入地下车库时,车机应该自动切换到车库的 Wi-Fi 网络。这需要系统维护一个可信网络列表,并且能根据信号强度动态切换。

注意:千万不要让车机在行驶过程中频繁扫描 Wi-Fi 网络。这会导致功耗增加,而且可能干扰其他无线模块。我见过一个项目,因为 Wi-Fi 扫描间隔设置得太短,导致蓝牙音频出现断断续续的问题。

14.3 蓝牙配置:配对与多设备管理

蓝牙在车机上的应用,说白了就是两件事:电话媒体。但实际做起来,远比想象中复杂。你想想看,一辆车可能有五个人,每个人都要连蓝牙,系统怎么管理?

Android Automotive 使用 BluetoothAdapterBluetoothProfile 来管理蓝牙连接。但车机有一个特殊需求:多设备同时连接。比如,驾驶员连蓝牙电话,副驾驶连蓝牙音乐,后排乘客连蓝牙游戏手柄。

我记得在做一个项目时,产品经理要求“所有乘客都能同时连接蓝牙耳机”。这听起来很美好,但实际上一台车机的蓝牙芯片通常只支持 5-7 个并发连接。而且,每个连接都会占用带宽和内存。最后我们妥协的方案是:只允许 3 个音频设备同时连接,其他设备只能用于数据传输

// 示例:注册蓝牙配对请求广播
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        // 自动配对,无需用户确认
        device.setPairingConfirmation(true);
        abortBroadcast(); // 阻止系统弹出配对对话框
    }
}, filter);

避坑指南:我曾经在调试蓝牙免提时发现,某些手机在连接车机后,通话声音会从手机扬声器出来,而不是车机。原因是手机端的 BluetoothHeadset 服务没有正确切换到 SCO 链路。解决方案是在车机端强制设置 AudioManager.setBluetoothScoOn(true)

14.4 Tethering 策略:谁给谁共享网络?

Tethering,也就是网络共享,在车机上有两种方向:

  • 手机→车机:手机开热点,车机连接上网(用于 OTA 或在线服务)
  • 车机→手机:车机开热点,手机连接上网(用于乘客娱乐)

在 Android Automotive 里,Tethering 是通过 ConnectivityManagerstartTethering()stopTethering() 方法来控制的。但这里有一个很头疼的问题:策略冲突

举个例子:如果车机同时开启了 Wi-Fi 热点和 USB 网络共享,那么数据包应该走哪条路?系统默认会优先使用以太网,其次是 Wi-Fi,最后是蜂窝网络。但车载场景下,你可能希望优先使用蜂窝网络,因为车机自带的 4G/5G 模块通常比手机热点更稳定。

核心策略:我建议在实现 Tethering 时,遵循以下优先级:
1. 车载以太网(如果有)
2. 车载蜂窝网络(内置 SIM 卡)
3. 外部 Wi-Fi(如家庭或停车场 Wi-Fi)
4. 手机热点(通过蓝牙或 USB 共享)

另外,还要考虑流量计费的问题。如果车机使用的是按量计费的蜂窝网络,那么当用户开启热点时,系统应该弹出警告,提醒用户流量消耗。这个逻辑在 NetworkPolicyManager 里可以配置。

// 示例:检查是否允许 Tethering
TetheringManager tm = getSystemService(TetheringManager.class);
if (tm.getTetheringConfiguration().isTetheringAllowed()) {
    tm.startTethering(TetheringManager.TETHERING_WIFI, 
                      new Executor() { ... }, 
                      new TetheringManager.StartTetheringCallback() {
        @Override
        public void onTetheringStarted() {
            // 热点开启成功
        }
    });
}

注意:在某些国家或地区,法规禁止车辆在行驶过程中开启 Wi-Fi 热点。所以,Tethering 策略必须与车辆的行驶状态绑定。我建议在 CarService 中监听 Car.POWER_PROPERTYCar.SPEED_PROPERTY,当车速超过某个阈值时,自动关闭热点。

14.5 知识体系总览

好了,讲了这么多,我画了一张图来总结本章的核心逻辑。你可以看到,车载网络其实是一个分层结构:底层是物理链路(以太网、Wi-Fi、蓝牙),中间是连接管理(ConnectivityService),上层是应用策略(Tethering、漫游、计费)。

车载网络与连接知识体系 物理链路层 车载以太网 (100BASE-T1) 无线连接层 Wi-Fi 802.11ac / 蓝牙 5.2 蜂窝网络层 4G LTE / 5G NR 连接管理层 (ConnectivityService) 网络评分 · 路由选择 · 多路复用 · 漫游切换 Tethering 策略 热点共享 · 流量计费 设备管理策略 多设备配对 · 优先级控制 安全与合规 行驶状态绑定 · 法规限制

这张图从左到右,从上到下,基本覆盖了车载网络的核心模块。你如果能把这三层都吃透,那在车机网络开发这块,基本上就能独当一面了。


公众号:蓝海资料掘金营,微信deep3321