wifi的ap模式下获取热点(popen,fgets,printf,iwpriv)
2017-03-14 15:32
344 查看
前言:
在实际使用中,很多设备都需要用到wifi模块,但是如何使设备智能的连接到热点上。
其中一种方法是:先把设备的wifi模块设置为ap模式,客户端先搜索到这个设备的热点,
然后连接它,再把设备真正需要连接的热点发送给设备,从而使设备可以连接到指定的热点上。
一,设置为ap模式后,如何获取其它热点
设置为ap模式,默认是无法查找到别的wifi热点的,这个需要以下操作
iwpriv
ra0 set SiteSurvey
然后在通过以下命令来获取热点信息
iwpriv
ra0 get_site_survey
二,编程获取wifi热点信息
点击(此处)折叠或打开
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char HI_U8;
typedef unsigned short HI_U16;
typedef unsigned int HI_U32;
typedef signed char HI_S8;
typedef char * HI_PS8;
typedef short HI_S16;
typedef int HI_S32;
typedef int * HI_PS32;
#define MK_PROC_MAX_WIFI_AP_SIZE (10)
typedef struct _HI_DEV_WIFI_SCANNING_S
{
HI_U32 u32Size; //结构体的大小
HI_U32 u32ApNum; //* 第几个ap */
HI_U32 u32Frequency; //频率
HI_U32 u32CurrentUsed; //* 是否正在使用
1:正在使用 0:未使用 */
HI_U32 u32SignalQuality; //* 信号质量 */
HI_U32 u32BitRate; //* 传输速度(比特率) */
char szEssid[32]; //* essid */
char szProtocol[16]; //ap
support protocol
char szMacAddr[32]; //* mac
addr */
HI_U8 u8Mode; //mode 0:Auto
1:Managed 2:Ad-Hoc ...
HI_U8 u8IsEncrypt; //*是否加密1:加密
0:不加密*/
HI_U8 u8EncrypType; //*网络加密方式0:NONE
1:WAP 2:WAP2 3:WEP */
HI_U8 u8AuthMode; //* 认证模式
0:NONE 1:EAP 2:PSK 3:OPEN
4:SHARED*/
HI_U8 u8SecretKeyType; //密钥管理方式 0:none
1:AES 2:TKIP
HI_U8 u8Res[7];
}HI_DEV_WIFI_SCANNING_S,*LPHI_DEV_WIFI_SCANNING_S;
static void enable_softap_scanning(void)
{
system("iwpriv ra0 set SiteSurvey"); //开启ap扫描功能
sleep(2);
}
//*网络加密方式0:NONE
1:WAP 2:WAP2 3:WEP */
// 4:other
static int get_ap_security_type(char *buf)
{
int type = 0;
if (buf == NULL) return -1;
if (strstr(buf, "WPA2") != NULL)
type = 2;
else if (strstr(buf, "WPA") != NULL)
type = 1;
else if (strstr(buf, "WEP") != NULL)
type = 3;
else if (strstr(buf, "NONE") != NULL)
type = 0;
else
type = 4;
return type;
}
int _softap_get_scan_res(HI_DEV_WIFI_SCANNING_S *stScanInfo)
{
FILE *fp;
char buf[256] = {0};
int findFlag = 0;
int index = 0;
char chBuf[4] = {0}, ssidBuf[32] = {0}, macBuf[32] = {0},
athBuf[32] = {0}, sigBuf[16] = {0}, wBuf[8] = {0},
extBuf[8] = {0}, ntBuf[4] = {0};
enable_softap_scanning();
if((fp = popen("iwpriv
ra0 get_site_survey", "r")) == NULL) //获取ap扫描结果
{
printf("open cmd: iwpriv ra0 get_site_survey fail!\n");
return -1;
}
while(fgets(buf, sizeof(buf), fp) != NULL)
{
if(!findFlag && strstr(buf, "Ch") != NULL)
{
findFlag = 1;
continue;
}
if (findFlag)
{
if(sscanf(buf, "%s
%s %s %s %s %s %s %s\n",chBuf,ssidBuf,macBuf,athBuf,\
sigBuf,wBuf,extBuf,ntBuf) != 8)
{
continue;
}
if ((strcmp(ssidBuf, "") == 0) ||
(strcmp(ssidBuf, "CMCC-AUTO") == 0) ||
(strcmp(ssidBuf, "CMCC-WEB") == 0) ||
(strcmp(ssidBuf, "CMCC-FREE") == 0) ||
(strcmp(ssidBuf, "CMCC") == 0) ||
(strcmp(macBuf, "") == 0) ||
(strcmp(athBuf, "") == 0) ||
(atoi(sigBuf) <= 0))
{
continue;
}
else
{
int security_type = 0;
if ((security_type = get_ap_security_type(athBuf)) < 0)
continue;
strncpy(stScanInfo[index].szEssid,ssidBuf,32);
strncpy(stScanInfo[index].szMacAddr,macBuf,32);
stScanInfo[index].u32SignalQuality = atoi(sigBuf);
stScanInfo[index].u32CurrentUsed = 0;
stScanInfo[index].u8EncrypType = security_type;
++index;
if (index >= MK_PROC_MAX_WIFI_AP_SIZE)
break;
}
}
}
pclose(fp);
return index;
}
static void show_ap(HI_DEV_WIFI_SCANNING_S *stScanInfo,int count)
{
int index = 0;
printf("%-4s%-32s%-32s%-8s%-8s\n","id","ssid","essid","sig","sec");
for (index = 0; index < count; index++)
{
#if 0
printf("%*d,ssid[%*s],essid[%*s],signal[%*d],type[%*d]\n",4,index,
32,stScanInfo[index].szEssid,
32,stScanInfo[index].szMacAddr,
4,stScanInfo[index].u32SignalQuality,
4,stScanInfo[index].u8EncrypType);
#else
printf("%-4d%-32s%-32s%-8d%-8d\n",index,
stScanInfo[index].szEssid,
stScanInfo[index].szMacAddr,
stScanInfo[index].u32SignalQuality,
stScanInfo[index].u8EncrypType);
#endif
}
}
int main(int argc,char *argv[])
{
HI_DEV_WIFI_SCANNING_S stScanInfo[MK_PROC_MAX_WIFI_AP_SIZE];
int ap_count = 0;
ap_count = _softap_get_scan_res(stScanInfo);
show_ap(stScanInfo,ap_count);
return 0;
}
对 fgets 函数有疑惑的请看:fgets函数的理解
测试结果:
在实际使用中,很多设备都需要用到wifi模块,但是如何使设备智能的连接到热点上。
其中一种方法是:先把设备的wifi模块设置为ap模式,客户端先搜索到这个设备的热点,
然后连接它,再把设备真正需要连接的热点发送给设备,从而使设备可以连接到指定的热点上。
一,设置为ap模式后,如何获取其它热点
设置为ap模式,默认是无法查找到别的wifi热点的,这个需要以下操作
iwpriv
ra0 set SiteSurvey
然后在通过以下命令来获取热点信息
iwpriv
ra0 get_site_survey
二,编程获取wifi热点信息
点击(此处)折叠或打开
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char HI_U8;
typedef unsigned short HI_U16;
typedef unsigned int HI_U32;
typedef signed char HI_S8;
typedef char * HI_PS8;
typedef short HI_S16;
typedef int HI_S32;
typedef int * HI_PS32;
#define MK_PROC_MAX_WIFI_AP_SIZE (10)
typedef struct _HI_DEV_WIFI_SCANNING_S
{
HI_U32 u32Size; //结构体的大小
HI_U32 u32ApNum; //* 第几个ap */
HI_U32 u32Frequency; //频率
HI_U32 u32CurrentUsed; //* 是否正在使用
1:正在使用 0:未使用 */
HI_U32 u32SignalQuality; //* 信号质量 */
HI_U32 u32BitRate; //* 传输速度(比特率) */
char szEssid[32]; //* essid */
char szProtocol[16]; //ap
support protocol
char szMacAddr[32]; //* mac
addr */
HI_U8 u8Mode; //mode 0:Auto
1:Managed 2:Ad-Hoc ...
HI_U8 u8IsEncrypt; //*是否加密1:加密
0:不加密*/
HI_U8 u8EncrypType; //*网络加密方式0:NONE
1:WAP 2:WAP2 3:WEP */
HI_U8 u8AuthMode; //* 认证模式
0:NONE 1:EAP 2:PSK 3:OPEN
4:SHARED*/
HI_U8 u8SecretKeyType; //密钥管理方式 0:none
1:AES 2:TKIP
HI_U8 u8Res[7];
}HI_DEV_WIFI_SCANNING_S,*LPHI_DEV_WIFI_SCANNING_S;
static void enable_softap_scanning(void)
{
system("iwpriv ra0 set SiteSurvey"); //开启ap扫描功能
sleep(2);
}
//*网络加密方式0:NONE
1:WAP 2:WAP2 3:WEP */
// 4:other
static int get_ap_security_type(char *buf)
{
int type = 0;
if (buf == NULL) return -1;
if (strstr(buf, "WPA2") != NULL)
type = 2;
else if (strstr(buf, "WPA") != NULL)
type = 1;
else if (strstr(buf, "WEP") != NULL)
type = 3;
else if (strstr(buf, "NONE") != NULL)
type = 0;
else
type = 4;
return type;
}
int _softap_get_scan_res(HI_DEV_WIFI_SCANNING_S *stScanInfo)
{
FILE *fp;
char buf[256] = {0};
int findFlag = 0;
int index = 0;
char chBuf[4] = {0}, ssidBuf[32] = {0}, macBuf[32] = {0},
athBuf[32] = {0}, sigBuf[16] = {0}, wBuf[8] = {0},
extBuf[8] = {0}, ntBuf[4] = {0};
enable_softap_scanning();
if((fp = popen("iwpriv
ra0 get_site_survey", "r")) == NULL) //获取ap扫描结果
{
printf("open cmd: iwpriv ra0 get_site_survey fail!\n");
return -1;
}
while(fgets(buf, sizeof(buf), fp) != NULL)
{
if(!findFlag && strstr(buf, "Ch") != NULL)
{
findFlag = 1;
continue;
}
if (findFlag)
{
if(sscanf(buf, "%s
%s %s %s %s %s %s %s\n",chBuf,ssidBuf,macBuf,athBuf,\
sigBuf,wBuf,extBuf,ntBuf) != 8)
{
continue;
}
if ((strcmp(ssidBuf, "") == 0) ||
(strcmp(ssidBuf, "CMCC-AUTO") == 0) ||
(strcmp(ssidBuf, "CMCC-WEB") == 0) ||
(strcmp(ssidBuf, "CMCC-FREE") == 0) ||
(strcmp(ssidBuf, "CMCC") == 0) ||
(strcmp(macBuf, "") == 0) ||
(strcmp(athBuf, "") == 0) ||
(atoi(sigBuf) <= 0))
{
continue;
}
else
{
int security_type = 0;
if ((security_type = get_ap_security_type(athBuf)) < 0)
continue;
strncpy(stScanInfo[index].szEssid,ssidBuf,32);
strncpy(stScanInfo[index].szMacAddr,macBuf,32);
stScanInfo[index].u32SignalQuality = atoi(sigBuf);
stScanInfo[index].u32CurrentUsed = 0;
stScanInfo[index].u8EncrypType = security_type;
++index;
if (index >= MK_PROC_MAX_WIFI_AP_SIZE)
break;
}
}
}
pclose(fp);
return index;
}
static void show_ap(HI_DEV_WIFI_SCANNING_S *stScanInfo,int count)
{
int index = 0;
printf("%-4s%-32s%-32s%-8s%-8s\n","id","ssid","essid","sig","sec");
for (index = 0; index < count; index++)
{
#if 0
printf("%*d,ssid[%*s],essid[%*s],signal[%*d],type[%*d]\n",4,index,
32,stScanInfo[index].szEssid,
32,stScanInfo[index].szMacAddr,
4,stScanInfo[index].u32SignalQuality,
4,stScanInfo[index].u8EncrypType);
#else
printf("%-4d%-32s%-32s%-8d%-8d\n",index,
stScanInfo[index].szEssid,
stScanInfo[index].szMacAddr,
stScanInfo[index].u32SignalQuality,
stScanInfo[index].u8EncrypType);
#endif
}
}
int main(int argc,char *argv[])
{
HI_DEV_WIFI_SCANNING_S stScanInfo[MK_PROC_MAX_WIFI_AP_SIZE];
int ap_count = 0;
ap_count = _softap_get_scan_res(stScanInfo);
show_ap(stScanInfo,ap_count);
return 0;
}
对 fgets 函数有疑惑的请看:fgets函数的理解
测试结果:
相关文章推荐
- 树莓派学习笔记——Wifi AP热点模式 使用RT5370
- android通过反射获取wifi热点ap的ssid和password
- 关于wifi AP模式(热点Hotpot) ip地址的相关信息
- <WIFI>wifi工作模式的获取和设置为AP模式(基于SDK)
- 无线热点(WifiAP)的新建与连接
- Android系统信息获取 之十四:获取WIFI热点相关信息
- Win7无线网卡开软ap的方法 | 建立WIFI热点 [图文教程]
- ad-hoc,软ap(windows无线网卡制作WIFI热点)
- xp下如何用无线网卡做ap wifi热点。手机连电脑wifi上网
- arm wifi ap热点功能
- [技术贴]网络共享与便携式WiFi热点之USB绑定模式
- 怎样用笔记本的无线网卡做一个AP 实现笔记本做wifi热点供手机、平板电脑wifi上网而不用无线路由器
- Android开发周围wifi热点和属性的获取
- ios获取当前wifi热点信息
- hostapd实现WIFI 热点(AP)
- linux下架设wifi无线热点(虚拟ap/softAP)
- [置顶] ifup-wlan脚本解析(wifi启动STA或是AP模式)
- 将Win7配置为无线路由器(WIFI热点、接入点AP)
- Win7系统搭建WiFi热点详细攻略(遇到的各种问题的解决办法如:手机始终显示正在获取IP)(没有第三方软件)
- wifi共享与AP模式?