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);
}
浙公网安备 33010602011771号