检测wifi是否需要portal验证 公共场所wifi验证
2015-07-29 13:22
369 查看
何为wifi portal验证?
平时在商场,咖啡厅,银行等公共场所,我们手机提示:有可用WLAN。这些WIFI可以直接连接,不需要密码,但需要我们手动在手机网页上进行验证,一般是输入一个手机号码,点击获取验证码或密码,服务器会发一条短信验证码或密码到手机上,将其输入网页的密码框,登陆即可使用免费wifi。这个验证的网页称为portal(翻译:门,入门,表示要使用这个公共wifi,就要先“进入”这个门,也就是验证的意思)。
案例
有些手机监听到用户连接wifi时,如果这个wifi是需要进行portal验证的话,就会自动弹出一个界面(或启动一个浏览器),这个界面里面有一个验证网页,给用户进行wifi验证,这样就不用用户手动去打开浏览器进行验证,提高用户体验。但有些手机就偏偏不会自动弹出这个验证页面。那么,如果你公司开发一款app,需要自动弹出这个wifi portal验证界面(针对于某些不会弹出验证界面的系统),那怎么办呢?
目标
我们的目标很明确:就是要在wifi连接后,判断wifi是否需要portal验证?如果需要portal验证,那么我们直接启动一个intent去发起随意一个网页的访问,如:http://www.baidu.com。此时,portal服务器会检测到有新的用户连接,就会劫持用户的wifi路由,强制去访问wifi的portal验证网页(类似过滤器),用户只要在这个网页上完成验证,即可使用wifi。
实现
下面的代码块是抽取于android源码里的一个方法,该方法就是检测当前手机连接的wifi是否需要进行portal验证。一般这个方法都是放在wifi连接状态发生变化的广播接收器里面。
这个实现很简单,谷歌会进行一个http的访问,如果返回码为204,就证明手机当前连接的wifi,是不需要进行portal验证的。否则,则需要进行portal验证。
至于为什么会是204,这个暂时没研究,知道的朋友可以留言告诉我一下。
平时在商场,咖啡厅,银行等公共场所,我们手机提示:有可用WLAN。这些WIFI可以直接连接,不需要密码,但需要我们手动在手机网页上进行验证,一般是输入一个手机号码,点击获取验证码或密码,服务器会发一条短信验证码或密码到手机上,将其输入网页的密码框,登陆即可使用免费wifi。这个验证的网页称为portal(翻译:门,入门,表示要使用这个公共wifi,就要先“进入”这个门,也就是验证的意思)。
案例
有些手机监听到用户连接wifi时,如果这个wifi是需要进行portal验证的话,就会自动弹出一个界面(或启动一个浏览器),这个界面里面有一个验证网页,给用户进行wifi验证,这样就不用用户手动去打开浏览器进行验证,提高用户体验。但有些手机就偏偏不会自动弹出这个验证页面。那么,如果你公司开发一款app,需要自动弹出这个wifi portal验证界面(针对于某些不会弹出验证界面的系统),那怎么办呢?
目标
我们的目标很明确:就是要在wifi连接后,判断wifi是否需要portal验证?如果需要portal验证,那么我们直接启动一个intent去发起随意一个网页的访问,如:http://www.baidu.com。此时,portal服务器会检测到有新的用户连接,就会劫持用户的wifi路由,强制去访问wifi的portal验证网页(类似过滤器),用户只要在这个网页上完成验证,即可使用wifi。
实现
下面的代码块是抽取于android源码里的一个方法,该方法就是检测当前手机连接的wifi是否需要进行portal验证。一般这个方法都是放在wifi连接状态发生变化的广播接收器里面。
private boolean isWifiSetPortal() { final String mWalledGardenUrl = "http://clients3.google.com/generate_204"; final int WALLED_GARDEN_SOCKET_TIMEOUT_MS = 10000; HttpURLConnection urlConnection = null; try { URL url = new URL(mWalledGardenUrl); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setInstanceFollowRedirects(false); urlConnection.setConnectTimeout(WALLED_GARDEN_SOCKET_TIMEOUT_MS); urlConnection.setReadTimeout(WALLED_GARDEN_SOCKET_TIMEOUT_MS); urlConnection.setUseCaches(false); urlConnection.getInputStream(); return urlConnection.getResponseCode() != 204; } catch (IOException e) { //e.printStackTrace(); return false; } finally { if (urlConnection != null) { urlConnection.disconnect(); } } }
这个实现很简单,谷歌会进行一个http的访问,如果返回码为204,就证明手机当前连接的wifi,是不需要进行portal验证的。否则,则需要进行portal验证。
至于为什么会是204,这个暂时没研究,知道的朋友可以留言告诉我一下。
相关文章推荐
- QQuickImageProvider在QML设计中的应用
- Ubuntu 14.04 x64 安装 Android SDK(转载)
- Zeroc Ice 3.5.1 生成 vs2015 c++ 版本库
- c# Winform/WPF 开发分屏显示应用程序
- 为学IOS,进击中...之OC多态练习
- 编码之痛(下)一个文件的旅行
- 【ITOO高校云平台】——WCF配置文件
- ElasticSearch的多索引和多类别
- hadoop单机环境配置
- 【转】为什么不应该使用ZooKeeper做服务发现
- OAuth认证 / 与新特性页面的配合使用
- 深度学习 caffe 建自己的数据库 训练一个自创卷积神经网络 过程总结
- N - Picture - poj 1177(扫描线求周长)
- 使用CSS样式position:fixed水平滚动的方法
- HDU 1076 An Easy Task
- 一款很漂亮的CSS3登录界面
- Hadoop集群搭建
- 欢迎使用CSDN-markdown编辑器
- windows 10预览版升级win10 7月29 10240.16384
- #238 (div.2) A. Gravity Flip