09-获取指定Wi-Fi信息

一、公共WIFI综述

现在很多公司都在做免费WIFI,车站、公交、地铁、餐厅,只要是人员密集流动的地方就有WIFI,免费WIFI从最初的网页认证方式也逐渐向客户端认证方式偏移。本文主要讨论iOS认证上网的解决方案。

iOS端WIFI应用的相关开发,主要存在以下问题:

  1. iOS系统WIFI相关的接口很少,大部分接口都是私有接口
  2. 在设备连接上WIFI,没有通过路由器认证前,如果关闭iOS自动弹出的Portal页面,iPhone的WIFI会自动断开
  3. 如何禁止iOS系统自动弹Portal页面
  4. 公共WIFI的名称确定及不确定时的处理办法

本文主要讨论在使用公开的API,即可以提交到App Store的应用。

二、基础信息获取

1. 获取网卡IP

 

+ (NSString *)localIPAddress

{

NSString *localIP = nil;

struct ifaddrs *addrs;

if (getifaddrs(&addrs)==0) {

const struct ifaddrs *cursor = addrs;

while (cursor != NULL) {

if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0)

{

NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];

if ([name isEqualToString:@"en0"]) // Wi-Fi adapter

{

localIP = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];

break;

}

}

cursor = cursor->ifa_next;

}

freeifaddrs(addrs);

}

return localIP;

}

2. 获取网卡信息

- (NSDictionary *)getWIFIDic

{

CFArrayRef myArray = CNCopySupportedInterfaces();

if (myArray != nil) {

CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));

if (myDict != nil) {

NSDictionary *dic = (NSDictionary*)CFBridgingRelease(myDict);

return dic;

}

}

return nil;

}

- (NSString *)getBSSID

{

NSDictionary *dic = [self getWIFIDic];

if (dic == nil) {

return nil;

}

return dic[@"BSSID"];

}

- (NSString *)getSSID

{

NSDictionary *dic = [self getWIFIDic];

if (dic == nil) {

return nil;

}

return dic[@"SSID"];

}

**注意事项**

 

在实际测试时,获取网卡信息**getWIFIDic**方法,在部分路由器上耗时很长(10秒以上),如果直接放在主线程中,会导致界面卡死。在认证相 关的应用中,会根据网卡上的BSSID(例如:以特定3d:e6:c3开头的即为本公司架设网络)来判断是否属于本公司的路由。SSID、BSSID若为 应用启动时必须获取的信息(我们公司的应用,就是这种),这个时候怎样处理呢?

放在异步线程,获取到网卡信息再初使化界面,这种方法依然会导致在某些路由器 下初次打开界面超长时间的等待,我们的处理方法是,如果3秒内能够获取到相应的配置信息,直接根据配置信息初使化界面,在超过3秒时,给予默认的假 WIFI信息,初使化界面。异步线程获取到真实的配置信息后,再重新更新界面。

三、认证过程中的棘手问题

1. Portal禁止弹出与WIFI自动关闭的问题

 

正常情况,用户使用iPhone手机连接带有Portal认证的路由器,在连接成功后,iOS系统会在已有列表中随机选择连接指定的网址(例 如:www.itools.info)以测试当前路由器是否需要Portal认证。在需要Portal认证的网络,系统会弹出Portal页面,这个时 候,如果用关掉portal页面,或者直接切换到其它应用,WIFI网络会直接自动断开(根本不给客户端认证机会^_^)。

我们的解决办法是路由器白名单,让路由器放行所有Portal测试的IP,以下为测试的域名:

www.appleiphonecell.com

captive.apple.com

www.itools.info

www.ibook.info

www.airport.us

对应的IP地址:

23.207.103.91

23.33.54.18

23.44.167.91

23.67.183.91

96.7.103.91

23.42.71.91

23.34.105.211

23.59.167.91

23.42.184.50

23.47.232.190

23.77.23.91

23.194.87.91

23.61.91.190

23.218.12.50

23.2.38.95

23.46.135.91

172.225.213.179

218.205.66.94

23.64.251.249

23.58.250.189

将以上所有IP加到路由器的白名单中,即可解决iPhone断开WIFI的问题,但是同时也不自动弹出Portal页面了,用户打开浏览器才会重定向到Portal页面。

2. WIFI名确定解决方法

 

如果公司部署的公共WIFI名确定的情况,就比较简单了,不需要配置上述白名单也可以保证WIFI不断开,具体办法是,在程序启动时,向iOS系统注册SSID,方法如下:

- (void)registerNetwork:(NSString *)ssid

{

NSString *values[] = {ssid};

CFArrayRef arrayRef = CFArrayCreate(kCFAllocatorDefault,(void *)values,

(CFIndex)1, &kCFTypeArrayCallBacks);

if( CNSetSupportedSSIDs(arrayRef)) {

NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();

CNMarkPortalOnline((__bridge CFStringRef)(ifs[0]));

NSLog(@"%@", ifs);

}

}

四、总结

时间: 2024-12-23 10:13:49

09-获取指定Wi-Fi信息的相关文章

python3获取指定目录内容的详细信息

不同平台获取指定目录内容的详细信息命令各不相同: Linux中可以通过ls -al获取获取 windows中可以通过dir命令获取 下面是我写的一个通用获取目录内容详细信息的python3脚本: #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os, time, sys from os.path import join, getsize def ListDir(dir_data): ''' :param dir_data: 指定获取内容

【转】MSSQL获取指定表的列名信息,描述,数据类型,长度

/* --作用:根据特定的表名查询出字段,以及描述,数据类型,长度,精度,是否自增,是否为空等信息 --作者:wonder QQ:37036846 QQ群:.NET顶级精英群 ID:124766907 --时间:2011-03-23 11:25 --描述:创建存储过程 --参数:@tableName 表名 */ CREATE PROC sp_GetListsColumnInfoByTableName( @tableName nvarchar(255)) AS BEGIN SELECT CASE

获取指定类上的@RequestMapping注解的请求信息

通过上一篇博客,我们能够轻松的得到制定类上的制定注解.现在,我们尝试获取指定类上的@RequestMapping注解,并获取该控制层的全部请求信息.在这里,提供一个实体类,用于存放请求的部分信息. public class RequestUrlInfo implements Comparable<RequestUrlInfo>{ private String name; //mapping的名称 private String value; //mapping的请求路径 private Requ

利用反射来实现获取成员的指定特性(Attribute)信息

在开发过程中,我们经常需要自定义一些特性,来辅助我们完成对对象或者枚举进行管理.我们需要知道如何获取对象使用的特性信息. 以下举个学习用的例子. 我们自定义一个特性类,这个特性设置在一个数据段内是否执行使用这个特性的方法,特性如下 [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] public class ExcuceAttribute : Attribute { public

微信网页授权认证获取用户的详细信息,实现自动登陆-微信公众号开发干货

原创声明:本文为本人原创作品,绝非他处转账,转载请联系博主 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开发公众号需要准备或了解什么 web开发工具:官方提供的开发工具,使用自己的微信号来调试微信网页授权.调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入和输出.下载地址:web开发工具下载 开发文档:https://mp.weixin.qq.com/wiki

百度地图的使用之获取数据库表中信息的坐标点显示在地图上

//通用封装好的js: var map = new BMap.Map("container"); //建树Map实例 var point = new BMap.Point(103.976032, 33.845509); // 建树点坐标 map.centerAndZoom(point, 6); // 初始化地图,设置中心点坐标和地图级别. //地图事件设置函数: map.enableDragging(); //启用地图拖拽事件,默认启用(可不写) map.enableScrollWhe

微信公众号开发之网页授权认证获取用户的详细信息,实现自动登陆

原创声明:本文转来源本人另一博客[http://blog.csdn.net/liaohaojian/article/details/70175835]绝非他人处转载 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开发公众号需要准备或了解什么 web开发工具:官方提供的开发工具,使用自己的微信号来调试微信网页授权.调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入

c# 获取指定目录下的所有文件并显示在网页上

参考文献: FileInfo 的使用  https://msdn.microsoft.com/zh-cn/library/system.io.fileinfo_methods(v=vs.110).aspx 网页表格的生成  http://www.w3school.com.cn/html/html_tables.asp C# 通过文件扩展名获取图标和描述 http://www.csframework.com/archive/2/arc-2-20110514-1478.htm   http://ww

(转)获取指定数据库和用户的所有表表名

import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Propert

Environment类,获取程序所在机器信息

一.属性 CommandLine  获取该进程的命令行.CurrentDirectory 获取或设置当前工作目录的完全限定路径.ExitCode 获取或设置进程的退出代码.HasShutdownStarted 获取一个值,该值指示公共语言运行时 (CLR) 是否正在关闭.Is64BitOperatingSystem  确定当前操作系统是否为 64 位操作系统.Is64BitProcess 确定当前进程是否为 64 位进程.MachineName  获取此本地计算机的 NetBIOS 名称.New