上一篇讲到SoftApManager.IdleState状态中处理CMD_START消息,这个消息用来打开热点功能。我们从这里继续看热点功能基本流程。
public boolean processMessage(Message message) {
switch (message.what) {
case CMD_START:
WifiConfiguration config = (WifiConfiguration) message.obj;
mApInterfaceName = mWifiNative.setupInterfaceForSoftApMode(
mWifiNativeInterfaceCallback);
int result = startSoftAp((WifiConfiguration) message.obj);
transitionTo(mStartedState);
}
}
这里有两个重要的方法,一个是WifiNative.setupInterfaceForSoftApMode和startSoftAp,现在先看setupInterfaceForSoftApMode的实现。
@WifiNative.java
public String setupInterfaceForSoftApMode(@NonNull InterfaceCallback interfaceCallback) {
startHal();
startHostapd()
}
startHal用来启动WIFI hal层代码,对hal进行初始化。将通过HIDL和hal进行通信。
startHal() -> WifiNative.java
startVendorHal() -> WifiVendorHal.java
start() -> HalDeviceManager.java
mWifi = IWifi.getService(true /* retry */);
mWifi.start();
mWifi是hal层中实现的一个服务,现在需要进入到hardware/interfaces/wifi/1.3/default/wifi.h 目录下去查看start()的实现。
@hardware/interfaces/wifi/1.3/default/wifi.cpp
Return<void> Wifi::start(start_cb hidl_status_cb) {
return validateAndCall(this, WifiStatusCode::ERROR_UNKNOWN,
&Wifi::startInternal, hidl_status_cb);
}
WifiStatus Wifi::startInternal() {
WifiStatus wifi_status = initializeModeControllerAndLegacyHal();
chip_ = new WifiChip(kChipId, legacy_hal_, mode_controller_,
iface_util_, feature_flags_);
ret