最近有个项目,需要再代码里面实现获取wifi 扫描SSID;
查阅了大概得资料,后思路主要分两种:
1.通过system + 管道方式 + iwlist执行,获取iwlist执行结果(网上大多数方式);
2.研究iwlist源码 + iwlist库函数获取;这里是采用这种方式;
另外此程序实现的功能还有:
1.获取保留SSID的信号质量;
2.获取保留SSID的信号级别:最大级别:5;
3.在iwlist基础上优化:
a.去掉扫描的空的SSID;
b.去掉重复的SSID;
一、移植iwlist
这里就不说了,可以搜一下,有很多相关资料;
二、获取SSID和相关的参数信息;
static inline void
print_scanning_my_ssid(
struct iw_event *event, /* Extracted token */
struct iwscan_state *state,
struct iw_range *iw_range, /* Range info */
int has_range)
{
char buffer[128] = {0}; /* Temporary buffer */
// int i = 0;
// printf("event cmd:[0x%x]\r\n", event->cmd);
/* Now, let's decode the event */
switch (event->cmd)
{
/*SSID 个数*/
case SIOCGIWAP:
// printf(" Cell %02d - Address: %s\n", state->ap_num,
// iw_saether_ntop(&event->u.ap_addr, buffer));
iw_saether_ntop(&event->u.ap_addr, buffer);
state->ap_num++;
g_wifi_kernel_info.wifi_ssid_num++;
//printf("%s %s line %d ssid number :[%d] \n", __FILE__, __FUNCTION__, __LINE__, g_wifi_kernel_info.wifi_ssid_num);
//printf("%s %s line %d mac buf :[%s] \n", __FILE__, __FUNCTION__, __LINE__, buffer);
memcpy(g_wifi_kernel_info.wifi_MAC[g_wifi_kernel_info.wifi_ssid_num - 1], buffer, strlen(buffer));
//printf("%s %s line %d save ssid :[%s] \n", __FILE__, __FUNCTION__, __LINE__, g_wifi_kernel_info.wifi_ssid[g_wifi_kernel_info.wifi_ssid_num - 1]);
break;
/*处理扫描到的SSID*/
case SIOCGIWESSID:
{
char essid[IW_ESSID_MAX_SIZE + 1];
memset(essid, '\0', sizeof(essid));
if ((event->u.essid.pointer) && (event->u.essid.length))
{
memcpy(essid, event->u.essid.pointer, event->u.essid.length);
// memcpy(essid, event->u.essid.pointer, event->u.essid.length);
memcpy(g_wifi_kernel_info.wifi_ssid[g_wifi_kernel_info.wifi_ssid_num - 1], essid, strlen(essid));
//printf("%s %s line %d save ssid :[%s] \n", __FILE__, __FUNCTION__, __LINE__, g_wifi_kernel_info.wifi_ssid[g_wifi_kernel_info.wifi_ssid_num - 1]);
}
#if 0
if (event->u.essid.flags)
{
/* Does it have an ESSID index ? */
if ((event->u.essid.flags & IW_ENCODE_INDEX) > 1)
printf(" ESSID:\"%s\" [%d]\n", essid,
(event->u.essid.flags & IW_ENCODE_INDEX));
else
printf(" ESSID:\"%s\"\n", essid);
}
else
printf(" ESSID:off/any/hidden\n");
#endif
//my_wilist_deal_ssid_name(essid, strlen(essid));
}
break;
/*信号质量*/
case IWEVQUAL:
iw_print_stats(buffer, sizeof(buffer),
&event->u.qual, iw_range, has_range);
//printf(" %s\n", buffer);
break;
default:
// printf(" (Unknown Wireless Token 0x%04X)\n",
// event->cmd);
break;
} /* switch(event->cmd) */
}
运行结果:
wlan0 Link encap:Ethernet HWaddr A0:ED:FB:EF:7E:01
my_iwlist.c my_iwlist_get_kernel_wifi_info line 866 第[0]次扫描完成
my_iwlist.c my_iwlist_get_kernel_wifi_info line 923 找到第一个SSID: >>> [xxxx]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951 找到新的SSID: >>> [ChinaNet-qrtq]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 866 第[1]次扫描完成
my_iwlist.c my_iwlist_get_kernel_wifi_info line 866 第[2]次扫描完成
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951 找到新的SSID: >>> [TP-LINK_AA12]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951 找到新的SSID: >>> [DIRECT-Wk-EPSON-L15150 Series]
my_iwlist.c my_iwlist_get_kernel_wifi_info line 951 找到新的SSID: >>> [TP-LINKxxxx]
>>>>>>>>>>>>>>一共获取到[5]个SSID: >>>>>>>>>>>
Cell [00] MAC:[3C:6A:48:3F:D7:17] Quality:[2/5] Signal:[-79 dBm] Noise:[-96 dBm] ESSID:[XXXX]
Cell [01] MAC:[84:74:60:90:04:A0] Quality:[0/5] Signal:[-92 dBm] Noise:[-96 dBm] ESSID:[ChinaNet-qrtq]
Cell [02] MAC:[F4:6D:2F:BE:AA:12] Quality:[1/5] Signal:[-87 dBm] Noise:[-96 dBm] ESSID:[TP-LINK_AA12]
Cell [03] MAC:[52:57:9C:4A:EA:16] Quality:[1/5] Signal:[-85 dBm] Noise:[-96 dBm] ESSID:[DIRECT-Wk-EPSON-L15150 Series]
Cell [04] MAC:[EC:60:73:CC:6D:74] Quality:[2/5] Signal:[-74 dBm] Noise:[-96 dBm] ESSID:[TP-LINK_XXXX]