AddDeviceConfig的接口整体调用流程:

                                  

关键数据结构和流程:

所在文件:foundation\communication\wifi\wifi\interfaces\inner_api\wifi_msg.h

/* Network configuration information */
struct WifiDeviceConfig {
    int instanceId;
    int networkId;
    /* int status; @deprecated : CURRENT, using 1: DISABLED 2: ENABLED */
    /*  network selection status*/
    NetworkSelectionStatus networkSelectionStatus;
    /* mac address */
    std::string bssid;
    /* bssid type. */
    int bssidType;
    /* network name */
    std::string ssid;
    int band;
    int channel;
    int frequency;
    /* Signal strength */
    int rssi;
    /**
     * signal level,
     * rssi<=-100    level : 0
     * (-100, -88]   level : 1
     * (-88, -77]    level : 2
     * (-66, -55]    level : 3
     * rssi>=-55     level : 4
     */
    int level;
    /* Is Passpoint network */
    bool isPasspoint;
    /* is ephemeral network */
    bool isEphemeral;
    /* WPA-PSK mode pre shared key */
    std::string preSharedKey;
    std::string encryptedData;
    std::string IV;
    /* Encryption Mode */
    std::string keyMgmt;
    /* Available Encryption Mode */
    uint32_t keyMgmtBitset;
    /* WEP mode key, max size: 4 */
    std::string wepKeys[WEPKEYS_SIZE];
    /* use WEP key index */
    int wepTxKeyIndex;
    std::string encryWepKeys[WEPKEYS_SIZE];
    std::string IVWep;
    /* network priority */
    int priority;
    /* is hidden network */
    bool hiddenSSID;
    /* Random mac address */
    std::string macAddress;
    int uid;
    time_t lastConnectTime;
    int numRebootsSinceLastUse;
    int numAssociation;
    int connFailedCount;
    unsigned int networkStatusHistory;
    bool isPortal;
    time_t portalAuthTime;
    time_t lastHasInternetTime;
    bool noInternetAccess;
    /* save select mac address */
    std::string userSelectBssid;
    WifiIpConfig wifiIpConfig;
    WifiEapConfig wifiEapConfig;
    WifiProxyConfig wifiProxyconfig;
    WifiPrivacyConfig wifiPrivacySetting;
    std::string callProcessName;
    std::string ancoCallProcessName;
    std::string internetSelfCureHistory;
    int isReassocSelfCureWithFactoryMacAddress;
    int version;
    bool randomizedMacSuccessEver;
    bool everConnected;
    bool acceptUnvalidated;
    WifiWapiConfig wifiWapiConfig;
    IpInfo lastDhcpResult;
    bool isShared;
    int64_t lastTrySwitchWifiTimestamp { -1 };
    bool isAllowAutoConnect { true };

    WifiDeviceConfig()
    {
        instanceId = 0;
        networkId = INVALID_NETWORK_ID;
        bssidType = REAL_DEVICE_ADDRESS;
        band = 0;
        channel = 0;
        frequency = 0;
        level = 0;
        isPasspoint = false;
        isEphemeral = false;
        keyMgmtBitset = 0u;
        wepTxKeyIndex = 0;
        priority = 0;
        hiddenSSID = false;
        wifiPrivacySetting = WifiPrivacyConfig::RANDOMMAC;
        rssi = -100;
        uid = WIFI_INVALID_UID;
        lastConnectTime = -1;
        numRebootsSinceLastUse = 0;
        numAssociation = 0;
        connFailedCount = 0;
        networkStatusHistory = 0;
        isPortal = false;
        portalAuthTime = -1;
        lastHasInternetTime = -1;
        noInternetAccess = false;
        callProcessName = "";
        ancoCallProcessName = "";
        internetSelfCureHistory = "";
        isReassocSelfCureWithFactoryMacAddress = 0;
        version = -1;
        randomizedMacSuccessEver = false;
        isShared = true;
        everConnected = false;
        acceptUnvalidated = false;
    }
};


所在文件:foundation\communication\wifi\wifi\frameworks\js\napi\src\wifi_napi_device.cpp
NO_SANITIZE("cfi") napi_value AddDeviceConfig(napi_env env, napi_callback_info info) {
    WifiDeviceConfig *config = new WifiDeviceConfig();
    JsObjToDeviceConfig(env, argv[0], *config);
    wifiDevicePtr->AddDeviceConfig(*context->config, context->networkId, context->isCandidate);
}

所在文件:foundation\communication\wifi\wifi\frameworks\native\src\wifi_device_impl.cpp
ErrCode WifiDeviceImpl::AddDeviceConfig(const WifiDeviceConfig &config, int &result, bool isCandidate) {
    return client_->AddDeviceConfig(config, result, isCandidate);
}

所在文件:foundation\communication\wifi\wifi\frameworks\native\src\wifi_device_proxy.cpp
ErrCode WifiDeviceProxy::AddDeviceConfig(const WifiDeviceConfig &config, int &result, bool isCandidate) {
    int error = Remote()->SendRequest(static_cast<uint32_t>(DevInterfaceCode::WIFI_SVR_CMD_ADD_DEVICE_CONFIG),
        data, reply, option);
}

所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_sta_sa\wifi_device_stub.cpp

void WifiDeviceStub::InitHandleMap() {
    ......
    handleFuncMap_[static_cast<uint32_t>(DevInterfaceCode::WIFI_SVR_CMD_ADD_DEVICE_CONFIG)] =
        &WifiDeviceStub::OnAddDeviceConfig;
    ......
}

int WifiDeviceStub::OnRemoteRequest(uint32_t code, IpcIo *req, IpcIo *reply) {
    HandleFuncMap::iterator iter = handleFuncMap_.find(code);
    (this->*(iter->second))(code, req, reply);
}


void WifiDeviceStub::OnAddDeviceConfig(uint32_t code, MessageParcel &data, MessageParcel &reply) {
    bool isCandidate = data.ReadBool();
    WifiDeviceConfig config;
    ReadWifiDeviceConfig(data, config);
    
    if (isCandidate) {
        int uid = 0;
        return pService->AddCandidateConfig(uid, updateConfig, result);
    }
    int result = INVALID_NETWORK_ID;
    ErrCode ret = AddDeviceConfig(config, result, isCandidate);
    return;
}

所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_sta_sa\wifi_device_service_impl.cpp
ErrCode WifiDeviceServiceImpl::AddDeviceConfig(const WifiDeviceConfig &config, int &result, bool isCandidate) {
    ErrCode errCode = CheckCanAddDeviceConfig(isCandidate);// 检查是否可以添加
    if (errCode != WIFI_OPT_SUCCESS) {
        return errCode;
    }

    if (isCandidate) {
        return pService->AddCandidateConfig(uid, updateConfig, result);
    }


    int retNetworkId = pService->AddDeviceConfig(updateConfig);
    if (retNetworkId < 0) {
        return WIFI_OPT_FAILED;
    }
    result = retNetworkId;
    return WIFI_OPT_SUCCESS;
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_sta\sta_interface.cpp

ErrCode StaInterface::AddCandidateConfig(const int uid, const WifiDeviceConfig &config, int& netWorkId) {
    return pStaService->AddCandidateConfig(uid, config, netWorkId);
}
int StaInterface::AddDeviceConfig(const WifiDeviceConfig &config) {
    return pStaService->AddDeviceConfig(config);
}

所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_sta\sta_service.cpp
int StaService::AddDeviceConfig(const WifiDeviceConfig &config) const {
    int netWorkId = INVALID_NETWORK_ID;
    std::string bssid;
    std::string userSelectbssid = config.bssid;
    WifiDeviceConfig tempDeviceConfig;
    tempDeviceConfig.instanceId = config.instanceId;
    // 先查找配置是否已经存在 如果已经存在,则更新
    if (FindDeviceConfig(config, tempDeviceConfig) == 0) {
        netWorkId = tempDeviceConfig.networkId;
        if (m_instId == INSTID_WLAN0) {
            bssid = config.bssid.empty() ? tempDeviceConfig.bssid : config.bssid;
            pStaAutoConnectService->EnableOrDisableBssid(bssid, true, 0);
        }
    } else {
        // 首次添加就申请一个NetWorkid
        netWorkId = WifiSettings::GetInstance().GetNextNetworkId();
    }
    tempDeviceConfig = config;
    tempDeviceConfig.instanceId = m_instId;
    tempDeviceConfig.networkId = netWorkId;
    tempDeviceConfig.userSelectBssid = userSelectbssid;
    if (!bssid.empty()) {
        tempDeviceConfig.bssid = bssid;
    }
    
    WifiSettings::GetInstance().AddDeviceConfig(tempDeviceConfig);
    WifiSettings::GetInstance().SyncDeviceConfig();
    return netWorkId;
}

// 所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_toolkit\config\wifi_settings.cpp
int WifiSettings::AddDeviceConfig(const WifiDeviceConfig &config) {
    auto iter = mWifiDeviceConfig.find(config.networkId);
    if (iter != mWifiDeviceConfig.end()) {
        iter->second = config;
    } else {
        if (mWifiDeviceConfig.size() > WIFI_DEVICE_CONFIG_MAX_MUN) {
            LOGE("AddDeviceConfig Exceeding the maximum value!");
            return -1;
        }
        mWifiDeviceConfig.emplace(std::make_pair(config.networkId, config));
    }
    return config.networkId;
} 

WifiSetting还有其它的查询和删除接口: 
    int RemoveDevice(int networkId);
    void ClearDeviceConfig(void);
    int GetDeviceConfig(std::vector<WifiDeviceConfig> &results, int instId = 0);
    int GetDeviceConfig(const int &networkId, WifiDeviceConfig &config, int instId = 0);
    int GetDeviceConfig(const std::string &index, const int &indexType, WifiDeviceConfig &config, int instId = 0);
    int GetDeviceConfig(const std::string &ssid, const std::string &keymgmt, WifiDeviceConfig &config, int instId = 0);

Logo

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

更多推荐