需求:

1 获取当前连接客户端的HTTP请求各种信息

  1. 方法 get  http
  2. 请求路径  例如  /index.html   /    /pic.jpg
  3. 请求版本   HTTP/1.0     HTTP/1.1                           用于苹果WIFI连接判断,第二次请求是HTTP1.1 ,弹出认证窗口

工程组要调用了<ESP8266WebServer.h>文件

找到源码路径(无非是用户名"dongdong"替换)

C:\Users\dongdong\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\libraries\ESP8266WebServer\src

在我们的主线程里,每次有新的客户端来,都是

webServer.handleClient();

处理的。

追踪源码库

看不懂。

我们现在用的服务器库是集成了简单的http处理,首先来看一个简单的http单独的处理。

找到基本样例

void loop(void) {

  MDNS.update();

  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println("");
  Serial.println("New client");

  // Wait for data from client to become available
  while (client.connected() && !client.available()) {
    delay(1);
  }

  // Read the first line of HTTP request
  String req = client.readStringUntil('\r');

  // First line of HTTP request looks like "GET /path HTTP/1.1"
  // Retrieve the "/path" part by finding the spaces
  int addr_start = req.indexOf(' ');
  int addr_end = req.indexOf(' ', addr_start + 1);
  if (addr_start == -1 || addr_end == -1) {
    Serial.print("Invalid request: ");
    Serial.println(req);
    return;
  }
  req = req.substring(addr_start + 1, addr_end);
  Serial.print("Request: ");
  Serial.println(req);
  client.flush();

  String s;
  if (req == "/") {
    IPAddress ip = WiFi.localIP();
    String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
    s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>Hello from ESP8266 at ";
    s += ipStr;
    s += "</html>\r\n\r\n";
    Serial.println("Sending 200");
  } else {
    s = "HTTP/1.1 404 Not Found\r\n\r\n";
    Serial.println("Sending 404");
  }
  client.print(s);

  Serial.println("Done with client");
}

  

对比这个源码

要在 client.connected() && !client.available()之后进行接收数据

 String req = client.readStringUntil('\r');

读取http请求信息第一行,里面包含了我们需要的三个参数

GET /path HTTP/1.1

对应到<ESP8266WebServer.h>集成度更高的源码

解析请求参数的 _parseRequest函数单独封装

在同级文件夹

再单独的http解析例程里的代码是这样的,要在对应web库里面找到对应的

 // First line of HTTP request looks like "GET /path HTTP/1.1"
  // Retrieve the "/path" part by finding the spaces
  int addr_start = req.indexOf(' ');
  int addr_end = req.indexOf(' ', addr_start + 1);
  if (addr_start == -1 || addr_end == -1) {
    Serial.print("Invalid request: ");
    Serial.println(req);
    return;
  }
  req = req.substring(addr_start + 1, addr_end);
  Serial.print("Request: ");
  Serial.println(req);

  对应到web库

原来的库留有http版本的参数 但是  1.1版本 一直输出 1,截取的不完整,我们需要自己截取

人为添加一个变量requestVersion,首先头文件声明变量存在,一定要放在public区域(138行),否则会因为权限不能调用输出这个变量

打开头文件,在138行添加  String   requestVersion;

然后给这个参数赋值存版本信息

动作在源代码

最后在我们的程序里调用输出

在苹果手机请求认证触发的函数里面

执行输出,并用来判断是不是第二次请求认证(这一次需要把认证界面弹出来)

我的web类定义

ESP8266WebServer webServer(80);

所以对应是 webServer(类).requestVersion(类里面我们自己加的参数)

Serial.print("_currentVersion:");Serial.println(webServer.requestVersion);

  

连接上esp8266wifi,打开游览器访问

http://captive.apple.com/hotspot-detect.html

(模拟苹果自动请求认证上网)

请求触发ESP8266执行我们刚才那个函数,在里面打印当前的http参数

串口输出

这样根据IP判断是不是同一个苹果设备,统计次数,建立一个路由表,统计最近4个人(最多只能同时4个),单纯IP判断会有问题,万一丢了一次,三次回复给手机的认证顺序就乱了。

所以根据 HTTP的版本  1.1 确定这是第二次的访问,这一次就要把认证界面返回给手机网页,之后第三次就要返回success页面。

根据这个流程,就可以在源码里输出自己要的信息。

2 获取客户端的IP ,端口,MAC,总连接数目

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h> 

extern "C" {
#include<user_interface.h>
} 

/* configuration wifi */
const char *ssid = "COblaster"; 

ESP8266WebServer server(80);
bool wifiopen=1;

String HtmlCreat(String addstring){

  String newhtml=String()+"<!DOCTYPE html>\r\n "
  + "<html lang=\"zh-CN\"> \r\n"
  +" <meta http-equiv='Content-type' content='text/html; charset=utf-8'>\r\n"
  +"<title>  </title>\r\n"
  +"</head>\r\n"
  +"<body>\r\n"
  +addstring
  //+"<p> 显示一条文字信息! </p>\r\n"
  //+"<script type=\"text/javascript\">\r\n"  + " window.location = \"http://192.168.4.1/\";\r\n"+ "</script>\r\n"
  +"</body>\r\n"
  +"</html>";
  return newhtml;
  }

void handleRoot() {
    String newhtml=String()+"<script type=\"text/javascript\">\r\n"  + "setTimeout(\"alert("")\", 3000);" +" window.location = \"http://www.baidu.com/\";\r\n"+ "</script>\r\n";
    server.send(200, "text/html",HtmlCreat(newhtml) );
  //  server.send(200, "text/html", "<h1>You are connected</h1>");
    String addy = server.client().remoteIP().toString();
    Serial.println(addy);
    Serial.println(server.client().remotePort(),1);
    Serial.println("stopAll");
    server.client().stop();
    WiFi.softAPdisconnect(1);
    wifiopen=0;

}
void setup() {
    delay(1000);
    Serial.begin(115200);
    Serial.println();
    Serial.print("Configuring access point...");
    WiFi.softAP(ssid);
    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);
    server.on("/", handleRoot);
    server.begin();
    Serial.println("HTTP server started");
} 

void loop() {
    server.handleClient();
    delay(5000);
    client_status();
    delay(4000);
} 

void client_status() { 

unsigned char number_client;
struct station_info *stat_info; 

struct ip_addr *IPaddress;
IPAddress address;
int i=1; 

//number_client= wifi_softap_get_station_num();
String numbers_client=String( wifi_softap_get_station_num());
stat_info = wifi_softap_get_station_info(); 

Serial.print(" Total connected_client are = ");
Serial.println(number_client);
if(numbers_client.toInt()==0){ if(wifiopen==0){Serial.println(" go"); wifiopen=1;   WiFi.softAP(ssid);}}

while (stat_info != NULL) { 

//IPaddress = &stat_info->ip;
//address = IPaddress->addr; 

Serial.print("client= "); 

Serial.print(i);
Serial.print(" ip adress is = ");
Serial.print((stat_info->ip.addr));
Serial.print(" with mac adress is = "); 

Serial.print(stat_info->bssid[0],HEX);
Serial.print(stat_info->bssid[1],HEX);
Serial.print(stat_info->bssid[2],HEX);
Serial.print(stat_info->bssid[3],HEX);
Serial.print(stat_info->bssid[4],HEX);
Serial.print(stat_info->bssid[5],HEX); 

stat_info = STAILQ_NEXT(stat_info, next);
i++;
Serial.println(); 

}
delay(500);
}

  

esp8266 免费wifi强推广告神器(4) 发现当前WIFI下的用户数目,IP,MAC请求http信息 在用户请求跳转后跳转的更多相关文章

  1. esp8266 免费wifi强推广告神器(0) 项目介绍

    某宝产品 WIFI SSID广告终端路由推广宝 简单来说,手机连接免费wifi,自动弹出广告页面,有二维码和电话,点击电话直接打电话给商家客服,用户点击链接跳转到商家网页. 同时存在设置页面,使用者可 ...

  2. WiFi广告强推的基本技术原理和一些相关问题

    WiFi推原理(转) 本文地址:http://jb.tongxinmao.com/Article/Detail/id/412 WiFi广告强推的基本技术原理和一些相关问题 WiFi广告推送原理就是利用 ...

  3. 在Git上如何强推代码规范

    引言 最近参加了“前端规范制定topic”小组,小组成员一起制定了html.css.js.es6.vue和react等规范,但规范制定好了怎么进行推广去强制执行呢,已知我们的项目都是用git做管理的, ...

  4. ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。

    网页 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf ...

  5. 为免费app嵌入Admob广告

    为免费app嵌入Admob广告,进而获得广告收入. 1.http://www.admob.com/注册一个帐号, 添加Add Mobile Site/app,输入相关信息后,提交完成, 下载Andro ...

  6. git 强推本地分支覆盖远程分支

    git 强推本地分支覆盖远程分支git push origin 分支名 --force

  7. PyTorch Hub发布!一行代码调用最潮模型,图灵奖得主强推

    为了调用各种经典机器学习模型,今后你不必重复造轮子了. 刚刚,Facebook宣布推出PyTorch Hub,一个包含计算机视觉.自然语言处理领域的诸多经典模型的聚合中心,让你调用起来更方便. 有多方 ...

  8. 微信硬件平台(八) 3 ESP8266向微信服务器请求设备绑定的用户

    https://api.weixin.qq.com/device/get_openid?access_token=自己申请微信token&device_type=gh_e93c1b3098b9 ...

  9. 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑~帶你一次看懂!

    正文字体大小:大 中 小 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑-帶你一次看懂! (2017-02-21 10:57:48) 转载▼ 标签: wi-fi速度 手機wi- ...

随机推荐

  1. 使用mpvue开发小程序教程(三)

    在上一篇文章中,我们熟悉了一下通过vue-cli生成的mpvue工程代码骨架的基本结构,大致了解了每一个部分的代码到底要放到何处.从本文起我们就开始涉及真正的编码部分,学习使用Vue的语法去编写小程序 ...

  2. 微服务架构:Eureka参数配置项详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能 ...

  3. Java8之Optional类

    写在前头 今天再看阿里的Java开发手册,里面异常处理第10条提到这样一个建议. [推荐]防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景:1 ) 返回类型为基本数据类型,return 包 ...

  4. bisect模块(使用二分法将数据按顺序插入一个列表)

    bisect模块功能:使用二分法将数据按顺序插入一个列表 该模块主要有两个函数: 1.insort_right   ====>按从小到大顺序将数据插入一个列表 2.bisect_right    ...

  5. Django 系列博客(十)

    Django 系列博客(十) 前言 本篇博客介绍在 Django 中如何对数据库进行增删查改,主要为对单表进行操作. ORM简介 查询数据层次图解:如果操作 mysql,ORM 是在 pymysql ...

  6. [leetcode](4.21)4. 有效子数组的数目

    给定一个整数数组 A,返回满足下面条件的 非空.连续 子数组的数目: 子数组中,最左侧的元素不大于其他元素. 示例 1: 输入:[1,4,2,5,3] 输出:11 解释:有 11 个有效子数组,分别是 ...

  7. Spring学习心得--------bean-Factory

    在学习Spring框架的过程中发现,Spring中的bean不仅是对javabean的一种封装,让你可以通过beanfactoryAPI读取自己配置的beans.xml文件来实现javabean的设置 ...

  8. Pythoy 数据类型序列化——json&pickle 模块

    Pythoy 数据类型序列化--json&pickle 模块 TOC 什么是序列化/反序列化 pickle 模块 json 模块 对比json和pickle json.tool 命令行接口 什 ...

  9. 使用 babel-loader(webpack)

    参考: https://www.jianshu.com/p/d971bffff546 定位 Webpack 速度慢的原因 打包的命令webpack后加三个参数: --colors 输出结果带彩色,比如 ...

  10. APIO 2018游记

    并不是很想写游记 在考场上做了四个小时的T1T2,T3没开 出考场听zrz讲T3的时候差点气死 难度顺序为1 > 2 > 3什么鬼 不过最后还是出乎意料的混到了一块铜牌 两天的培训好评(虽 ...