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 import time from multiprocessing import Process,Manager import json class Class_sensor_http: def __init__(self): pass def SendHttp(self,ip,dowhat): try: #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) #dowhat="Control_SensorPin" url = "http://"+ip+"/"+dowhat+"?"+data response = requests.get(url) # 返回网页内容 #print(response.text) rec_msg="" if response.content ==b'\x00': rec_msg="error" else: rec_msg=response.content.decode() return rec_msg except : print("read time out",ip) return "error" #print(response.status_code) # 获取响应状态码 200 #print(response.headers) # 获取响应头 {'Content-Type': 'text/html', 'Content-Length': '1', 'Connection': 'close'} #print(response.content) # 获取响应内容 b'\x00' #print(rec_msg) # 返回字节形式 def GetData(self,ip_,data_addr,share_data,lock): while True: if share_data[9]==1: print("http thread break.") break time.sleep(2) rec_msg1=self.SendHttp(ip_,"Control_SensorPin") #print("rec======",rec_msg1) if rec_msg1=="error": print("请检查设备链接",ip_) else: if rec_msg1 is not None: fengefu='-' a=rec_msg1.strip().split(fengefu) # x.strip()#除去每行的换行符 按照:分割 #print(a) id_ = "".join(a[5:6]).strip() # 去除空格 pin_jiu_Value = "".join(a[0:1]).strip() # 去除空格 pin_mq135_Value = "".join(a[1:2]).strip() # 去除空格 pin_mq2_Value = "".join(a[2:3]).strip() # 去除空格 Humidity = "".join(a[3:4]).strip() # 去除空格 Temperature = "".join(a[4:5]).strip() # 去除空格 if id_ is not None \ and pin_jiu_Value is not None \ and pin_mq135_Value is not None \ and pin_mq2_Value is not None \ and Humidity is not None \ and Temperature is not None: #print(data) data_list=[] data_list.append(id_) data_list.append(pin_jiu_Value) data_list.append(pin_mq135_Value) data_list.append(pin_mq2_Value) data_list.append(Humidity) data_list.append(Temperature) with lock: share_data[data_addr]=data_list ''' if __name__ == '__main__': #1初始化共享内存 manager=Manager() share_data=manager.dict()#存str类型数据 #用几个必须预先初始化 否则后面无法访问 share_data[1]='0'# share_data[2]=['0','0','0','0','0','0']# data share_data[3]=['0','0','0','0','0','0']# data share_data[9]=0#是否有语音解析结果 #2线程锁 保护多个线成对数据控制 lock=manager.Lock() p_sensor = Class_sensor_http()#类的初始化 #线程 p1 = Process(target=p_sensor.GetData, args=("192.168.137.9:8080",2,share_data,lock)) p1.deamon=True #伴随主进程关闭而关闭 p1.start() p2 = Process(target=p_sensor.GetData, args=("192.168.137.49:8080",3,share_data,lock)) p2.deamon=True #伴随主进程关闭而关闭 p2.start() while 1: time.sleep(3) print("sensor1",share_data[2]) print("sensor2",share_data[3]) '''
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;//记录本次请求是否处理完毕 //分割结果 #define sleng 12 //数组大小 比实际多一个 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); } /** * 网页系统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\"}"; String SendJsonMsg = "{\"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("收到原始数据:");Serial.println(REC_comdata); Split(REC_comdata,"-",split_result);//分割调用 String pin_jiu_Value=split_result[0]; String pin_mq135_Value=split_result[1]; String pin_mq2_Value=split_result[2]; String Humidity=split_result[3]; String Temperature=split_result[4]; String id_=split_result[5]; SendJsonMsg=String("{") +"\"pin_jiu_Value\":" +String(pin_jiu_Value)+"," +"\"pin_mq135_Value\":" +String(pin_mq135_Value)+"," +"\"pin_mq2_Value\":" +String(pin_mq2_Value)+"," +"\"Humidity\":" +String(Humidity)+"," +"\"Temperature\":" +String(Temperature)+"," +"\"id_\":" +"\""+String(id_)+"\"" +"};"; Serial.print("发送打包数据:");Serial.println(SendJsonMsg); } //server.send ( 200, "text/html", REC_comdata); // 原始数据 server.send ( 200, "text/html", SendJsonMsg); // EPS打包数据 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); }