编译时需要 -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(); }



