3. 获取WiFi接口列表

获取WiFi接口列表 学习卡片

任务说明

本案例需要实现一个Android系统服务,通过WiFi HAL接口获取当前设备上所有可用的WiFi接口(如wlan0、p2p0等)名称列表。该功能是WiFi HAL开发的基础能力,后续的接口配置、扫描、连接等操作都需要先确认目标接口是否存在。

核心实现

// IWifiInterface.h - WiFi HAL接口定义(简化)
#ifndef IWIFI_INTERFACE_H
#define IWIFI_INTERFACE_H

#include <vector>
#include <string>
#include <hidl/Status.h>
#include <android/hardware/wifi/1.0/IWifi.h>

using ::android::hardware::wifi::V1_0::IWifi;
using ::android::hardware::wifi::V1_0::WifiStatus;
using ::android::hardware::Return;
using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;

class WifiInterfaceEnumerator {
public:
    // 获取所有WiFi接口名称
    std::vector<std::string> getInterfaceList() {
        std::vector<std::string> result;
        
        // 1. 获取IWifi HAL服务
        android::sp<IWifi> wifiService = IWifi::getService();
        if (wifiService == nullptr) {
            return result; // HAL服务不可用
        }
        
        // 2. 初始化WiFi HAL
        WifiStatus status = wifiService->initialize();
        if (status.code != WifiStatusCode::SUCCESS) {
            return result; // 初始化失败
        }
        
        // 3. 获取接口工厂
        android::sp<IWifiChip> chip;
        wifiService->getChip(0, [&](WifiStatus s, const android::sp<IWifiChip>& c) {
            if (s.code == WifiStatusCode::SUCCESS) {
                chip = c;
            }
        });
        
        if (chip == nullptr) {
            return result;
        }
        
        // 4. 获取所有接口名称
        chip->getInterfaces([&](WifiStatus s, const hidl_vec<hidl_string>& names) {
            if (s.code == WifiStatusCode::SUCCESS) {
                for (const auto& name : names) {
                    result.push_back(std::string(name.c_str()));
                }
            }
        });
        
        return result;
    }
};

#endif // IWIFI_INTERFACE_H

接口调用示例

// main.cpp - 调用示例
#include <iostream>
#include "IWifiInterface.h"

int main() {
    WifiInterfaceEnumerator enumerator;
    std::vector<std::string> interfaces = enumerator.getInterfaceList();
    
    std::cout << "发现 " << interfaces.size() << " 个WiFi接口:" << std::endl;
    for (const auto& iface : interfaces) {
        std::cout << "  - " << iface << std::endl;
    }
    return 0;
}

编译配置

# Android.bp - 编译配置
cc_binary {
    name: "wifi_interface_list",
    srcs: ["main.cpp"],
    shared_libs: [
        "libhidlbase",
        "libhidltransport",
        "liblog",
        "android.hardware.wifi@1.0",
    ],
}

SVG:WiFi HAL接口获取流程

WiFi HAL接口列表获取时序 应用进程 WifiService HAL Service WiFi芯片驱动 getInterfaceList() getService() initialize() getChip(0) getInterfaces() 返回接口名称列表

验证方法

在Android设备上执行以下步骤验证功能:

# 1. 编译并推送可执行文件
adb push wifi_interface_list /data/local/tmp/
adb shell chmod +x /data/local/tmp/wifi_interface_list

# 2. 运行程序
adb shell /data/local/tmp/wifi_interface_list

# 3. 预期输出(示例)
# 发现 2 个WiFi接口:
#   - wlan0
#   - p2p0

判定标准:程序成功输出至少一个接口名称(通常为wlan0),且与adb shell ifconfig或adb shell ip link show命令查看到的WiFi接口一致,即表示HAL接口调用链路正常。若输出为空,需检查HAL服务是否注册、设备驱动是否加载以及SELinux权限配置。