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;
}
更多推荐
已为社区贡献3条内容
所有评论(0)