#include <stdio.h> | |
#include <stdlib.h> | |
#include <stdbool.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <errno.h> | |
#include <unistd.h> | |
#include <sys/types.h> | |
#include <sys/time.h> | |
#include <getopt.h> | |
#include <time.h> | |
#include <wifi_msg.h> | |
#include "softap_api.h" | |
#include "wifi_sta_ctrl.h" | |
#include "wifi_util.h" | |
/* | |
static char * g_short_string = "u:b:s:d:h"; | |
static struct option g_long_options[] = { | |
{"upgrade", required_argument, NULL, 'u'}, | |
{"boot", required_argument, NULL, 'b'}, | |
{"status", required_argument, NULL, 's'}, | |
{"debug", required_argument, NULL, 'd'}, | |
{"help", no_argument, NULL, 'h'}, | |
}; | |
static option_handle_t g_option_handle[] = { | |
{'u', excute_command_upgrade}, | |
{'b', excute_command_boot}, | |
{'s', excute_command_status}, | |
{'d', excute_command_debug}, | |
{'h', excute_command_help} | |
}; | |
*/ | |
int msg_queue_id = 0; | |
scan_result_t g_scan_spot_list[60]; | |
int g_spot_cur_num = 0; | |
void usage (void) | |
{ | |
printf ("cmd list: " | |
" open open wifi\n" | |
" close close wifi\n" | |
" results display the scan results\n" | |
" mmi display scan list to simulate watch mmi\n" | |
" help dispaly this message\n" | |
" scan send scan cmd\n" | |
" conn connect the ap specified by the index of scan list ,and need input the password\n" | |
" forget disconnect and forget the ap\n" | |
" dump dump the content of the global variable in wlan_manager\n" | |
" cmd you can send a wpa_supplicant cmd directly\n"); | |
} | |
static scan_result_t* parse_spot_string(scan_result_t *spot, char *spot_string) | |
{ | |
char *splited_string = NULL; | |
char *save = NULL; | |
const char *delimiter = ","; | |
scan_content_t scan_content = WIFI_STATION_AP_CONTENT_UNDEFINED; | |
char spot_string_tmp[256] = {0}; | |
if (spot_string == NULL) { | |
return NULL; | |
} | |
safe_strcpy(spot_string_tmp, spot_string, 256); | |
//·Ö¸î×Ö·û´®£¬´æ´¢µ½½á¹¹Ìå | |
splited_string = strtok_r(spot_string_tmp, delimiter, &save); | |
// wf_log("%s", splited_string); | |
while (splited_string) { | |
scan_content++; | |
switch (scan_content) { | |
case WIFI_STATION_AP_MAC: | |
safe_strcpy(spot->mac, splited_string, WIFI_STATION_MAC_LEN); | |
break; | |
case WIFI_STATION_AP_SSID: | |
safe_strcpy(spot->ssid, splited_string, WIFI_STATION_SSID_LEN); | |
break; | |
case WIFI_STATION_AP_AUTH_MODE: | |
safe_strcpy(spot->auth_mode, splited_string, WIFI_STATION_AUTH_MODE_LEN); | |
break; | |
case WIFI_STATION_AP_ENCRYPT_TYPE: | |
safe_strcpy(spot->encrypt_type, splited_string, WIFI_STATION_ENCRYPT_TYPE_LEN); | |
break; | |
case WIFI_STATION_AP_CHANNEL: | |
spot->channel = atoi(splited_string); | |
break; | |
case WIFI_STATION_AP_SIGNAL: | |
spot->signal = atoi(splited_string); | |
break; | |
case WIFI_STATION_AP_CONNECT_STATUS: | |
spot->connect_status = atoi(splited_string); | |
break; | |
case WIFI_STATION_AP_NETWORK_ID: | |
spot->network_id = atoi(splited_string); | |
break; | |
default: | |
break; | |
} | |
splited_string = strtok_r(NULL, delimiter, &save); | |
// wf_log("%s", splited_string); | |
} | |
if (scan_content != WIFI_STATION_AP_NETWORK_ID) { | |
return NULL; | |
} | |
return spot; | |
} | |
static void parse_scan_result(char *aplist,char* aplist1) | |
{ | |
char *splited_string = NULL; | |
char *save = NULL; | |
const char *delimiter = ";"; | |
char spot_string_tmp[2048+2] = {0};// nv ×¿ÉÒÔ´æ´¢1024 byte | |
int index = 0; | |
if (aplist == NULL) { | |
return; | |
} | |
if(strlen(aplist)>0){ | |
safe_strcpy(spot_string_tmp, aplist, sizeof(spot_string_tmp)); | |
if(strlen(aplist1)>0){ | |
strcat(spot_string_tmp, ";"); | |
strcat(spot_string_tmp, aplist1); | |
} | |
} | |
else{ | |
return; | |
} | |
//·Ö¸î×Ö·û´®£¬´æ´¢µ½½á¹¹Ìå | |
splited_string = strtok_r(spot_string_tmp, delimiter, &save); | |
// wf_log("profile=%s", splited_string); | |
while (splited_string) { | |
parse_spot_string(&g_scan_spot_list[index], splited_string); | |
index++; | |
splited_string = strtok_r(NULL, delimiter, &save); | |
// wf_log("profile=%s", splited_string); | |
} | |
g_spot_cur_num = index; | |
} | |
static void set_spot_state(msg_act_spot_t *mas) | |
{ | |
int i = 0; | |
spot_action_t action = mas->act; | |
for(i = 0; i< g_spot_cur_num; i++ ){ | |
if( strcmp(g_scan_spot_list[i].mac, mas->mac) ==0){ | |
if(SAVE_ACTION == action){ | |
g_scan_spot_list[i].network_id = mas->network_id; | |
} | |
else if(DEL_ACTION == action) | |
g_scan_spot_list[i].network_id = -1; | |
else if(CONNECTING_ACTION == action) | |
g_scan_spot_list[i].connect_status = CONNECTING_STATUS; | |
else if(DHCPING_ACTION == action) | |
g_scan_spot_list[i].connect_status = DHCPING_STATUS; | |
else if(CONNECTED_ACTION == action) | |
g_scan_spot_list[i].connect_status = CONNECTED_STATUS; | |
else if(DISCONNECT_ACTION == action) | |
g_scan_spot_list[i].connect_status = DISCONNECT_STATUS; | |
break; | |
} | |
} | |
} | |
static void process_msg(MSG_BUF *pMsg) | |
{ | |
switch (pMsg->usMsgCmd) { | |
case MSG_CMD_WIFI_STATION_INDICATE_SCAN_RESULTS: | |
{ | |
if(pMsg->usDataLen ==0){ | |
char aplist[1025]={0}; | |
char aplist1[1025]={0}; | |
sc_cfg_get("EX_APLIST", aplist, 1024); | |
sc_cfg_get("EX_APLIST1", aplist1, 1024); | |
parse_scan_result(aplist,aplist1); | |
} | |
else | |
{ | |
msg_act_spot_t *mas = (msg_act_spot_t *)pMsg->aucDataBuf; | |
set_spot_state(mas); | |
} | |
break; | |
} | |
default: | |
break; | |
} | |
} | |
void dump_spot_list() | |
{ | |
int i = 0; | |
printf("%-8s%-24s%-32s%-16s%-8s%-8s%-8s\n","Index","MAC","SSID","CHANNEL","SIGNAL","ID","State"); | |
for(i = 0; i< g_spot_cur_num; i++){ | |
scan_result_t *spot = &g_scan_spot_list[i]; | |
printf("%-8d%-24s%-32s%-16d%-8d%-8d%-8s\n",i, spot->mac, spot->ssid,spot->channel, | |
spot->signal,spot->network_id, spot->connect_status==CONNECTED_STATUS?"O":"x"); | |
} | |
} | |
void dump_conn_ap(spot_t *conn_ap) | |
{ | |
printf("mac=%s\n",conn_ap->mac); | |
printf("ssid=%s\n",conn_ap->ssid); | |
printf("auth_mode=%s\n",conn_ap->auth_mode); | |
printf("encrypt_type=%s\n",conn_ap->encrypt_type); | |
printf("password=%s\n",conn_ap->password); | |
printf("network_id=%d\n",conn_ap->network_id); | |
} | |
int mmi_display_loop = 0; | |
static void *mmi_loop (void *param) | |
{ | |
MSG_BUF wlanMsg ={0}; | |
char name[32] = {0}; | |
int ret = -1; | |
strcpy (name, (char*) param); | |
prctl (PR_SET_NAME, name, 0, 0, 0); | |
while (1) { | |
if(0 == mmi_display_loop)break; | |
dump_spot_list(); | |
sleep(1); | |
printf("\033[2J");//clear screen | |
printf("\033[0;0H");//locate cursor to head | |
} | |
return NULL; | |
} | |
void mmi_display() | |
{ | |
mmi_display_loop = 1; | |
wf_create_thread ("mmi_loop", mmi_loop); | |
while(1){ | |
char cmd; | |
scanf("%c", &cmd); | |
if(cmd == 'q'){ | |
mmi_display_loop = 0; | |
break; | |
} | |
} | |
return; | |
} | |
static void *station_loop (void *param) | |
{ | |
MSG_BUF wlanMsg ={0}; | |
char name[32] = {0}; | |
int ret = -1; | |
strcpy (name, (char*) param); | |
prctl (PR_SET_NAME, name, 0, 0, 0); | |
while (1) { | |
memset (&wlanMsg, 0, sizeof (MSG_BUF)); | |
ret = msgrcv (msg_queue_id, &wlanMsg, sizeof (MSG_BUF) - sizeof (LONG), 0, 0); | |
if (ret == -1) { | |
continue; | |
} | |
process_msg (&wlanMsg); | |
} | |
return NULL; | |
} | |
int main (int argc, char *argv[]) | |
{ | |
int c=0; | |
int iRet = -1; | |
char cmd[128]={0}; | |
msg_queue_id = wf_create_msg_qid (MODULE_ID_WLAN_SERVER); | |
wf_create_thread ("wlan-mmi", station_loop); | |
printf("rda_mmi v1.0\n" | |
"please use results, conn, disc three cmd to control it\n\n"); | |
for (;;) { | |
printf(">>"); | |
scanf("%s", cmd); | |
if(!strcmp(cmd, "open")){ | |
wf_msg_to_self(MSG_CMD_WIFI_STATION_OPEN, 0, NULL); | |
} | |
else if(!strcmp(cmd, "close")){ | |
wf_msg_to_self(MSG_CMD_WIFI_STATION_CLOSE, 0, NULL); | |
} | |
else if(!strcmp(cmd, "results")){ | |
dump_spot_list(); | |
} | |
else if(!strcmp(cmd, "scan")){ | |
wf_msg_to_self(MSG_CMD_WIFI_STATION_SCAN, 0, NULL); | |
} | |
else if(!strcmp(cmd, "conn")){ | |
int num = 0; | |
char pwd[WIFI_STATION_SPOT_PASSWORD_LEN]={0}; | |
printf("please enter the ssid num\n num="); | |
scanf("%d", &num); | |
if(g_scan_spot_list[num].network_id == -1){ | |
printf("\nplease enter the pwd\n pwd="); | |
scanf("%s", pwd); | |
} | |
spot_t conn_ap ={0}; | |
strcpy(conn_ap.mac, g_scan_spot_list[num].mac); | |
strcpy(conn_ap.ssid, g_scan_spot_list[num].ssid); | |
strcpy(conn_ap.auth_mode, g_scan_spot_list[num].auth_mode); | |
strcpy(conn_ap.encrypt_type, g_scan_spot_list[num].encrypt_type); | |
if(g_scan_spot_list[num].network_id >=0) | |
conn_ap.network_id = g_scan_spot_list[num].network_id; | |
else{ | |
strcpy(conn_ap.password, pwd); | |
conn_ap.network_id = -1; | |
} | |
dump_conn_ap(&conn_ap); | |
wf_msg_to_self(MSG_CMD_WIFI_STATION_CONNECT, sizeof(conn_ap), &conn_ap); | |
} | |
else if(!strcmp(cmd, "forget")){ | |
int num = 0; | |
printf("please enter the ssid num\n num="); | |
scanf("%d", &num); | |
spot_t conn_ap ={0}; | |
strcpy(conn_ap.mac, g_scan_spot_list[num].mac); | |
strcpy(conn_ap.ssid, g_scan_spot_list[num].ssid); | |
conn_ap.network_id = g_scan_spot_list[num].network_id; | |
wf_msg_to_self(MSG_CMD_WIFI_STATION_DISCONNECT, sizeof(conn_ap), &conn_ap); | |
} | |
else if(!strcmp(cmd, "dump")){ | |
wf_msg_to_self(MSG_CMD_WIFI_STATION_DEBUG_DUMP, 0, NULL); | |
} | |
else if(!strcmp(cmd, "mmi")){ | |
mmi_display(); | |
} | |
else if(!strcmp(cmd, "help")){ | |
usage(); | |
} | |
else if(!strcmp(cmd, "exit") || !strcmp(cmd, "q")){ | |
exit(0); | |
} | |
else if(!strcmp(cmd, "cmd")){ | |
char cmd[128]={0}; | |
printf("please enter wpa_supplicant cmd:\n"); | |
scanf("%s", cmd); | |
wf_msg_to_self(MSG_CMD_WIFI_STATION_WPA_CMD, strlen(cmd)+1, cmd); | |
} | |
printf("done\n"); | |
} | |
return 0; | |
} |