SmartAudio/package/allwinner/wifimanager/demo/wifi_add_network.c

294 lines
8.3 KiB
C
Executable File

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <wifi_intf.h>
#include <pthread.h>
#include "wmg_debug.h"
static pthread_t app_scan_tid;
static int event = WIFIMG_NETWORK_DISCONNECTED;
static void wifi_event_handle(tWIFI_EVENT wifi_event, void *buf, int event_label)
{
wmg_printf(MSG_DEBUG,"event_label 0x%x\n", event_label);
switch(wifi_event)
{
case WIFIMG_WIFI_ON_SUCCESS:
{
wmg_printf(MSG_INFO,"WiFi on success!\n");
event = WIFIMG_WIFI_ON_SUCCESS;
break;
}
case WIFIMG_WIFI_ON_FAILED:
{
wmg_printf(MSG_ERROR,"WiFi on failed!\n");
event = WIFIMG_WIFI_ON_FAILED;
break;
}
case WIFIMG_WIFI_OFF_FAILED:
{
wmg_printf(MSG_ERROR,"wifi off failed!\n");
event = WIFIMG_WIFI_OFF_FAILED;
break;
}
case WIFIMG_WIFI_OFF_SUCCESS:
{
wmg_printf(MSG_INFO,"wifi off success!\n");
event = WIFIMG_WIFI_OFF_SUCCESS;
break;
}
case WIFIMG_NETWORK_CONNECTED:
{
wmg_printf(MSG_INFO,"WiFi connected ap!\n");
event = WIFIMG_NETWORK_CONNECTED;
break;
}
case WIFIMG_NETWORK_DISCONNECTED:
{
wmg_printf(MSG_INFO,"WiFi disconnected!\n");
event = WIFIMG_NETWORK_DISCONNECTED;
break;
}
case WIFIMG_PASSWORD_FAILED:
{
wmg_printf(MSG_ERROR,"Password authentication failed!\n");
event = WIFIMG_PASSWORD_FAILED;
break;
}
case WIFIMG_CONNECT_TIMEOUT:
{
wmg_printf(MSG_ERROR,"Connected timeout!\n");
event = WIFIMG_CONNECT_TIMEOUT;
break;
}
case WIFIMG_NO_NETWORK_CONNECTING:
{
wmg_printf(MSG_INFO,"It has no wifi auto connect when wifi on!\n");
event = WIFIMG_NO_NETWORK_CONNECTING;
break;
}
case WIFIMG_CMD_OR_PARAMS_ERROR:
{
wmg_printf(MSG_ERROR,"cmd or params error!\n");
event = WIFIMG_CMD_OR_PARAMS_ERROR;
break;
}
case WIFIMG_KEY_MGMT_NOT_SUPPORT:
{
wmg_printf(MSG_ERROR,"key mgmt is not supported!\n");
event = WIFIMG_KEY_MGMT_NOT_SUPPORT;
break;
}
case WIFIMG_OPT_NO_USE_EVENT:
{
wmg_printf(MSG_INFO,"operation no use!\n");
event = WIFIMG_OPT_NO_USE_EVENT;
break;
}
case WIFIMG_NETWORK_NOT_EXIST:
{
wmg_printf(MSG_ERROR,"network not exist!\n");
event = WIFIMG_NETWORK_NOT_EXIST;
break;
}
case WIFIMG_DEV_BUSING_EVENT:
{
wmg_printf(MSG_INFO,"wifi device busing!\n");
event = WIFIMG_DEV_BUSING_EVENT;
break;
}
default:
{
wmg_printf(MSG_INFO,"Other event, no care!\n");
}
}
}
void *app_scan_task(void *args)
{
const aw_wifi_interface_t *p_wifi = (aw_wifi_interface_t *)args;
char scan_results[4096];
int len = 0;
int event_label = 0;
while(1){
event_label++;
p_wifi->start_scan(event_label);
len = 4096;
p_wifi->get_scan_results(scan_results, &len);
}
}
int check_password(const char *passwd)
{
int result = 0;
int i=0;
if(!passwd || *passwd =='\0'){
return -1;
}
if(strlen(passwd) < 8 || strlen(passwd) > 64 ){
wmg_printf(MSG_ERROR,"ERROR:passwd less than 8 or longer than 64");
return -1;
}
for(i=0; passwd[i]!='\0'; i++){
/* non printable char */
if((passwd[i]<32) || (passwd[i] > 126)){
wmg_printf(MSG_INFO,"ERROR:passwd include unprintable char");
result = -1;
break;
}
}
return result;
}
void print_help(){
wmg_printf(MSG_INFO,"---------------------------------------------------------------------------------\n");
wmg_printf(MSG_INFO,"NAME:\n\twifi_add_network_test\n");
wmg_printf(MSG_INFO,"DESCRIPTION:\n\tadd and connect the AP.\n");
wmg_printf(MSG_INFO,"USAGE:\n\twifi_add_network_test <ssid> <passwd> <key_mgmt> <level>\n");
wmg_printf(MSG_INFO,"PARAMS:\n\tssid : ssid of the AP\n");
wmg_printf(MSG_INFO,"\tpasswd : password of the AP(WPA_PSK/WPA2_PSK: Common characters:ASCII 32-126)\n");
wmg_printf(MSG_INFO,"\tkey_mgmt : encryption method of the AP\n");
wmg_printf(MSG_INFO,"\t\t0 : NONE\n");
wmg_printf(MSG_INFO,"\t\t1 : key_mgmt = WPA_PSK (password length:8-64 and whithout unprintable char)\n");
wmg_printf(MSG_INFO,"\t\t2 : key_mgmt = WPA2_PSK (password length:8-64 and whithout unprintable char)\n");
wmg_printf(MSG_INFO,"\t\t3 : key_mgmt = WEP\n");
wmg_printf(MSG_INFO,"\tlevel : print level(d0~d5).larger value,more info.para is not required,default d2.\n");
wmg_printf(MSG_INFO,"--------------------------------------MORE---------------------------------------\n");
wmg_printf(MSG_INFO,"The way to get help information:\n");
wmg_printf(MSG_INFO,"\twifi_add_network_test --help\n");
wmg_printf(MSG_INFO,"\twifi_add_network_test -h\n");
wmg_printf(MSG_INFO,"\twifi_add_network_test -H\n");
wmg_printf(MSG_INFO,"---------------------------------------------------------------------------------\n");
}
int check_params(int num, char *str[]){
if(num < 4 || num >5){
wmg_printf(MSG_ERROR,"ERROR: params more or less!\n");
return -1;
}
int mgmt = atoi(str[3]);
if(mgmt >= 0 && mgmt <= 3){
if((mgmt == 1 || mgmt == 2) && (check_password(str[2]))){
wmg_printf(MSG_ERROR,"ERROR: password format incorrect!\n");
return -1;
}
return 0;
}else{
wmg_printf(MSG_ERROR,"ERROR:key_mgmt not allowed!\n");
return -1;
}
}
/*
*argc[1] ap ssid
*argc[2] ap passwd
*argc[2] key_mgmt
*/
static int set_log_level(int argv, char *argc[])
{
if(argv >=5 && !strncmp(argc[4],"d",1)){
char *debug = argc[4];
if(strlen(debug) >=2 && debug[1] >= '0' &&
debug[1] <= '5'){
wmg_set_debug_level(debug[1] - '0');
return 0;
}else{
printf("Illegal level\n");
printf("Level range 0~5\n");
return -1;
}
}
return 0;
}
int main(int argv, char *argc[]){
int ret = 0, len = 0, switch_int = 0;
int times = 0, event_label = 0;;
char ssid[256] = {0}, scan_results[4096] = {0};
int wifi_state = WIFIMG_WIFI_DISABLED;
const aw_wifi_interface_t *p_wifi_interface = NULL;
tKEY_MGMT key_mgmt = WIFIMG_NONE;
if(argv == 2 && (!strcmp(argc[1],"--help") || !strcmp(argc[1], "-h") || !strcmp(argc[1], "-H"))){
print_help();
return -1;
}
if(check_params(argv, argc)){
print_help();
return -1;
}
if(set_log_level(argv, argc))
return -1;
wmg_printf(MSG_INFO,"\n*********************************\n");
wmg_printf(MSG_INFO,"***Start wifi connect ap test\n");
wmg_printf(MSG_INFO,"***ssid :%s\n",argc[1]);
wmg_printf(MSG_INFO,"***password:%s\n",argc[2]);
wmg_printf(MSG_INFO,"*********************************\n");
event_label = rand();
p_wifi_interface = aw_wifi_on(wifi_event_handle, event_label);
if(p_wifi_interface == NULL){
wmg_printf(MSG_ERROR,"wifi on failed event 0x%x\n", event);
return -1;
}
while(aw_wifi_get_wifi_state() == WIFIMG_WIFI_BUSING){
wmg_printf(MSG_INFO,"wifi state busing,waiting\n");
usleep(2000000);
}
//pthread_create(&app_scan_tid, NULL, &app_scan_task,(void *)p_wifi_interface);
event_label++;
switch_int= atoi(argc[3]);
wmg_printf(MSG_DEBUG,"The switch_int is %d\n",switch_int);
switch(switch_int)
{
case 0: key_mgmt = WIFIMG_NONE; break;
case 1: key_mgmt = WIFIMG_WPA_PSK; break;
case 2: key_mgmt = WIFIMG_WPA2_PSK; break;
case 3: key_mgmt = WIFIMG_WEP; break;
default: ; break;
}
p_wifi_interface->add_network(argc[1], key_mgmt, argc[2], event_label);
while(aw_wifi_get_wifi_state() == WIFIMG_WIFI_BUSING){
wmg_printf(MSG_INFO,"wifi state busing,waiting\n");
usleep(2000000);
}
wmg_printf(MSG_INFO,"\n******************************\n");
if(aw_wifi_get_wifi_state()== WIFIMG_WIFI_CONNECTED){
wmg_printf(MSG_INFO,"Wifi connect ap : Success!\n");
}
else{
wmg_printf(MSG_ERROR,"Wifi connect ap : Failure!\n");
}
wmg_printf(MSG_INFO,"******************************\n");
return 0;
}