[root@demo] $ udhcpc -i wlan0
udhcpc(v1.23.2) started
Sending discover...
Sending select for192.168.0.104...
Lease of192.168.0.104 obtained, lease time 7200
deleting routers
adding dns
API Demo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>static char wifi_ssid[16][128];static char *wifi_name[16];//----------------------------------------------------------------------// D E F I N I T I O N//----------------------------------------------------------------------//----------------------------------------------------------------------// L O C A L D E F I N I T I O N//----------------------------------------------------------------------staticconst char *SCAN="wpa_cli -i wlan0 scan";staticconst char *SCAN_RES="wpa_cli -i wlan0 scan_result";staticconst char *ADD_NETWORK="wpa_cli -i wlan0 add_network";staticconst char *SELECT_NETWORK="wpa_cli -i wlan0 select_network";staticconst char *STATUS="wpa_cli -i wlan0 status";staticconst char *SET_SSID="wpa_cli -i wlan0 set_network 0 ssid";staticconst char *SET_PASSWORD="wpa_cli -i wlan0 set_network 0 psk";staticconst char *ENABLE_NETWORK="wpa_cli -i wlan0 enable_network 0";staticconst char *UDHCPC_NETWORK="udhcpc -i wlan0";//----------------------------------------------------------------------// L O C A L F U N C T I O N D E F I N I T I O N//----------------------------------------------------------------------static int wifi_scan(void);staticvoidwifi_scan_result(char(*ssid_buf)[128]);//----------------------------------------------------------------------// L O C A L F U N C T I O N I M P L E M E N T A T I O N//----------------------------------------------------------------------//----------------------------------------------------------------------// function: wifi_scan// parameter: none// return: 1 -- scan OK 0 -- scan failed//----------------------------------------------------------------------static int wifi_scan(void){FILE*fp;
char buf[8]={0};if((fp =popen(SCAN,"r"))==NULL){perror("SCAN");exit(1);}while(fgets(buf,sizeof(buf),fp)!=NULL)//fgets()此处是否会阻塞?{printf("%s\n",buf);if(strstr(buf,"OK")!=NULL){printf("close fp and return\n");pclose(fp);return1;}}return0;}//----------------------------------------------------------------------// function: set_noblock_read// statement: set fgets noblock read mode// parameter: FILE* fstream, which is popen func returned// return: none//----------------------------------------------------------------------staticvoidset_noblock_read(FILE*fstream){
int fd;
int flags;
fd =fileno(fstream);
flags =fcntl(fd,F_GETFL,0);
flags |=O_NONBLOCK;fcntl(fd,F_SETFL,flags);return;}//----------------------------------------------------------------------// function: wifi_scan_res// statement: show scan result, get ssid to the ssid buf// parameter: wifi_ssid buf// return: none//----------------------------------------------------------------------staticvoidwifi_scan_result(char(*ssid_buf)[128]){FILE*fp;
char *p_n=NULL;
char *p_ssid_end =NULL;
char *p_ssid_start=NULL;
char buf[4096]={0};
int flags;
int ssid_index=0;if((fp=popen(SCAN_RES,"r"))==NULL){perror("SCAN_RES");exit(1);}
int fd =fileno(fp);//把文件指针转换成文件描述符用fileno函数
flags =fcntl(fd,F_GETFL,0);
flags |=O_NONBLOCK;//O_NONBLOCK = 04000fcntl(fd,F_SETFL,flags);sleep(1);//这里必须要等待一下,否则fgets立即返回NULL,捕获不到数据while(fgets(buf,sizeof(buf),fp)!=NULL)//wifi扫描不到是否意味着就一直阻塞在这里?比如在没有WiFi的地方{//printf("%s",buf);if(strstr(buf,(const char*)"bssid")!=NULL)//忽略第一行{continue;}if((p_n =strstr(buf,"\n"))!=NULL)//注意,\n是接收到的最后一个字符{
p_ssid_end = p_n-1;//'\n前面一个字符'while(*p_n !='\t')//中间是用'\t'制表符隔开的{
p_n--;}
p_ssid_start = p_n;//'\t'strncpy(ssid_buf[ssid_index],(p_ssid_start+1),(p_ssid_end-p_ssid_start));printf("%s\n",ssid_buf[ssid_index]);
ssid_index++;}}printf("fgets() return without block and close fp\n");pclose(fp);return;}//----------------------------------------------------------------------// function: wifi_add_network// statement: add net work, there where a network list, wpa_cli list_networks// can see how many network add add in the lsit, but there is only// one in the current state.// parameter: null// return: the network id in the system////----------------------------------------------------------------------static int wifi_add_network(void){FILE*fp;
char buf[8]={0};if((fp =popen(ADD_NETWORK,"r"))==NULL){perror("ADD_NETWORK");exit(1);}while(fgets(buf,sizeof(buf),fp)!=NULL){printf("%s\n",buf);}return0;}//----------------------------------------------------------------------// function: wifi_set_ssid(char *ssid_name)// statement: set ssid name//// parameter:// return: 1 -- success// 0 -- failed//----------------------------------------------------------------------static int wifi_set_ssid(char *ssid_name){FILE*fp;
char buf[128]={0};
char cmd[128]="";strcat(cmd,SET_SSID);strcat(cmd," '\"");strcat(cmd,ssid_name);strcat(cmd,"\"'");printf("%s\n",cmd);if((fp=popen(cmd,"r"))==NULL){perror("set ssid failed");exit(1);}set_noblock_read(fp);//no block readsleep(1);while(fgets(buf,sizeof(buf),fp)!=NULL){printf("%s\n",buf);if(strstr(buf,"OK")!=NULL){pclose(fp);return1;}}pclose(fp);return0;}//----------------------------------------------------------------------// function: wifi_set_password(char *password)// statement: set password//// parameter:// return: 1 -- success// 0 -- failed//----------------------------------------------------------------------static int wifi_set_password(char *password){FILE*fp;
char buf[128]={0};
char cmd[128]="";strcat(cmd,SET_PASSWORD);strcat(cmd," '\"");strcat(cmd,password);strcat(cmd,"\"'");printf("%s\n",cmd);if((fp=popen(cmd,"r"))==NULL){perror("set password failed");exit(1);}set_noblock_read(fp);//no block readsleep(1);while(fgets(buf,sizeof(buf),fp)!=NULL){printf("%s\n",buf);if(strstr(buf,"OK")!=NULL){pclose(fp);return1;}}pclose(fp);return0;}//----------------------------------------------------------------------// function: wifi_enable_netword(char *password)// statement: after set ssid and psk, need to enable network.// then can use udhcpc -i wlan0// parameter:// return: 1 -- success// 0 -- failed//----------------------------------------------------------------------static int wifi_enable_network(void){FILE*fp;
char buf[8]={0};
fp=popen(ENABLE_NETWORK,"r");while(fgets(buf,8,fp)!=NULL){printf("%s\n",buf);if(strstr(buf,"OK")!=NULL){pclose(fp);return1;}}pclose(fp);return0;}//----------------------------------------------------------------------// M I A N F U N C T I O N//----------------------------------------------------------------------
int main(){memset(wifi_ssid,0,sizeof(char)*16*128);wifi_scan();sleep(2);wifi_scan_result(wifi_ssid);wifi_add_network();wifi_set_ssid("TP-LINK_BF4D");wifi_set_password("wjj198712162803");wifi_enable_network();exit(1);}