W801_SDK_dev_env/demo/wm_scan_demo.c
2023-03-08 08:23:45 +01:00

462 lines
10 KiB
C

/*****************************************************************************
*
* File Name : wm_scan_demo.c
*
* Description: wifi scan demo function
*
* Copyright (c) 2018 Winner Micro Electronic Design Co., Ltd.
* All rights reserved.
*
* Author : muqing
*
* Date : 2018-12-03
*****************************************************************************/
#include <string.h>
#include "wm_include.h"
#include "tls_wireless.h"
#if DEMO_SCAN
static char *scan_privacy_string(u8 privacy)
{
char *sec;
switch (privacy)
{
case WM_WIFI_AUTH_MODE_OPEN:
sec = "NONE";
break;
case WM_WIFI_AUTH_MODE_WEP_AUTO:
sec = "WEP/AUTO";
break;
case WM_WIFI_AUTH_MODE_WPA_PSK_TKIP:
sec = "WPA_PSK/TKIP";
break;
case WM_WIFI_AUTH_MODE_WPA_PSK_CCMP:
sec = "WPA_PSK/CCMP";
break;
case WM_WIFI_AUTH_MODE_WPA_PSK_AUTO:
sec = "WPA_PSK/AUTO";
break;
case WM_WIFI_AUTH_MODE_WPA2_PSK_TKIP:
sec = "WPA2_PSK/TKIP";
break;
case WM_WIFI_AUTH_MODE_WPA2_PSK_CCMP:
sec = "WPA2_PSK/CCMP";
break;
case WM_WIFI_AUTH_MODE_WPA2_PSK_AUTO:
sec = "WPA2_PSK/AUTO";
break;
case WM_WIFI_AUTH_MODE_WPA_WPA2_PSK_TKIP:
sec = "WPA_PSK/WPA2_PSK/TKIP";
break;
case WM_WIFI_AUTH_MODE_WPA_WPA2_PSK_CCMP:
sec = "WPA_PSK/WPA2_PSK/CCMP";
break;
case WM_WIFI_AUTH_MODE_WPA_WPA2_PSK_AUTO:
sec = "WPA_PSK/WPA2_PSK/AUTO";
break;
default:
sec = "Unknown";
break;
}
return sec;
}
static char *scan_mode_string(u8 mode)
{
char *ap_mode;
switch (mode)
{
case 1:
ap_mode = "IBSS";
break;
case 2:
ap_mode = "ESS";
break;
default:
ap_mode = "ESS";
break;
}
return ap_mode;
}
static void wifi_scan_handler(void)
{
char *buf = NULL;
char *buf1 = NULL;
u32 buflen;
int i, j;
int err;
u8 ssid[33];
struct tls_scan_bss_t *wsr;
struct tls_bss_info_t *bss_info;
buflen = 2000;
buf = tls_mem_alloc(buflen);
if (!buf)
{
goto end;
}
buf1 = tls_mem_alloc(300);
if(!buf1)
{
goto end;
}
memset(buf1, 0, 300);
err = tls_wifi_get_scan_rslt((u8 *)buf, buflen);
if (err)
{
goto end;
}
wsr = (struct tls_scan_bss_t *)buf;
bss_info = (struct tls_bss_info_t *)(buf + 8);
printf("\n");
for(i = 0; i < wsr->count; i++)
{
j = sprintf(buf1, "bssid:%02X%02X%02X%02X%02X%02X, ", bss_info->bssid[0], bss_info->bssid[1],
bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]);
j += sprintf(buf1 + j, "ch:%d, ", bss_info->channel);
j += sprintf(buf1 + j, "rssi:%d, ", (signed char)bss_info->rssi);
j += sprintf(buf1 + j, "wps:%d, ", bss_info->wps_support);
j += sprintf(buf1 + j, "max_rate:%dMbps, ", bss_info->max_data_rate);
j += sprintf(buf1 + j, "%s, ", scan_mode_string(bss_info->mode));
j += sprintf(buf1 + j, "%s, ", scan_privacy_string(bss_info->privacy));
memcpy(ssid, bss_info->ssid, bss_info->ssid_len);
ssid[bss_info->ssid_len] = '\0';
j += sprintf(buf1 + j, "%s", ssid);
printf("%s\n", buf1);
bss_info ++;
}
end:
if(buf)
{
tls_mem_free(buf);
}
if(buf1)
{
tls_mem_free(buf1);
}
}
static void wifi_scan_format2_handler(void)
{
char *buf = NULL;
char *buf1 = NULL;
u32 buflen;
int i, j;
int err;
u8 ssid[33];
struct tls_scan_bss_format2_t *wsr;
struct tls_bss_info_format2_t *bss_info;
buflen = 2000;
buf = tls_mem_alloc(buflen);
if (!buf)
{
goto end;
}
buf1 = tls_mem_alloc(300);
if(!buf1)
{
goto end;
}
memset(buf1, 0, 300);
err = tls_wifi_get_scan_rslt_format2((u8 *)buf, buflen);
if (err)
{
goto end;
}
wsr = (struct tls_scan_bss_format2_t *)buf;
bss_info = (struct tls_bss_info_format2_t *)(buf + 8);
printf("\n");
for(i = 0; i < wsr->count; i++)
{
j = sprintf(buf1, "(%d,", bss_info->ecn);
memcpy(ssid, bss_info->ssid, bss_info->ssid_len);
ssid[bss_info->ssid_len] = '\0';
j += sprintf(buf1 + j, "%s", ssid);
j += sprintf(buf1 + j, ",%d, ", (signed char)bss_info->rssi);
j += sprintf(buf1 + j, "\"%02x:%02x:%02x:%02x:%02x:%02x\", ", bss_info->bssid[0], bss_info->bssid[1],
bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]);
j += sprintf(buf1 + j, "%d, ", bss_info->channel);
j += sprintf(buf1 + j, "%d, ", bss_info->group_cipher);
j += sprintf(buf1 + j, "%d, ", bss_info->pairwise_cipher);
j += sprintf(buf1 + j, "%d, ", bss_info->bgn);
j += sprintf(buf1 + j, "%d,", bss_info->wps_support);
j += sprintf(buf1 + j, "%d,", bss_info->freq_offset);
j += sprintf(buf1 + j, "%d)", bss_info->freqcal_val);
printf("%s\n", buf1);
bss_info ++;
}
end:
if(buf)
{
tls_mem_free(buf);
}
if(buf1)
{
tls_mem_free(buf1);
}
}
struct specified_scan_info
{
u8 specified_ssid[33];
u16 specified_ssid_len;
u8 specified_bssid[18];
u8 specified_chan;
u8 specified_mask;
};
struct specified_scan_info specifiedinfo;
static void wifi_scan_format2_filter_handler(void)
{
char *buf = NULL;
char *buf1 = NULL;
u32 buflen;
int i, j;
int err;
u8 ssid[33];
u8 bssid[18];
struct tls_scan_bss_format2_t *wsr;
struct tls_bss_info_format2_t *bss_info;
u8 bitmask = 0;
buflen = 2000;
buf = tls_mem_alloc(buflen);
if (!buf)
{
goto end;
}
buf1 = tls_mem_alloc(300);
if(!buf1)
{
goto end;
}
memset(buf1, 0, 300);
err = tls_wifi_get_scan_rslt_format2((u8 *)buf, buflen);
if (err)
{
goto end;
}
wsr = (struct tls_scan_bss_format2_t *)buf;
bss_info = (struct tls_bss_info_format2_t *)(buf + 8);
printf("\n");
bitmask = specifiedinfo.specified_mask;
for(i = 0; i < wsr->count; i++)
{
j = sprintf(buf1, "(%d,", bss_info->ecn);
if (bitmask&0x1)
{
if((specifiedinfo.specified_ssid_len != bss_info->ssid_len)
|| memcmp(bss_info->ssid,specifiedinfo.specified_ssid,bss_info->ssid_len))
{
bss_info++;
continue;
}
}
memcpy(ssid, bss_info->ssid, bss_info->ssid_len);
ssid[bss_info->ssid_len] = '\0';
j += sprintf(buf1 + j, "%s", ssid);
j += sprintf(buf1 + j, ",%d,", (signed char)bss_info->rssi);
if (bitmask&0x2)
{
sprintf((char *)bssid, "%02x:%02x:%02x:%02x:%02x:%02x", bss_info->bssid[0], bss_info->bssid[1],
bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]);
if (strcmp((const char *)bssid, (const char *)specifiedinfo.specified_bssid))
{
bss_info++;
continue;
}
}
j += sprintf(buf1 + j, "\"%02x:%02x:%02x:%02x:%02x:%02x\",", bss_info->bssid[0], bss_info->bssid[1],
bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]);
if (bitmask&0x4)
{
if (bss_info->channel != specifiedinfo.specified_chan)
{
bss_info++;
continue;
}
}
j += sprintf(buf1 + j, "%d,", bss_info->channel);
j += sprintf(buf1 + j, "%d,", bss_info->freq_offset);
j += sprintf(buf1 + j, "%d,", bss_info->freqcal_val);
j += sprintf(buf1 + j, "%d,", bss_info->pairwise_cipher);
j += sprintf(buf1 + j, "%d,", bss_info->group_cipher);
j += sprintf(buf1 + j, "%d,", bss_info->bgn);
j += sprintf(buf1 + j, "%d)", bss_info->wps_support);
printf("%s\n", buf1);
bss_info ++;
}
end:
if(buf)
{
tls_mem_free(buf);
}
if(buf1)
{
tls_mem_free(buf1);
}
}
int user_scan_specified(u8 *ssid, u8 *mac, u8 chan, u8 scan_type, u32 min_interval, u32 max_interval)
{
struct tls_wifi_scan_param_t wscan_param;
memset(&specifiedinfo, 0, sizeof(specifiedinfo));
specifiedinfo.specified_mask = 0;
if (strlen((const char *)ssid) && (strlen((const char *)ssid) < 33))
{
memset(specifiedinfo.specified_ssid, 0, 33);
strcpy((char *)specifiedinfo.specified_ssid, (char *)ssid);
specifiedinfo.specified_ssid_len = strlen((const char *)ssid);
specifiedinfo.specified_mask = 1;
}
else
{
specifiedinfo.specified_ssid[0] = '\0';
specifiedinfo.specified_ssid_len = 0;
specifiedinfo.specified_mask &= ~1;
}
if (strlen((const char *)mac) == 17)
{
memset(specifiedinfo.specified_bssid, 0, 17);
strcpy((char *)specifiedinfo.specified_bssid, (char *)mac);
specifiedinfo.specified_mask |= 2;
}
else
{
specifiedinfo.specified_bssid[0] = '\0';
specifiedinfo.specified_mask &= ~2;
}
if (scan_type)
{
wscan_param.scan_type = 1;
}
else
{
wscan_param.scan_type = 0;
}
if (chan == 0)
{
specifiedinfo.specified_chan = 0;
wscan_param.scan_chanlist = 0x1FFF;
specifiedinfo.specified_mask &= ~4;
}
else
{
specifiedinfo.specified_chan = chan;
specifiedinfo.specified_mask |=4;
wscan_param.scan_chanlist = 1<<(chan-1);
}
if (min_interval == 0)
{
wscan_param.scan_chinterval = 120;
wscan_param.scan_times = 1;
}
else
{
wscan_param.scan_chinterval = min_interval;
if (max_interval >= min_interval)
{
wscan_param.scan_times = (max_interval + min_interval/2)/min_interval;
}
else
{
wscan_param.scan_times = 1;
}
}
tls_wifi_scan_by_param(&wscan_param);
return 0;
}
/*Scan demo*/
int scan_demo(void)
{
tls_wifi_scan_result_cb_register(wifi_scan_handler);
tls_wifi_scan();
return WM_SUCCESS;
}
int scan_format2_demo(void)
{
tls_wifi_scan_result_cb_register(wifi_scan_format2_handler);
tls_wifi_scan();
return WM_SUCCESS;
}
/*specified Scan demo*/
int scan_specified_demo(u8 *ssid, u8 *mac, u32 chan, u32 scan_type, u32 min_interval, u32 max_interval)
{
tls_wifi_scan_result_cb_register(wifi_scan_format2_filter_handler);
user_scan_specified(ssid, mac, chan, scan_type, min_interval, max_interval);
return WM_SUCCESS;
}
#endif