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