手机连接wifi自动弹窗的原理及其实现方案
一、手机连上wifi后会自动弹窗的原理
生活中,有很多需要认证的路由器,手机连接wifi热点后会自动弹出一个网页,让用户输入账号和密码,比如星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室。其实这是一种叫强制门户认证的技术--Captive Network。就是说,单用户连上一个wifi后,可以不需要输入wifi的密码,但是需要进行认证才能够访问到互联网。这种路由器有很多开源的软件,比如wifidog、openwrt等。但是他们的原理都是一样的,通过iptable跳转,DNS拦截,和HTTP重定向,甚至有的会采用网页重构,最后无论用户输入任何域名,任何URL,任何IP地址,都会被强制指定到某一个网页上去。
补充解释(DNS拦截简单的说,就是对IP地址的绑架,让DNS解析成WEB开发者想要让用户访问的IP地址,这样就实现了对IP的绑架。而HTTP重定向是把当前请求的网页转移到另一个不同的网页,虽然用户不知道自己访问的网页已经发生了重定向,但是HTTP头会记录下这一切,重定向后的网页返回的HTTP状态是30X。网页重构是通过JS进行网页的重定向,但是不会改变HTTP头的状态。)
所以,手机只要在连上wifi后,就去向互联网发起一次请求(不同的手机有不同的请求地址,比如苹果手机请求的是www.apple.com,而原版的安卓手机请求的是client3.google.com,但是这些请求的网址,不同的手机厂商自己可以通过修改Android的内核进行修改的,不是绝对的,有的手机甚至直接阉割了这个原版安卓的功能,有的则对这个功能进行了限制使用)。如果返回的网页是被重定向过的,也就是HTTP头的状态是30X的,手机就会认为这个wifi需要强制认证,因此会弹出浏览器,重新发起一次请求。这就是手机连上wifi后会自动弹窗的原理。
二、实现方案
如果要做一个可以让手机连上wifi后会自动弹窗网页的wifiAP热点,那么就要按照上面原理说的,要让手机第一次发起的请求返回的HTTP头状态变为30X。
这里因为RTK没能够连接到外网,所以需要自己移植一个DNS服务器到RTK上,进行域名的解析,并对IP地址进行绑架,这个原理跟iptable是一样的。我这里移植了一个最新的开源DNS服务器,bind.9.10.tar.gz 域名解析服务器。移植过程都是一样的,官网下载源码,然后解压缩,进行交叉编译,最后安装,然后拷贝到RTK开发板上。需要说的是DNS的配置问题,怎么把所有的域名都解析为一个固定的IP呢,其实很简单,DNS的配置规则书写也是比较简单的。只需要在配置文件的named.conf中加入这样一条规则:
“@ IN SOA ns.domain.com.
hostmaster.domain.com.
( 1 3h 1h 1w 1d )
IN NS 172.16.31.1
* IN A 172.16.31.1”
表示让所有的域名都指向172.16.31.1这个IP地址,* 号表示所有域名。就是这么简单。
PS:其实如果RTK能够连上外网,外网有好多专业的DNS域名解析服务器,等解析回来的IP地址后,利用iptable对IP地址进行跳转,也是一样能够绑架IP的,但是这里RTK不能够上网,所以之前移植的iptable的作用不大。但是加上iptable的跳转也是可以的,如果遇到不安分的用户,随意输入IP地址,这时候iptable就可以进行IP跳转了。
接着,DNS把域名都强制解析为RTK的本机地址,172.16.31.1。这个时候,RTK上的web服务器就要发挥威力。web服务器都有一个模块功能,叫rewrite,就是重写网页的意思,专业名字叫HTTP的重定向,就是这个模块起的作用。所以,在web服务器的配置脚本中,把rewrite模块的注释去掉,因为web服务器,无论是apache,lighttpd都是默认不开启这个功能的,因为这个功能是在服务器进行维修的情况下,让请求都转移到备份服务器去才用得上,所以普通的web是没有开启的。但是我们恰恰要利用他的这个功能,就是要他发生重定向。所以这个功能必须启动。然后在配置文件的最后添加这样一段语句:
“#$HTTP["host"] ="^(!=a.html)" {
# url.redirect = (
# "^/(.*)" => "/index.html"
# )
#}”
告诉服务器,如果请求不是访问的a.html这个网页,就让他跳到index.html这个网页上,而index.html就是RTK的网页。这样,就实现了网页的跳转了。
三、存在的问题
通过上面的原理的介绍,不难发现,如果手机连上wifi后不主动请求,那么web服务器就不会提供服务,那手机就不会弹出网页。或者有些手机的软件做一些限制,比如在手机上通过还有一个智能识别软件,如果这个热点不能够访问外面,那就不弹出,甚至有的手机还直接做成,不能连接外网的热点,就不显示出来,直接屏蔽掉了。所以,最终能不能弹出网页,很大程度上得看手机厂商的脸色。如果他们把这个功能阉割了,那就永远都无法弹窗,因为手机都没有去请求服务器。所以这种情况就得用户在连上wifi后,自动手动在点击一下手机上的浏览器,发起请求,然后被RTK上的DNS拦截,进而发生HTTP重定向。
手机连接wifi自动弹窗的原理及其实现方案的更多相关文章
- 手机连接WiFi有感叹号x怎么回事?如何消除手机WiFi感叹号?
经过多年的革新,现在的安卓系统已经非常优秀了,某些程度已经超越iOS,卡顿和耗电也不再是安卓系统的代名词了.而为了体验到最优秀的安卓系统,不少人都会购买海外的手机,因为海外手机的安卓系统都比较精简,非 ...
- 为什么手机连接wifi会显示已停用?
1.通常导致手机连接WiFi显示“已停用”故障的原因是由于无线路由器“安全模式”设置不当造成的,对此我们可以通过以下方法来解决: 2.根据无线路由器背面的信息(包括路由器IP地址,登陆用户名和密码), ...
- 在电脑上查看小米手机连接wifi时保存的密码
手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...
- 【Android开发—智能家居系列】(三):手机连接WIFI模块
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有 ...
- 设置完代理IP,手机连接WiFi时连不上,一直在转
fiddler抓包,设置代理后,会出现手机连不上网的情况,针对这个情况处理方式为: 首先如果已经连接上WiFi了,但是提示“不可上网”,那就把WiFi断开重新连接下. 不行的话就试试下面的办法 一.配 ...
- 手机连接wifi 访问本地服务器网站
手机连本地wifi后访问 http://192.168.155.1:8001/loc 版权声明:本文为博主原创文章,未经博主允许不得转载.
- 手机连上wifi热点后自动弹窗的功能
使用buildroot编译bind DNS服务器 用buildroot来制作文件系统很方便,编译出来的文件系统是直接可用的,不用添加脚本等麻烦的工作,很多的库和app都可以直接添加到文件系统里边,如常 ...
- Android wifi 从连接态自动断开的解决办法(dhcp导致)【转】
本文转载自:http://blog.csdn.net/DKBDKBDKB/article/details/38490201 对wifi部分的代码流程已经看了段时间,前两天终于解决了工作中遇到的一个wi ...
- 最新发布树莓派2代Wi-Fi自动连接实战(适合初学者)
话说天地会珠海分舵在上几天才刚给大家分享了个海外资讯说树莓派2已经发布且Windows10加盟之类的资讯,具体请查看<海外优秀资讯抢先看8 - Windows 10 for Raspberry ...
随机推荐
- 图片_ _Android有效解决加载大图片时内存溢出的问题 2
Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或 setImageResource或 Bit ...
- SPR EAD NET 6
SPR EAD_NET6 下载地址 http://www.gcpowertools.com.cn/downloads/trial/Spread.NET/EN_SPREAD_NET6_SETUP_RA_ ...
- IIS6.0中布署MVC站点(转)
昨晚我写的API上线,API是vs2010 + MVC4开发的,需要布署到windows 2003 server + IIS6.0的环境中,之前一直是布在IIS7.0,比较熟悉, 换到IIS6.0,添 ...
- JAVA继承时this和super关键字
JAVA继承时this和super关键字 本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数. 在子类中指定this关键字.首先在本类中查找,如果本类中找不到,再在父 ...
- python学习笔记——异常
转自 http://www.cnblogs.com/rubylouvre/archive/2011/06/22/2086644.html Python内建异常体系结构 BaseException +- ...
- [ASP.NET]ASP.NET数据绑定菜单控件
public void BindMenu(Menu mn,MenuItem menu,string mainMenu,string sql) { MenuItem mitem = null; DB d ...
- 临时改GCC编译器,重启后失效
临时改GCC编译器,重启后失效.例如,用如下命令: export CROSS_COMPILE= <gcc 文件所在的目录>/arm-linux-gnueabihf- 本例中使用的命令如下: ...
- JS入门-慕课网
javascript是一种弱类型的数据交互语言, ch 1 数据类型 js中有六种数据类型:nunmber.string.boolean.null.undenfined.object原始类型:numb ...
- sqlserver 常用sql语句
SELECT COUNT(*) FROM WeixinUser SELECT COUNT(*) FROM WeixinUser WHERE datediff(day, CreateTime,getda ...
- [codevs5578][咸鱼]tarjan/结论题
5578 咸鱼 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...