WiFi-ESP8266入门http(3-1)网页认证上网-post请求(原教程)

教程:http://geek-workshop.com/thread-37484-1-1.html

源码:链接:https://pan.baidu.com/s/1yuYYqsM-WSOb0AbyAT0qrQ 密码:d8e8

本帖最后由 zyzand 于 2018-5-10 16:00 编辑

前段时间,学校发了通知,说寝室要安智能电表了,由原来的每月底后付费改成预付费,说是没余额会自动断电,通过微信平台查询和缴纳电费。打开查电费的界面看了一下,发现缴费的界面是需要在微信里才能打开的,但查询的界面能直接在普通浏览器打开:

<ignore_js_op>

(最近刚安装上,学校实行保电模式,所以暂时没电费也能用哈)

正好实验室有几块ESP8266和几块OLED。我想能不能拿ESP8266来显示当前的实时电费信息呢?这样就避免舍友吃鸡的时候突然断电的尴尬了。

电费信息的解析
研究了一下查询电费的方式,发现只要更改地址就能查到不同楼层的电费信息,返回的html的源码如下

<ignore_js_op>

代码还是比较短的,有1M内存的ESP8266完全能应付得来。
        思路也很简单,就只先用http库获取到网页源码,然后使用关键信息前后的字符截取出相应的信息。解析信息的方法如下。(代码可能写的不太规范,欢迎大神指点)

struct priceinf {
  float price;
  char timestr[20 * 7];
  int year;
  int month;
  int day;
  int hh;
  int mm;
  int ss;
  char lou[20];
  char qinshi[10];

};
/*
        返回信息解析
        传入:html代码
        返回:解析出来的信息(priceinf 结构体)
                未解析到则返回空的结构体
*/
priceinf getPrice(String s) {
  priceinf dat;
  int datStart = 0, datEnd = 0;
  String datstr;
  char buf[50];

  char datsign[] = "<span class=\"price\"";
  datStart = s.indexOf(datsign) + strlen(datsign) + 23;
  if (datStart == strlen(datsign) + 23 - 1) { //没有找到price
    memset(&dat, 0, sizeof(dat));
    return dat;
  }
  datEnd = s.indexOf("</span>", datStart) - 2;   //减2是为了减去字符“元”
  datstr = s.substring(datStart, datEnd);
  dat.price = datstr.toFloat();

  char timesign[] = "<font style=\"color:#2d9fd3\"><b>";
  datStart = s.indexOf(timesign) + strlen(timesign);
  datEnd = s.indexOf("</b></font>", datStart);   //结尾
  datstr = s.substring(datStart, datEnd);
  datstr.toCharArray(dat.timestr, 20);
  dat.timestr[19] = 0;

  dat.year = datstr.substring(0, 4).toInt();
  dat.month = datstr.substring(5, 7).toInt();
  dat.day = datstr.substring(8, 10).toInt();
  dat.hh = datstr.substring(11, 13).toInt();
  dat.mm = datstr.substring(14, 16).toInt();
  dat.ss = datstr.substring(17, 19).toInt();

  char lousign[] = "楼幢:";
  datStart = s.indexOf(lousign) + strlen(lousign);
  datEnd = s.indexOf("</p>", datStart);   //结尾
  datstr = s.substring(datStart, datEnd);
  datstr.toCharArray(dat.lou, 20);
  dat.lou[19] = 0;

  char qinshisign[] = "寝室号:";
  datStart = s.indexOf(qinshisign) + strlen(qinshisign);
  datEnd = s.indexOf("</p>", datStart);   //结尾
  datstr = s.substring(datStart, datEnd);
  datstr.toCharArray(dat.qinshi, 10);
  dat.qinshi[9] = 0;

  //Serial.println(s);
  Serial.print("time=");
  Serial.println(dat.timestr);
  Serial.print("price=");
  Serial.println(dat.price);
  Serial.print("lou=");
  Serial.println(dat.lou);
  Serial.print("qinshi=");
  Serial.println(dat.qinshi);
  Serial.println();
  return dat;
}

     这个函数能实现对截止时间,楼,寝室号,剩余电费的解析,并把解析到的信息储存在结构体里。

然后把信息用OLED显示出来,不过这块OLED默认是SPI的,而我用的ESP-01最多只有3个能自定义的io,完全不够用。所以要改成IIC接口。按照说明改一下背后的电阻,然后将RES接VCC,CS、DC接GND,这样D0就是SCL,D1是SDA了。分别连接到ESP8266的GPOP0和GPIO2上。
        把OLED 屏幕的软件IIC库导入到Arduino里,测试一下还挺好用。

其他功能
        到这里这个程序就基本完成了,难度不是很大。但感觉这个程序好简单啊,ESP8266的潜能还没全发挥出来,于是,当做练习,在这个程序里加入了SmartConfig,用来应对应对没有已知密码的wifi的情况,然后让他能开机时从指定网址先获取查询电费的网址,并能从指定网址进行OTA空中升级。这样就不止能查询自己的宿舍,并且就算送给别人用也能随时对程序进行修改。
获取查询网址和升级信息
        获取查询网址和升级信息的函数,为了方便可管理多个终端,在开机的时候会先获取本芯片的唯一SN号,然后程序会访问自己SN号对应的网址,这样就不用为每一个芯片单独烧写固件了,同一个固件就能去访问不同的网址:

int site_Get() {
  int ret = 0;
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    HTTPClient http;

    Serial.printf("[www.zyzand.com]Connect to www.zyzand.com...\n");
    http.begin("www.zyzand.com", 80, (String)"/IoT/clients/" + SN + "/index.php"); //HTTP
    int httpCode = http.GET();
    int i = 5;//重试次数
    while (i-- > 0 && httpCode != 200) {
      Serial.printf("[www.zyzand.com]code: %d Try again...", httpCode);
      delay(1000);
      httpCode = http.GET();
    }
    //从www.zyzand.com获取信息失败
    if (httpCode != 200) {
      Serial.printf("[www.zyzand.com] GET Fail!");
      ret = 2;
    }
    //成功则进行数据解析
    else  {
      Serial.println("[www.zyzand.com]GET data:");
      String payload = http.getString();
      Serial.println(payload);
      int nflag = payload.indexOf("\n");
      Serial.println(nflag);
      Serial.println(payload.indexOf("\n", nflag));
      dat1 = payload.substring(0, nflag);
      dat2 = payload.substring(nflag + 1, payload.indexOf("\n", nflag + 1));

      Serial.print("[www.zyzand.com]dat1 = ");
      Serial.println(dat1);
      Serial.print("[www.zyzand.com]dat2 = ");
      Serial.println(dat2);

      //OTA
      if (strcmp(dat1.c_str(), "updata") == 0) {
        OTA();
      }
    }
  }
  else {//WiFi连接失败
    Serial.print("[www.zyzand.com]WiFi failed\n");
    ret = 1;
  }

  //失败时的处理
  if (ret != 0) {
    dat1 = "zyzand.com";
    dat2 = (String)"/IoT/clients/" + SN + "/error/index.php";
  }
  return ret;
}

  在测试OTA空中升级的时候,遇到的问题值得提一下。开始时空中升级总是返回flash配置错误:

  1. Flash config wrong real

猜测是在编译固件时选择的Flash不对,我的ESP-01的flash型号是EN25Q80B-104,网上查了一下说是8Mbit(1M)的。于是在编译时选择Flash Size为1M(128k SPIFFS),这样再把编译好的固件上传到网站上就能空中升级了。
        
通过杭电i-hdu上网认证
        我所在的学校有校园免费wifi,连接是不需要密码的,但是连接后会自动跳转到一个网页,需要进行认证才能访问外网。一直对他的认证方法感兴趣,于是用Fiddler抓了一下包,发现用来认证信息的只是一个post请求,也不是很复杂。在电脑上模拟成功,用ESP8266试了一下,也成功通过。

/*
        通过i-HDU认证,请自己修改postDate中的学号和密码
*/
int hdulogin() {
  const char * host = "2.2.2.2";
  const int httpPort = 80;

  WiFiClient client;

  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return 1;
  }
  delay(10);
  String postDate = "opr=pwdLogin&userName=你的学号&pwd=学号对应的密码&rememberPwd=1";//将从串口接收的数据发送到服务器,readLine()方法可以自行设计
  if (postDate.length() && postDate != "0") {
    String data = (String)postDate;
    int length = data.length();

    String postRequest = (String)("POST ") + "/ac_portal/login.php HTTP/1.1\r\n" +
                         "Host: " + host + "\r\n" +
                         "Connection: Keep Alive\r\n" +
                         "Content-Length: " + length + "\r\n" +
                         "Accept: */*\r\n" +
                         "Origin: http://2.2.2.2\r\n" +
                         "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" + "\r\n" +
                         "User-Agent: zyzandESP8266\r\n" +
                         "\r\n" +
                         data + "\r\n";
    //Serial.println(postRequest);
    Serial.println();
    client.print(postRequest);
    delay(600);
    //处理返回信息
    String line = client.readStringUntil(‘\n‘);
    while (client.available() > 0) {
      line += client.readStringUntil(‘\n‘);
    }
    //  Serial.println(line);
    client.stop();
    if (line.indexOf("logon success") != -1 || line.indexOf("不需要") != -1) { //认证成功
      return 0;
    }
    else {
      return 2;
    }

  }
}

  最后自己焊接了个小板子,用AMS1117-3.3进行降压:
         <ignore_js_op> 
         <ignore_js_op>

原文地址:https://www.cnblogs.com/kekeoutlook/p/9615089.html

时间: 2024-08-02 10:27:06

WiFi-ESP8266入门http(3-1)网页认证上网-post请求(原教程)的相关文章

WiFi-ESP8266入门http(3-4)网页一键配网(1若为普通wifi直连 2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信

网页一键配网(1若为普通wifi直连  2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信 工程连接:https://github.com/Dongvdong/ESP8266_HTTP_WEB_MQTT/tree/master/MQTT_http 主要目标 网页动态配网 网页认证模式的WIFI也能让ESP8266上网 未来完善: 1 加入网页判断,若为网页认证WIFI需要手动文本框输入 学号和密码(简单) 修改html加入两个文本框和一个判断,用于返回消息 2 现在固定测试

突破PTU网页认证校园网开热点

人总有浮躁, 之前只是把脚本写好,没有实操过. [这是更新过的教程,保证只要按教程走一定可以--->运行成功] 教程可能有些生涩,需要一点耐心 ###ps:不保证热点不出现断网情况[此时手机WiFi关开一次既解决] 教程篇 所有所需文件的下载地址[请先下载] 链接:https://pan.baidu.com/s/1LutHPGTXssQ9dZciXIdWVA 提取码:fx9o 下载内容一共如图所示 1 安装一个运行软件 python-3.7.4-amd64.exe 一直点next知道完成安装[]

Shiro权限控制框架入门1:Shiro的认证流程以及基本概念介绍

前言:我在最开始学习Shiro这个框架时,在网上搜索到的一个介绍比较全面的教程是:<跟我学Shiro>系列教程.但是在我看了他写的前几篇文章后,我发现虽然他在这个系列教程中把shiro的一些特性介绍地非常全面详细,但是整个教程的叙述方式还是有很大缺陷的.文章与文章之间并没有很好地串联起来,每篇文章介绍的东西都过于分散了,如果是对shiro完全不了解的新手来看的话完全是一场噩梦.就像一个网友评价的这样: 看了看这个教程,看完之后都想放弃shiro了,完全看不懂,后来百度了很多别的资料才理解了sh

3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案基础篇(项目功能演示--GPRS )

2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案基础篇(项目功能演示--Wi-Fi ) 这节演示 STM32采集的温湿度数据通过GPRS模块传给手机APP,APP上有个开关按钮,发指令给GPRS模块,然后发给STM32. 注:GPRS的程序都做成的透传的,就是GPRS模块通过串口接收的数据直接发给服务器,然后服务器再发给手机..GPRS模块通过网络接收的数据直接通过串口发给单片机. 一,给GPRS模块下载程序 ①调整波动开关位置 然后 记得插手机卡 二,测试

3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(项目功能演示--远程升级WIFI模块程序)

2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(视频总揽) 为了节省时间,基础篇的基础内容不再叙述 , 原文地址:https://www.cnblogs.com/yangfengwu/p/10360618.html

1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)

首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 打开这个上位机 假设这个软件不是咱做的,IP什么信息都不知道,咱为了获取IP地址,咱不停的点击连接和断开 知道ip是 47.93.14.37以后咱设置一下过滤 ip.addr == 47.93.14.37 全部过滤出来了 咱清理软件的数据,同时断开上位机的连接,咱看一下这个上位机从一开始连接到发送和

3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(购买域名,域名绑定IP)

2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据) 因为安全连接是和域名绑在一块的,所以需要申请域名 有没有不知道域名是什么的,但是大家一定知道访问域名就是访问绑定在域名上的IP地址 域名有个好处就是一个域名可以绑定多个IP. 举个例子:百度的域名是https://www.baidu.com/ 然后咱访问这个域名就访问到了百度的服务器,但是百度的服务器肯定不是一个,因为一个服务器怎么够这么多人访问,所以会有多个服务器,每个服

wifi无线认证,802.1x认证上网方式详解

图片描述(最多50字) 这里,主要介绍一下802.1x认证上网: 1 802.1x认证上网简介802.1x认证上网是指在无线网络认证界面,点击相应的无线网络,弹出账户密码输入框,用户输入账号密码的一种认证方式. 2 802.1x认证上网应用场景企事业单位内部工作人员 3 802.1x认证上网的流程 3.1 打开WiFi设置,选择指定无线网络: 3.2 点击链接,弹出账户密码输入框:输入专属账户密码: 3.3认证成功,开始上网. 4 802.1x认证上网的应用价值 4.1 安全稳定,快捷方便: 4

网页版《2048游戏》教程 - 构建页面

1.     游戏标题 <2048>游戏的标题包含游戏名称.开始新游戏的按钮和游戏分数等三项内容. 创建游戏页面index.html: <!DOCTYPE html> <html > <head > < meta charset= "UTF-8"> < title>2048</title > < link rel= "stylesheet" type ="text/c