我正在开发一个小项目(https://flask-bot-xabor.amvera.io/),包括: Flask 上的服务器;电报机器人;Arduino模块(测量电源电压和温湿度)。
在服务器的view.py中有一个API点:
#API для добавление в БД данных сенсоров на arduino
@app.route('/ard_update',methods = ['POST', 'GET'])
def ard_update():
key = request.args.get('key')
temp = float(request.args.get('field1'))
humidity = int(request.args.get('field2'))
voltage = int(request.args.get('field3'))
if key == "********************":
TELEGRAM_URL = "https://api.telegram.org/bot"
part_url_for_1 = "/sendMessage?chat_id="
chat_id = BaseConfig.CHAT_ID
part_url_for_2 = "&text="
text = "Внимание: ОТКЛЮЧЕНИЕ ЭЛЕКТРИЧЕСТВА. ДАТА: "
BOT_TOKEN = BaseConfig.BOT_TOKEN
now = datetime.datetime.now()
now_str = str(now)
request_telegram = TELEGRAM_URL + BOT_TOKEN + part_url_for_1 + chat_id + part_url_for_2 + text + now_str
new_values = Sensors(temp=temp, humidity=humidity, voltage=voltage)
try:
db.session.add(new_values)
db.session.commit()
except:
db.session.rollback()
print("Ошибка добавления данных сенсоров в БД")
return "Ошибка добавления данных сенсоров в БД"
if voltage == 0:
text = "Внимание: отключение электричества. Время: "
#request_telegram = TELEGRAM_URL + BOT_TOKEN + part_url_for_1 + chat_id + part_url_for_2 + text + now_str
voltage_off = VoltageOff(voltage=voltage)
try:
db.session.add(voltage_off)
db.session.commit()
except:
db.session.rollback()
print("Ошибка добавления данных сенсоров в БД")
return redirect(request_telegram)
else:
return redirect("/")
#return redirect(request_telegram)
else:
print("Неправильный API")
# tasks = Todo.query.order_by(Todo.date_created).all()
# sensor_values = Sensors.query.order_by(Sensors.date_send).all()
#https://api.telegram.org/bot*********************************/sendMessage?chat_id=************&text=тдтолидлилил
return redirect("/")
思路是,当电压出现故障时,ESP8266 发送 GET 请求;服务器收到此信息,如果电压== 0,则向电报API发送请求并将消息发送给我。
问题是,如果您通过浏览器发送请求,通过链接并将 field3 替换为 0:https://flask-bot-xabor.amvera.io/ard_update ?key=&field1=29.00&field2=60& field3=220 那么电报中的通知消失
如果 ESP8266 模块发送请求,则值将添加到数据库中,绘制图表,但消息不会发送到电报。
那些。满足电压 == 0 的条件,理论上应该发生重定向并且应该发送消息,但由于某种原因这不会发生。
以防万一,ESP8266 草图的一部分:
WiFiClientSecure client;
const int httpPort = 443; // 80 is for HTTP / 443 is for HTTPS!
client.setInsecure(); // this is the magical line that makes everything work
if (!client.connect(host1, httpPort)) { //works!
Serial.println("connection failed");
return;
}
else {
Serial.print("Connected to: ");
Serial.println(host1);
}
//......................................................................
String url = "/update?key="; // Thingspeak
url += APIkey;
url += "&field1=";
url += t; //DHT Температура
url += "&field2=";
url += h; //DHT Влажность
url += "&field3=";
url += voltage;
url += "\r\n\r\n";
String url1 = "/ard_update?key="; // String для другого сервера
url1 += APIkey;
url1 += "&field1=";
url1 += t; //DHT Температура
url1 += "&field2=";
url1 += h; //DHT Влажность
url1 += "&field3=";
url1 += voltage;
// url1 += "\r\n\r\n";
Serial.println("Sending data: ");
//Serial.println(url);
// Передача запроса серверу Thingspeak
//client.print(String("GET ") + url + " HTTP/1.1\r\n" +
// "Host: " + host + "\r\n" +
// "Connection: close\r\n\r\n");
// Чтение данных от сервера и отправка в последовательный порт
client.println(String("GET ") + url1 + " HTTP/1.1\r\n" +
"Host: " + host1 + "\r\n" +
"Connection: close\r\n\r\n");
//Serial.println(String("GET ") + url1 + " HTTP/1.1\r\n" +
// "Host: " + host1 + "\r\n" +
// "Connection: close\r\n\r\n");
while (client.available())
{
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
delay(500);
client.flush(); // ждем отправки всех данных
Serial.println("closing connection");
client.stop();
告诉我寻找问题的方向吗?服务器端或 ESP8266 是否存在某些问题,例如,它提前断开连接并且没有时间重定向?