ConnectToNetwork调用流程图:

img

流程伪代码及说明:

文件相对路径:

frameworks\js\napi\src\wifi_napi_device.cpp

NO_SANITIZE("cfi") napi_value ConnectToNetwork(napi_env env, napi_callback_info info){
    ErrCode ret = wifiDevicePtr->ConnectToNetwork(networkId, isCandidate);
}

函数说明

  • 参数networkId:网络IDisCandidate:已配置的WiFi网络,isCondidate = false表示直接连接,不用测试或扫描候选
  • 作用允许JS应用程序通过网络ID主动连接到一个已配置的WiFi网络,调用前需确保已通过addNetwork()等方式配置好目标WiFi。

文件相对路径:

frameworks\native\src\wifi_device_impl.cpp

ErrCode WifiDeviceImpl::ConnectToNetwork(int networkId, bool isCandidate){
    return client_->ConnectToNetwork(networkId, isCandidate);
}

函数说明

用于从客户端请求连接到一个已配置的WiFi网络。

文件相对路径:

frameworks\native\src\wifi_device_proxy.cpp

ErrCode WifiDeviceProxy::ConnectToNetwork(int networkId, bool isCandidate){
    int error = Remote()->SendRequest(static_cast<uint32_t>(DevInterfaceCode::WIFI_SVR_CMD_CONNECT_TO), data, reply,
        option);
}

函数说明

通过 Remote()->SendRequest()方法向wifi_device_Stub类发送 IPC 请求。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_sta_sa\wifi_device_stub.cpp

handleFuncMap[static_cast<uint32_t>(DevInterfaceCode::WIFI_SVR_CMD_CONNECT_TO)] = &WifiDeviceStub::OnConnectTo;
void WifiDeviceStub::OnConnectTo(uint32_t code, MessageParcel &data, MessageParcel &reply){
    ErrCode ret = ConnectToNetwork(networkId, isCandidate);
}

函数说明

接收到IPC请求后,wifi_device_Stub类的OnConnectTo()方法中接收到相应的 IPC 请求,并从中读取参数,然后调用服务端实现类 wifi_device_service_impl 中的具体方法处理实际的业务逻辑。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_sta_sa\wifi_device_service_impl.cpp

ErrCode WifiDeviceServiceImpl::ConnectToNetwork(int networkId, bool isCandidate){
    if (isCandidate) {
        return pService->ConnectToCandidateConfig(uid, networkId);
    }
    return pService->ConnectToNetwork(networkId);
}

函数说明

在服务端执行连接WiFi网络的请求,并根据是否为“临时连接”调用不同的连接逻辑,同时进行权限校验、状态检查、和资源管理。

备注: ConnectToNetwork是“正式连接“,用于用户长期使用网络;ConnectToCandidateConfig是临时连接,用于临时测试或扫描,不持久化、不替换当前连接。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_sta\sta_interface.cpp

ErrCode StaInterface::ConnectToNetwork(int networkId){
    if (pStaService->ConnectToNetwork(networkId) != WIFI_OPT_SUCCESS); 
}

函数说明

接口层,作为入口函数,调用StaService服务层。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_sta\sta_service.cpp

ErrCode StaService::ConnectToNetwork(int networkId) const{
    pStaStateMachine->SendMessage(WIFI_SVR_CMD_STA_CONNECT_SAVED_NETWORK, networkId, NETWORK_SELECTED_BY_USER);
}

函数说明

在STA模式下正式连接WiFi的核心入口函数,负责获取配置、检查服务、准备环境,最终通过状态机通知底层开始连接流程。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_sta\sta_state_machine.cpp

staSmHandleFuncMap[WIFI_SVR_CMD_STA_CONNECT_SAVED_NETWORK] = &StaStateMachine::DealConnectToUserSelectedNetwork;
void StaStateMachine::DealConnectToUserSelectedNetwork(InternalMessagePtr msg)
{
    if (connTriggerMode != NETWORK_SELECTED_BY_RETRY) ;
    if (connTriggerMode == NETWORK_SELECTED_BY_USER) ;
    if (networkId == linkedInfo.networkId) ;
    if (StartConnectToNetwork(networkId, bssid) != WIFI_OPT_SUCCESS) ;
}

函数说明

负责防重复连接、状态准备、通知UI、启动底层连接流程。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_sta\sta_state_machine.cpp

ErrCode StaStateMachine::StartConnectToNetwork(int networkId, const std::string & bssid){
    SetRandomMac(targetNetworkId, bssid);
    if (WifiSettings::GetInstance().GetDeviceConfig(networkId, deviceConfig) != 0);
    WifiStaHalInterface::GetInstance().ClearDeviceConfig();
    if (WifiStaHalInterface::GetInstance().GetNextNetworkId(wpaNetworkId) != WIFI_HAL_OPT_OK);
    ConvertDeviceCfg(deviceConfig);
    if (bssid.empty()) ;
    if (WifiStaHalInterface::GetInstance().EnableNetwork(WPA_DEFAULT_NETWORKID) != WIFI_HAL_OPT_OK) ;
    if (WifiStaHalInterface::GetInstance().Connect(WPA_DEFAULT_NETWORKID) != WIFI_HAL_OPT_OK);
}

函数说明

负责配置随机MAC、设置BSSID、启用网络、发起连接,并通过超时机制保障连接可行性。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_native\wifi_hal_interface\wifi_sta_hal_interface.cpp

WifiErrorNo WifiStaHalInterface::Connect(int networkId){
#ifdef HDI_WPA_INTERFACE_SUPPORT
    return mHdiWpaClient->ReqConnect(networkId);           //----->5.1之后走这个
#else
    return mIdlClient->ReqConnect(networkId);              //----->5.1之前走这个
#endif
}

函数说明

通过HDI或IDL通信,将连接请求发送到底层WiFi驱动。

文件相对路径:

services\wifi_standard\wifi_framework\wifi_manage\wifi_native\client\hdi_client\hdi_interface\wifi_hdi_wpa_sta_impl.c

WifiErrorNo HdiWpaStaConnect(int networkId)
{
    struct IWpaInterface *wpaObj = GetWpaInterface();
    int32_t result = wpaObj->SelectNetwork(wpaObj, GetHdiStaIfaceName(), networkId);
}

函数说明

通过HDI接口调用,向WPA supplicant发起连接请求。

文件相对路径:

peripheral\wlan\wpa\interfaces\hdi_service\service_common\wpa_common_cmd.c

int32_t WpaInterfaceSelectNetwork(struct IWpaInterface *self, const char *ifName,
    const int32_t networkId){
    (void)self;
    WifiWpaStaInterface *pStaIfc = GetWifiStaInterface(ifName);
    int ret = pStaIfc->wpaCliCmdSelectNetwork(pStaIfc, networkId);
    return HDF_SUCCESS;
}

函数说明

调用wpaCliCmdSelectNetwork,向WPA supplicant发起命令,触发底层驱动发送802.11关键帧。

文件相对路径:

peripheral\wlan\wpa\interfaces\hdi_service\service_common\wpa_supplicant_hal.c

static int WpaCliCmdSelectNetwork(WifiWpaStaInterface *this, int networkId)
{
    return WpaCliCmd(cmd, buf, sizeof(buf));
}

函数说明

构造并执行WPA CLI命令,用于触发WPA supplicant开始连接

文件相对路径:

peripheral\wlan\wpa\interfaces\hdi_service\service_common\hdi_wpa_common.c

int WpaCliCmd(const char *cmd, char *buf, size_t bufLen)
{
    if (strncmp(ifName, "wlan", strlen("wlan")) == 0) {
        return StaCliCmd(GetStaCtrl(), cmd, buf, bufLen);
    } else if (strncmp(ifName, "p2p", strlen("p2p")) == 0) {
        return P2pCliCmd(GetP2pCtrl(), cmd, buf, bufLen);
    } else if (strncmp(ifName, "chba", strlen("chba")) == 0) {
        return ChbaCliCmd(GetChbaCtrl(), cmd, buf, bufLen);
    } else if (strncmp(ifName, "common", strlen("common")) == 0) {
        return CommonCliCmd(GetCommonCtrl(), cmd, buf, bufLen);
    } else {
        HDF_LOGE("WpaCliCmd, ifName is unknow!");
        return -1;
    }
}
static int StaCliCmd(WpaCtrl *ctrl, const char *cmd, char *buf, size_t bufLen){
    int ret = wpa_ctrl_request(ctrl->pSend, cmd, strlen(cmd), buf, &len, NULL);
}

函数说明

通过调用底层WPA CLI命令,通知WPA supplicant选择并连接指定网络。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐