栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Linux下获取WIFI状态信息(c语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux下获取WIFI状态信息(c语言)

编译时需要 -lwpa_client

wifi.h

#ifndef __WIFI_H__
#define __WIFI_H__

int wifi_run_cmd(char *cmd, char *result, unsigned int *len);

struct wifi_signal_poll_result_t {
	char ack[1024];
	int rssi;
	int linkspeed;
	int noise;
	int frequency;
};

int wifi_run_cmd_signal_poll(struct wifi_signal_poll_result_t *result);


struct wifi_status_result_t {
	char ack[1024];
	char bssid[18];
	int freq;
	char ssid[128];
	int id;
	char mode[16];
	char pairwise_cipher[16];
	char group_cipher[16];
	char key_mgmt[16];
	char wpa_state[32];
	char ip_address[16];
	char address[18];
	char uuid[64];
};

int wifi_run_cmd_status(struct wifi_status_result_t *result);
void wifi_config(char *ssid, char *psk);
int wifi_get_config(char *ssid, char *psk);
#endif

wifi.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "wifi.h"


int wifi_run_cmd(char *cmd, char *result, unsigned int *len)
{
	
	struct wpa_ctrl *wpa_ctrl = wpa_ctrl_open("/var/run/wpa_supplicant/wlan0");

	if (!wpa_ctrl) {
		printf("Err: wpa_ctrl_open()n");
		return -1;
	}

	int ret = wpa_ctrl_request(wpa_ctrl, cmd, strlen(cmd), result, len, 0);
	result[*len] = 0;

	wpa_ctrl_close(wpa_ctrl);

	return ret;
}


static int result_get(char *str, char *key, char *val, int val_len)
{
	char *s;

	if (!(s = strstr(str, key))) {
		return -1;
	}

	if (!(s = strchr(s, '='))) {
		return -1;
	}

	s++;

	while (*s != 'n' && *s != '' && val_len > 1) {
		*val++ = *s++;
		val_len--;
	}
	*val ='';
	return 0;
}



int wifi_run_cmd_signal_poll(struct wifi_signal_poll_result_t *result)
{
	int ret;
	char val[512];
	char *ack = result->ack;
	unsigned int len = sizeof(result->ack);
	char *cmd = "SIGNAL_POLL";

	memset(result, 0x00, sizeof(struct wifi_signal_poll_result_t));

	ret = wifi_run_cmd(cmd, ack, &len);

	if (ret < 0 || len == 0) {
		ret = -1;
		printf("Err: %sn", cmd);
		goto ERROR;
	}

	if (strncmp(ack, "FAIL", 4) == 0) {
		printf("Err: %s (FAIL)n", cmd);
		goto ERROR;
	}

	
	if (result_get(ack, "RSSI", val, sizeof(val)) == 0) {
		result->rssi = strtol(val, NULL, 10);
	}

	if (result_get(ack, "linkSPEED", val, sizeof(val)) == 0) {
		result->linkspeed = strtol(val, NULL, 10);
	}

	if (result_get(ack, "FREQUENCY", val, sizeof(val)) == 0) {
		result->frequency = strtol(val, NULL, 10);
	}

	if (result_get(ack, "NOISE", val, sizeof(val)) == 0) {
		result->noise = strtol(val, NULL, 10);
	}

ERROR:
	return ret;
}



int wifi_run_cmd_status(struct wifi_status_result_t *result)
{
	int ret;
	char val[512];
	char *ack = result->ack;
	unsigned int len = sizeof(result->ack);
	char *cmd = "STATUS";

	memset(result, 0x00, sizeof(struct wifi_status_result_t));

	ret = wifi_run_cmd(cmd, ack, &len);

	if (ret < 0 || len == 0) {
		ret = -1;
		printf("Err: %sn", cmd);
		goto ERROR;
	}

	if (strncmp(ack, "FAIL", 4) == 0) {
		printf("Err: %s (FAIL)n", cmd);
		goto ERROR;
	}

	result_get(ack, "bssid", result->bssid, sizeof(result->bssid));

	if (result_get(ack, "freq", val, sizeof(val)) == 0) {
		result->freq = strtol(val, NULL, 10);
	}

	result_get(ack, "ssid", result->ssid, sizeof(result->ssid));

	if (result_get(ack, "id", val, sizeof(val)) == 0) {
		result->id = strtol(val, NULL, 10);
	}

	result_get(ack, "mode", result->mode, sizeof(result->mode));
	result_get(ack, "pairwise_cipher", result->pairwise_cipher, sizeof(result->pairwise_cipher));
	result_get(ack, "group_cipher", result->group_cipher, sizeof(result->group_cipher));
	result_get(ack, "key_mgmt", result->key_mgmt, sizeof(result->key_mgmt));
	result_get(ack, "wpa_state", result->wpa_state, sizeof(result->wpa_state));
	result_get(ack, "ip_address", result->ip_address, sizeof(result->ip_address));
	result_get(ack, "address", result->address, sizeof(result->address));
	result_get(ack, "uuid", result->uuid, sizeof(result->uuid));

ERROR:
	return ret;
}



void wifi_set_config(char *ssid, char *psk)
{
	char buf[1024];
	int len;
	char *path = "/etc/wpa_supplicant.conf";

	int fd = open(path, O_CREAT | O_TRUNC | O_WRONLY);

	len = sprintf(buf, "ctrl_interface=/var/run/wpa_supplicantnnetwork={nssid="%s"npsk="%s"n}n", ssid, psk);

	write(fd, buf, len);

	fsync(fd);
	close(fd);
}


int wifi_get_config(char *ssid, char *psk)
{
	char buf[1024];
	char *path = "/etc/wpa_supplicant.conf";

	memset(buf, 0x00, sizeof(buf));

	int fd = open(path, O_RDONLY);

	if (fd < 0) {
		return -1;
	}

	read(fd, buf, 1024);
	close(fd);

	char val[512];
	if (result_get(buf, "ssid", val, sizeof(val)) < 0) {
		return -1;
	}

	strcpy(ssid, val + 1);
	ssid[strlen(ssid) - 1] = '';

	if (result_get(buf, "psk", val, sizeof(val)) < 0) {
		return -1;
	}
	
	strcpy(psk, val + 1);
	psk[strlen(psk) - 1] = '';

	return 0;
}

void test_wifi_run_cmd_signal_poll(void)
{
	struct wifi_signal_poll_result_t result;
	wifi_run_cmd_signal_poll(&result);

	printf("%s: ack:n%s", __FUNCTION__, result.ack);

	printf("%s: rssi: %dn", __FUNCTION__, result.rssi);
	printf("%s: linkspeed: %dn", __FUNCTION__, result.linkspeed);
	printf("%s frequency: %dn", __FUNCTION__, result.frequency);
	printf("%s noise: %dn", __FUNCTION__, result.noise);
}

void test_wifi_run_cmd_status(void)
{
	struct wifi_status_result_t result;
	wifi_run_cmd_status(&result);

	printf("%s: ack:n%s", __FUNCTION__, result.ack);
	printf("%s: bssid:%sn", __FUNCTION__, result.bssid);
	printf("%s: freq:%dn", __FUNCTION__, result.freq);
	printf("%s: ssid:%sn", __FUNCTION__, result.ssid);
	printf("%s: id:%dn", __FUNCTION__, result.id);
	printf("%s: mode:%sn", __FUNCTION__, result.mode);
	printf("%s: pairwise_cipher:%sn", __FUNCTION__, result.pairwise_cipher);
	printf("%s: group_cipher:%sn", __FUNCTION__, result.group_cipher);
	printf("%s: key_mgmt:%sn", __FUNCTION__, result.key_mgmt);
	printf("%s: wpa_state:%sn", __FUNCTION__, result.wpa_state);
	printf("%s: ip_address:%sn", __FUNCTION__, result.ip_address);
	printf("%s: address:%sn", __FUNCTION__, result.address);
	printf("%s: uuid:%sn", __FUNCTION__, result.uuid);
}

void test_wifi(void)
{
	char ssid[128];
	char psk[128];
	if (wifi_get_config(ssid, psk) == 0) {
		printf("ssid: %sn", ssid);
		printf("psk: %sn", psk);
	}


	wifi_set_config("123456789", "123456789");
	
	sleep(5);
	test_wifi_run_cmd_signal_poll();
	test_wifi_run_cmd_status();
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348267.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号