wifi启动流程

鸿蒙的ipc通信基于binder

需要关注的函数:

sendRequest
onRemoteRequest
interface
service
statemachine

WifiDeviceProxy::EnableWifi()

WifiDeviceImpl WifiDeviceProxy WifiDeviceStub WifiDeviceServiceImpl IStaService WifiDeviceImpl会获取系统服务WifiDeviceProxy wifi开启时调用EnableWifi() 通过binder通信,发消息WIFI_SVR_CMD_ENABLE_WIFI EnableWifi WifiServiceManager.GetStaServiceInstance WifiDeviceImpl WifiDeviceProxy WifiDeviceStub WifiDeviceServiceImpl IStaService

WifiManager启动staservice:

IStaService StaService StaStateMachine WifiStaHalInterface wifiStaHalInterface WifiIdlClient wifiIdlClient i_wifi WifiHalStaInterface EnableWifi 发消息WIFI_SVR_CMD_STA_ENABLE_WIFI StartWifiProcess StartWifi StartWifi start() start() 这里进行RPC通信 IStaService StaService StaStateMachine WifiStaHalInterface wifiStaHalInterface WifiIdlClient wifiIdlClient i_wifi WifiHalStaInterface WifiHalStaInterface StartSupplicant //这里启动wpa WifiHalStaInterface
WifiErrorNo Start(void) // 
{
    RpcClient *client = GetStaRpcClient();
    LockRpcClient(client);
    Context *context = client->context;
    WriteBegin(context, 0);
    WriteFunc(context, "Start");
    WriteEnd(context);
    if (RpcClientCall(client, "Start") != WIFI_IDL_OPT_OK) {
        return WIFI_IDL_OPT_FAILED;
    }
    int result = WIFI_IDL_OPT_FAILED;
    ReadInt(context, &result);
    ReadClientEnd(client);
    UnlockRpcClient(client);
    return result;
}
WifiErrorNo Start(void)
{
    LOGD("Ready to start wifi");
    if (StartSupplicant() != WIFI_HAL_SUCCESS) { // 开启wpa
        LOGE("wpa_supplicant start failed!");
        return WIFI_HAL_OPEN_SUPPLICANT_FAILED;
    }
    LOGD("wpa_supplicant start successfully!");

    if (AddWpaIface(0) != WIFI_HAL_SUCCESS) {
        LOGE("Failed to add wpa interface!");
        StopWpaAndWpaHal(0);
        return WIFI_HAL_CONN_SUPPLICANT_FAILED;
    }

    if (ConnectSupplicant() != WIFI_HAL_SUCCESS) {
        LOGE("SupplicantHal connect wpa_supplicant failed!");
        StopWpaAndWpaHal(0);
        return WIFI_HAL_CONN_SUPPLICANT_FAILED;
    }
    LOGD("SupplicantHal connect wpa_supplicant successfully!");
    LOGD("Start wifi successfully");
    return WIFI_HAL_SUCCESS;
}
static WifiErrorNo AddWpaIface(int staNo)
{
    WifiWpaInterface *pWpaInterface = GetWifiWapGlobalInterface();
    if (pWpaInterface == NULL) {
        LOGE("Get wpa interface failed!");
        return WIFI_HAL_FAILED;
    }
    if (pWpaInterface->wpaCliConnect(pWpaInterface) < 0) { // 初始化
        LOGE("Failed to connect to wpa!");
        return WIFI_HAL_FAILED;
    }
    AddInterfaceArgv argv;
    if (staNo == 0) {
        if (strcpy_s(argv.name, sizeof(argv.name), "wlan0") != EOK || strcpy_s(argv.confName, sizeof(argv.confName),
            "/data/misc/wifi/wpa_supplicant/wpa_supplicant.conf") != EOK) {
            return WIFI_HAL_FAILED;
        }
    } else {
        if (strcpy_s(argv.name, sizeof(argv.name), "wlan2") != EOK || strcpy_s(argv.confName, sizeof(argv.confName),
            "/data/misc/wifi/wpa_supplicant/wpa_supplicant.conf") != EOK) { 
            return WIFI_HAL_FAILED;
        }
    }
    if (pWpaInterface->wpaCliAddIface(pWpaInterface, &argv) < 0) {// 添加global节点
        LOGE("Failed to add wpa iface!");
        return WIFI_HAL_FAILED;
    }
    return WIFI_HAL_SUCCESS;
}

static int WpaCliConnect(WifiWpaInterface *p)
{
    if (p == NULL) {
        return -1;
    }
    if (p->wpaCtrl.pSend != NULL) {
        return 0;
    }
    int count = WPA_TRY_CONNECT_TIMES;
    while (count-- > 0) {
        int ret = InitWpaCtrl(&p->wpaCtrl, "/data/misc/wifi/sockets/wpa");
        if (ret == 0) {
            LOGD("Global wpa interface connect successfully!");
            break;
        } else {
            LOGD("Init wpaCtrl failed: %{public}d", ret);
        }
        usleep(WPA_TRY_CONNECT_SLEEP_TIME);
    }
    if (count <= 0) {
        return -1;
    }
    p->threadRunFlag = 1;
    if (pthread_create(&p->tid, NULL, WpaReceiveCallback, p) != 0) {
        p->threadRunFlag = 0;
        ReleaseWpaCtrl(&p->wpaCtrl);
        LOGE("Create monitor thread failed!");
        return -1;
    }
    return 0;
}
static int WpaCliAddIface(WifiWpaInterface *p, const AddInterfaceArgv *argv)
{
    if (p == NULL || argv == NULL) {
        return -1;
    }
    WpaIfaceInfo *info = p->ifaces;
    while (info != NULL) {
        if (strcmp(info->name, argv->name) == 0) {
            info->num += 1;
            return 0;
        }
        info = info->next;
    }
    info = (WpaIfaceInfo *)calloc(1, sizeof(WpaIfaceInfo));
    if (info == NULL) {
        return -1;
    }
    StrSafeCopy(info->name, sizeof(info->name), argv->name);
    char cmd[WPA_CMD_BUF_LEN] = {0};
    char buf[WPA_CMD_REPLY_BUF_SMALL_LEN] = {0};
    LOGI("WpaCliAddIface CMD: %{public}s", cmd);
    if (snprintf_s(cmd, sizeof(cmd), sizeof(cmd) - 1, "INTERFACE_ADD %s\t%s", argv->name, argv->confName) < 0 ||
        WpaCliCmd(cmd, buf, sizeof(buf)) != 0) {
        free(info);
        LOGI("WpaCliAddIface buf: %{public}s", buf);
        return -1;
    }
    info->num += 1;
    info->next = p->ifaces;
    p->ifaces = info;
    return 0;
}
WifiErrorNo ConnectSupplicant(void)
{
    LOGD("Ready to connect wpa_supplicant.");
    WifiWpaStaInterface *pStaIfc = GetWifiStaInterface(0);
    if (pStaIfc == NULL) {
        return WIFI_HAL_SUPPLICANT_NOT_INIT;
    }
    return WIFI_HAL_SUCCESS;
}
WPAclicmd封装:

WifiWpaStaInterface *GetWifiStaInterface(int staNo)
{
    char *name;
    if (staNo == 0) {
        name = "wlan0";
    } else {
        name = "wlan2";
    }
    WifiWpaStaInterface *p = g_wpaStaInterface;
    while (p != NULL) {
        if (strcmp(p->ifname, name) == 0) {
            return p;
        }
        p = p->next;
    }
    p = (WifiWpaStaInterface *)calloc(1, sizeof(WifiWpaStaInterface));
    if (p == NULL) {
        return NULL;
    }
    StrSafeCopy(p->ifname, sizeof(p->ifname), name);
    p->staNo = staNo;
    p->wpaCliCmdStatus = WpaCliCmdStatus;
    p->wpaCliCmdAddNetworks = WpaCliCmdAddNetworks;
    p->wpaCliCmdReconnect = WpaCliCmdReconnect;
    p->wpaCliCmdReassociate = WpaCliCmdReassociate;
    p->wpaCliCmdDisconnect = WpaCliCmdDisconnect;
    p->wpaCliCmdSaveConfig = WpaCliCmdSaveConfig;
    p->wpaCliCmdSetNetwork = WpaCliCmdSetNetwork;
    p->wpaCliCmdEnableNetwork = WpaCliCmdEnableNetwork;
    p->wpaCliCmdSelectNetwork = WpaCliCmdSelectNetwork;
    p->wpaCliCmdDisableNetwork = WpaCliCmdDisableNetwork;
    p->wpaCliCmdRemoveNetwork = WpaCliCmdRemoveNetwork;
    p->wpaCliCmdGetNetwork = WpaCliCmdGetNetwork;
    p->wpaCliCmdWpsPbc = WpaCliCmdWpsPbc;
    p->wpaCliCmdWpsPin = WpaCliCmdWpsPin;
    p->wpaCliCmdWpsCancel = WpaCliCmdWpsCancel;
    p->wpaCliCmdPowerSave = WpaCliCmdPowerSave;
    p->wpaCliCmdSetCountryCode = WpaCliCmdSetCountryCode;
    p->wpaCliCmdGetCountryCode = WpaCliCmdGetCountryCode;
    p->wpaCliCmdSetAutoConnect = WpaCliCmdSetAutoConnect;
    p->wpaCliCmdWpaBlockListClear = WpaCliCmdWpaBlockListClear;
    p->wpaCliCmdListNetworks = WpaCliCmdListNetworks;
    p->wpaCliCmdScan = WpaCliCmdScan;
    p->wpaCliCmdScanInfo = WpaCliCmdScanInfo;
    p->wpaCliCmdGetSignalInfo = WpaCliCmdGetSignalInfo;
    p->next = g_wpaStaInterface;
    g_wpaStaInterface = p;

    return p;
}


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐