首页 > 编程语言 >stm32采集烟雾和温湿度+ESP8266转发解析+python构造http

stm32采集烟雾和温湿度+ESP8266转发解析+python构造http

时间:2024-04-11 15:45:43浏览次数:23  
标签:return ESP8266 int 温湿度 server http Serial sensor String

   

https://www.cnblogs.com/gooutlook/p/16061136.html

 

 

http://192.168.1.103/Control_SensorPin?sensor=sensor_all&action=GetData

  

python

# -*- coding:utf-8 -*-
import requests
import urllib.parse
#pip install requests


def SendHttp():
    #http://192.168.1.103/Control_SensorPin?sensor=sensor_all&action=GetData 
    ip="192.168.1.103"
    values = {'sensor': 'sensor_all','action': 'GetData'}
    #将POST值URL编码
    data = urllib.parse.urlencode(values)
    url = "http://"+ip+"/Control_SensorPin?"+data
    req = requests.get(url)
    rec_msg=req.content.decode()
    if rec_msg=="":
        rec_msg="error"

    print(rec_msg)  # 返回字节形式
    return rec_msg

rec_msg=SendHttp()

  

esp解析

 

#include <SoftwareSerial.h>
SoftwareSerial portOne(D2, D1);//rx  tx
//SoftwareSerial portTwo(D8, D7);// rx  tx
 
#include <ESP8266WiFi.h> 
  
#include <ESP8266WebServer.h> 
  
#include <FS.h> 
  
ESP8266WebServer server (80); 
 
//连接或者要辐射的wifi信息
//String wifiName = ("ESPWIFI_"+(String)ESP.getChipId());  // 2 设置WIFI名称
String wifiName = "yaoyao";  // 2 设置WIFI名称
String password ="love123456"; // 需要连接的wifi热点密码 
 
//登录账号密码
String LoginName="admin";
String LoginPwd="admin";
 
//工作模式
String work_mode="STA";//AP自己辐射wifi  STA 链接wifi
//本机ip 会自动修改
String LocaIP="192.168.1.1";//跳转使用
 
int CanPost=1;//记录本次请求是否处理完毕
 
/**
 *  网页系统API
 * 根据文件后缀获取html协议的返回内容类型
 */ 
  
String getContentType(String filename){ 
  
  if(server.hasArg("download")) return "application/octet-stream"; 
  
  else if(filename.endsWith(".htm")) return "text/html"; 
  
  else if(filename.endsWith(".html")) return "text/html"; 
  
  else if(filename.endsWith(".css")) return "text/css"; 
  
  else if(filename.endsWith(".js")) return "application/javascript"; 
  
  else if(filename.endsWith(".png")) return "image/png"; 
  
  else if(filename.endsWith(".gif")) return "image/gif"; 
  
  else if(filename.endsWith(".jpg")) return "image/jpeg"; 
  
  else if(filename.endsWith(".ico")) return "image/x-icon"; 
  
  else if(filename.endsWith(".xml")) return "text/xml"; 
  
  else if(filename.endsWith(".pdf")) return "application/x-pdf"; 
  
  else if(filename.endsWith(".zip")) return "application/x-zip"; 
  
  else if(filename.endsWith(".gz")) return "application/x-gzip"; 
  
  return "text/plain"; 
  
} 
  
/* NotFound处理
 * 用于处理没有注册的请求地址 
 */ 
  
void handleNotFound() { 
  
  String path = server.uri(); 
  
  Serial.print("load url:"); 
  
  Serial.println(path); 
  
  String contentType = getContentType(path); 
  
  String pathWithGz = path + ".gz"; 
  
  if(SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)){ 
  
    if(SPIFFS.exists(pathWithGz)) 
  
      path += ".gz"; 
  
    File file = SPIFFS.open(path, "r"); 
  
    size_t sent = server.streamFile(file, contentType); 
  
    file.close(); 
  
    return; 
  
  } 
  
  String message = "File Not Found\n\n"; 
  
  message += "URI: "; 
  
  message += server.uri(); 
  
  message += "\nMethod: "; 
  
  message += ( server.method() == HTTP_GET ) ? "GET" : "POST"; 
  
  message += "\nArguments: "; 
  
  message += server.args(); 
  
  message += "\n"; 
  
  for ( uint8_t i = 0; i < server.args(); i++ ) { 
  
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n"; 
  
  } 
  
  server.send ( 404, "text/plain", message ); 
  
} 
 
/* 引脚更改处理
 * 访问地址为htp://192.162.xxx.xxx/  返回主页面
 */ 
 
  
void handleMain() { 
  
  /* 返回信息给浏览器(状态码,Content-type, 内容)
  
   * 这里是访问当前设备ip直接返回一个String
  
   */ 
  
  Serial.print("handleMain"); 
  
  File file = SPIFFS.open("/index.html", "r"); 
  
  size_t sent = server.streamFile(file, "text/html"); 
  
  file.close(); 
  
  return; 
  
} 

  

//控制页面-本机处理函数
void handle_PinControl_DoMySelf(String action_)
{
   
   
   
}
// http://192.168.1.103/Control_SensorPin?sensor=sensor_all&action=GetData
String REC_comdata= "{\"Mq2\":0,\"red\":0,\"tem\":0,\"hum\":0,\"AlramMsg\":\"every is ok\"}";
// 控制页面请求函数处理 ESP数据给单片机,由单片机处理后返回数据
///Get_SensorData?action=all&sensor=all
void handle_PinControl() { 
 
  
  if(CanPost==1)
  {
    CanPost=0;
  }
  else
  {
    server.send ( 200, "text/html", REC_comdata);
    return;
  }
 
   
  if(server.hasArg("action") && server.hasArg("sensor")) { // 请求中是否包含有a的参数 
  
    String action = server.arg("action"); // 获得动作
    String sensor = server.arg("sensor"); // 获得传感器型号
    String ShowMsg =String()+"sensor-"+ sensor+"-action-"+action+";";
     
    Serial.println (ShowMsg); //电脑串口打印
   
    //根据传感器型号进行控制
      
    //本机处理
    if(sensor=="sensor_ESP"){
      handle_PinControl_DoMySelf(action);//调用本机函数处理
      server.send ( 200, "text/html", "消息本机处理:"+ShowMsg); // 返回数据 
      CanPost=1;
      return;
  
    }//转发单片机处理
    else{  //其他设备控制  
      
       //消息打包生成
       ShowMsg =String()+ sensor+"-"+action+";";
       //转发给单片机处理
        
       portOne.print(ShowMsg);
        
       //等待单片机回应消息
       //String REC_comdata;
       if (portOne.available()){
           //发送端是加了换行符发送的 不加 \n 会导致连续发送两行积累 所以解析段必须去除 \n 字符
           REC_comdata =portOne.readStringUntil(';');  
           //REC_comdata=REC_comdata.replace("\n","");
           Serial.print("Rec_arduino:");Serial.println(REC_comdata);
       }
       server.send ( 200, "text/html", REC_comdata);
       CanPost=1;
       return;
       
      
      }
       
  }
  else{
     
      server.send ( 200, "text/html", "action no found"); 
  } 
  
 
  
} 
 
 
//用来跳转页面
String GoUrl(String urlName){
  String ALLHtml=String("")+
    "<HTML>"+
    "<HEAD>"+
      "<meta HTTP-EQUIV=\'REFRESH\' content=\'0; url="+urlName+"\'/>"+
      "<TITLE>Success</TITLE>"+
    "</HEAD>"+
    "<BODY>"+
      "Success"+
    "</BODY>"+
  "</HTML>";
  return ALLHtml;
   
  }
  
void handle_Login(){
    
    
   if(server.hasArg("config")) { // 请求中是否包含有a的参数 
  
        String config = server.arg("config"); // 获得a参数的值 
        String RecLoginName;
        String RecLoginPwd;
         
    if(config == "on") { // a=on 
          if(server.hasArg("name")) { // 请求中是否包含有a的参数 
            RecLoginName = server.arg("name"); // 获得a参数的值
          }
          else{
            String backtxt= "请输入用户名" ;
            server.send ( 200, "text/html", backtxt);
            return;    
            }
            
          if(server.hasArg("pwd")) { // 请求中是否包含有a的参数 
            RecLoginPwd = server.arg("pwd"); // 获得a参数的值  
           }
 
          if(RecLoginName==LoginName && RecLoginPwd==LoginPwd){                 
            String backtxt= "成功登录! 名称:"+ RecLoginName  +"     密码:"+ RecLoginPwd ;
 
            Serial.print("handleMain"); 
  
            backtxt=GoUrl("http://"+LocaIP+"/index1_control.html");
            
   
            server.send ( 200, "text/html", backtxt);
            return;    
          }
          else{
            String backtxt= "失败登录,账号和密码错误!\n 名称:"+ RecLoginName  +"     密码:"+ RecLoginPwd ;
            server.send ( 200, "text/html", backtxt);
            return;   
             
            }
 
         
    }
  
    server.send ( 200, "text/html", "unknown action"); return; 
  
  } 
  
  server.send ( 200, "text/html", "action no found"); 
    
  }
 
//工作模式1 自身建立wifi等待连接
void Int_SetWIfi(String wifiName_,String password_){
   
  //LocaIP="192.168.1.1";
  IPAddress softLocal(192,168,1,1);   // 1 设置内网WIFI IP地址
  IPAddress softGateway(192,168,1,1);
  IPAddress softSubnet(255,255,255,0);
  WiFi.softAPConfig(softLocal, softGateway, softSubnet);
   
  //String wifiName = ("ESPWIFI_"+(String)ESP.getChipId());  // 2 设置WIFI名称
  const char *softAPName = wifiName_.c_str();
  WiFi.softAP(softAPName, password_);      // 3创建wifi  名称 +密码 adminadmin
   
  IPAddress myIP = WiFi.softAPIP();  // 4输出创建的WIFI IP地址
  Serial.print("AP IP address: ");     
  LocaIP=myIP.toString().c_str();
  Serial.println(LocaIP);
   
  Serial.print("softAPName: ");  // 5输出WIFI 名称
  Serial.println(wifiName_);
 
  }
 
//工作模式2 连接到wifi  获取ip访问
void Int_wificonnect(String wifiName,String password){
  int connectCount = 0; 
  WiFi.begin ( wifiName.c_str(), password.c_str() ); 
  while ( WiFi.status() != WL_CONNECTED ) { 
  delay ( 1000 ); 
    Serial.print ( "." ); 
    if(connectCount > 30) { 
      Serial.println( "Connect fail!" ); 
      break; 
    } 
    connectCount += 1; 
  } 
  if(WiFi.status() == WL_CONNECTED) { 
    Serial.println ( "" ); 
    Serial.print ( "Connected to " ); 
    Serial.println ( wifiName ); 
    Serial.print ( "IP address: " );
    //Serial.println ( WiFi.localIP() ); 
    LocaIP=WiFi.localIP().toString().c_str();
    Serial.println ( LocaIP ); 
      
    connectCount = 0; 
    } 
  }
 
 
  
void setup() {  
  
  // 日常初始化网络 
  
  pinMode(2, OUTPUT); 
  
  Serial.begin ( 9600 ); 
 
  portOne.begin(9600);//软串口1 单片机之间过高导致解析出错
   
  //portTwo.begin(9600);//软串口2 红外模块串口通信默认115200
 
  
   
  SPIFFS.begin(); 
  if(work_mode=="STA"){
  Int_wificonnect(wifiName,password);
  }
  else{
  Int_SetWIfi(wifiName,password);
  }
  
  
  server.on ("/", handleMain); // 绑定‘/’地址到handleMain方法处理  默认返回登陆网页
  server.on ("/login", HTTP_GET, handle_Login); // 处理登陆请求是否正确,然后跳转控制页面
  //http://192.168.1.103/Control_SensorPin?sensor=sensor_all&action=GetData
  server.on ("/Control_SensorPin", HTTP_GET, handle_PinControl); //处理控制页面的按键和滑动条请求
 
  server.onNotFound ( handleNotFound ); // NotFound处理 默认会返回登陆页面
  server.begin(); 
  
  Serial.println ( "HTTP server started" ); 
  
} 
  
     
  
void loop() { 
  
  /* 循环处理,因为ESP8266的自带的中断已经被系统占用,
  
   * 只能用过循环的方式来处理网络请求
  
   */ 
  
  server.handleClient(); 
  
} 

  

 

#include <SPI.h>
#include <Wire.h>

 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5); // RX, TX
 

 
//温湿度
#include "DHT.h"
#define DHTPIN 6
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
 
// 气体
int pin_jiu= A0;
int pin_mq135= A1;
int pin_mq2= A2;


float Humidity =0;
float Temperature =0;
int pin_jiu_Value = 0;
int pin_mq135_Value =0;
int pin_mq2_Value =0;

      
//============解析函数=================
  
//分割结果
#define sleng 3 //数组大小 比实际多一个
String split_result[sleng];//手动动态调整数组大小,保证数组可以满足容量
   
/*字符串分割
输入参数
String zifuchuan,  输入字符串
String fengefu,    分隔符号-可以是多个
String result[]    输出结果
    
*/
void Split(String zifuchuan,String fengefu,String result[])
 {
  int weizhi; //找查的位置
  String temps;//临时字符串
  int i=0;
  do
  {
      weizhi = zifuchuan.indexOf(fengefu);//找到位置
      if(weizhi != -1)//如果位置不为空
      {
          temps=zifuchuan.substring(0,weizhi);//打印取第一个字符
          zifuchuan = zifuchuan.substring(weizhi+fengefu.length(), zifuchuan.length());
          //分隔后只取后面一段内容 以方便后面找查
      }
      else
      {  //上面实在找不到了就把最后的 一个分割值赋值出来以免遗漏
         if(zifuchuan.length() > 0)
          temps=zifuchuan;
      }
    
      result[i++]=temps;
      //Serial.println(result[i-1]);//在这里执行分割出来的字符下面不然又清空了
      temps="";
   }
   while(weizhi >=0);
  }
  
  
// 根据消息解析,并生成指令返回
String DoWork_Response(String SensorName,String SensorAction){
   // 根据命令做控制
   // 解析1-传感器sensor_all 命令GetData 返回所有的数据
   if(SensorName=="sensor_all" && SensorAction=="GetData"){
   
//      // 湿度
//      float Humidity = dht.readHumidity();
//      // 温度
//      float Temperature = dht.readTemperature();
//     
//      if (isnan(Humidity) || isnan(Temperature) ){
//        Humidity=27;
//        Temperature=23;
//        }
//     
//         
//      //空气烟雾
//      int pin_jiu_Value = 1023-analogRead(pin_jiu);
//      int pin_mq135_Value = 1023-analogRead(pin_mq135);
//      int pin_mq2_Value = 1023-analogRead(pin_mq2);

 
           
      String SendMsg=String("")
                      +String(int(pin_jiu_Value)) +"-"
                      +String(int(pin_mq135_Value))+"-"
                      +String(int(pin_mq2_Value))+"-"
                      +String(int(Humidity))+"-"     
                      +String(int(Temperature))+"-"  
                      +";";                 
     return SendMsg;            
     
   }
   else{
 
      String SendMsg=String("")
                      +String(int(0)) +"-"
                      +String(int(0))+"-"
                      +String(int(0))+"-"
                      +String(int(0))+"-"     
                      +String(int(0))+"-"  
                      +";";                   
      return SendMsg; 
    }
 
 
      
}
 
 

 
 
void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  
  pinMode(pin_jiu, INPUT);//数字引脚初始化 
  pinMode(pin_mq135, INPUT);//数字引脚初始化 
  pinMode(pin_mq2, INPUT);//数字引脚初始化  
  
  dht.begin(); 
  Serial.println("go go go!");
   
 
   
}
 
 
 
 
 
void loop() {
  

 //收到串口命令
  if (mySerial.available()){
  
      //1 =========从串口获取命令 ;结尾  例子: sensor-on;
      String split_input =mySerial.readStringUntil(';');
      Serial.print("Recive_esp: ");Serial.println(split_input);
       
      //2 ========解析命令
      //2-0解析数据 sensor-on
      Split(split_input,"-",split_result);//分割调用
      //2-1打印消息 0-sensor  1-on
      for(int i=0;i<sleng;i++)
      {
        if(split_result[i]!="")
        {
         //Serial.println(String(i)+"-"+split_result[i]);
        }
          
     }
       
     String SensorName=split_result[0];//传感器类型/命令类型
     String SensorAction=split_result[1];//具体指令/要干什么
  
     //Serial.print(SensorName);Serial.print(" "); Serial.println(SensorAction);
     //3===========修改对象,根据命令做动作 生成返回报文
     String ResMsg=DoWork_Response(SensorName,SensorAction);
           
     //4 串口返回消息
     mySerial.print(ResMsg);// 换行符号影响下一次解析
     //不加 \n 会导致连续发送两行积累 所以解析段必须去除 \n 字符
 
     Serial.println(ResMsg);     
      
     
  }
 
  
      // 湿度
       Humidity = dht.readHumidity();
      // 温度
       Temperature = dht.readTemperature();
     
      if (isnan(Humidity) || isnan(Temperature) ){
        Humidity=27;
        Temperature=23;
        }
     
         
      //空气烟雾
       pin_jiu_Value = 1023-analogRead(pin_jiu);
       pin_mq135_Value = 1023-analogRead(pin_mq135);
       pin_mq2_Value = 1023-analogRead(pin_mq2);

 
           
//      String SendMsg=String("")
//                      +String(int(pin_jiu_Value)) +"-"
//                      +String(int(pin_mq135_Value))+"-"
//                      +String(int(pin_mq2_Value))+"-"
//                      +String(int(Humidity))+"-"     
//                      +String(int(Temperature))+"-"  
//                      +";";  
// 
//     Serial.println(SendMsg);     
 
   
 
}

  

标签:return,ESP8266,int,温湿度,server,http,Serial,sensor,String
From: https://www.cnblogs.com/gooutlook/p/18129380

相关文章

  • SpingBoot项目Tomcat假死,导致http(openfeign)请求无法响应问题定位
    项目简介:<spring-boot.version>2.3.2.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version>使用docker进行项目部署问题描述:项目中代码中大量使用异步多线程操作,没个异步过程中大量掺杂数据库查询、Redis查询、Feign调用、RabbitMq发送接收......
  • 网站使用nginx部署ssl证书开启https(开启http2)
    目录网站部署ssl证书就是将网站的http协议转换为更加安全的https协议1、腾讯云申请ssl证书2、下载证书3、xftp将下载的证书上传到服务器指定的目录下4、nginx配置对应域名的443端口,开启ssl5、nginx监听对应域名的80端口返回301强制重定向到该域名下的ssl443端口测试HTTP......
  • 将http转为https访问需要费用吗
    首先,需要了解http和https的概念的区别。http本身是一种超文本传输协议,目前是互联网在进行数据访问过程中最广泛运用的一种网络协议,http工作于客户端与服务器端之间。浏览器作为http客户端通过URL向http服务器端发送所有请求。Web服务器则根据接收到的请求,向客户端发送响应信......
  • 【报错】Error: https://registry.npmmirror.com.tgz: tunneling socket could not be
    报错信息:Error:https://registry.npmmirror.com/bytes/download/bytes-3.0.0.tgz:tunnelingsocketcouldnotbeestablished,cause=connectECONNREFUSED127.0.0.1:31181详细报错:Error:https://registry.npmmirror.com/bytes/download/bytes-3.0.0.tgz:tunnelingsoc......
  • python收到MQTT消息后再发http请求
    python收MQTT消息和 发http请求的代码在前面的文章都有介绍,这里直接上完整的功能代码mqtt2http.py#python3.6importloggingimportrandomimporttimeimportrequests#frompaho.mqttimportclientasmqtt_clientimportpaho.mqtt.clientasmqttBROKER='......
  • python发http请求
    第一步安装 requests 库pipinstallrequests python代码#导入requests库importrequests#目标URLurl="http://192.168.1.1/get.php?calltel=13941128888888"#发送GET请求response=requests.get(url)#检查请求是否成功ifresponse.status_code==20......
  • :error=>"Elasticsearch Unreachable: [http://192.168.100.44:9200/][Manticore::Soc
    [2024-04-10T14:02:09,005][WARN][logstash.outputs.elasticsearch]AttemptedtoresurrectconnectiontodeadESinstance,butgotanerror.{:url=>"http://192.168.100.44:9200/",:error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool......
  • Python异步HTTP客户端和服务器功能的底层库之httpcore使用详解
    概要httpcore库是一个提供异步HTTP客户端和服务器功能的底层库,它是许多高级HTTP客户端库的基础,如httpx。httpcore旨在提供一个快速、稳定且易于使用的HTTP组件。安装通过pip可以轻松安装httpcore:pip install httpcore特性异步支持:原生支持异步操作,提高I/O效率。......
  • 【转载 dudu】 HttpClient使用预热和长连接
    C#中HttpClient使用注意:预热与长连接最近在测试一个第三方API,准备集成在我们的网站应用中。API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpClient有了格外的关注。开始测试的时候,只在客户端通过HttpClient用Pos......
  • java中的远程调用http
    分享一下项目中用过的远程调用方法并总结两种请求方式的差别http远程调用一般分为两种get和post(其它方式暂不考虑)pom包<!--http远程调用--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifa......