> 文档中心 > OpenHarmony Wifi启动流程

OpenHarmony Wifi启动流程


wifi启动流程

鸿蒙的ipc通信基于binder

需要关注的函数:

WifiDeviceProxy::EnableWifi()

WifiManager启动staservice:

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;}