3. 获取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接口获取流程
验证方法
在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权限配置。