#android #localhost #android-volley #wifi #esp8266
#Android #localhost #android-volley #wi-Fi #esp8266
Вопрос:
Я пытаюсь создать какое-нибудь подключенное устройство, которое оставалось бы локальным. Но я хотел бы создать приложение, которое при подключении к моему домашнему Wi-Fi могло бы управлять этим устройством.
Для управления устройством я использую Node MCU, чтобы я мог подключиться к WiFi с помощью моего модуля ESP8266, отныне я буду называть его ESP. На данный момент я просто пытаюсь мигнуть встроенным светодиодом на плате, чтобы протестировать его, и это работает, когда я выполняю какой-либо HTTP-запрос через приложение Chrome. Я использую библиотеку ESP8266WebServer для приема HTTP-запросов и ответа на них.
Моя идея заключалась в том, что было бы легко просто создать приложение с кнопкой, отправляющей HTTP-запрос на локальный IP моего ESP (192.168.1.57), поэтому я загрузил Android Studio и создал приложение с кнопкой, запускающей запрос. Для этого я использую библиотеку Volley, которая кажется идеальной для того, что я пытаюсь, и приложение работает при запросеhttps://www.google.com .
Моя проблема в том, что он может отправить запрос, но не на мой сервер ESP (http://192.168.1.57 ).
Я видел, что некоторые люди советовали установить IP-адрес ESP на порту коробки, чтобы я мог выходить через Интернет для доступа к своему ESP, но я хотел бы оставаться локальным.
Вот коды :
- Node MCU V3 (ESP 8266)
#include <Arduino.h>
#include <Servo.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
/* VARIABLES */
/* Server */
char name[] = "FlowerPot";
char password[] = "xxxxxxxx";
int port = 80;
ESP8266WebServer server(port);
int request = 0;
/* Output */
int led1 = LED_BUILTIN; // Led de la carte , Pin D4, est allumé pour 0 et éteinte pour 1
int servo_pin = 2; // Variable pin PWM servo, ici Pin D4
Servo servo1; // Variable servo
/* FUNCTIONS DECLARATION */
void handleRoot();
void handleLED();
void handleNotFound();
/* CODE */
void setup() {
/* Server setup */
Serial.begin(9600);
WiFiManager wifiManager;
//se connecte au WIFI
if (!wifiManager.autoConnect(name,password)) {
Serial.println("failed to connect and hit timeout");
//reset and try again, or maybe put it to deep sleep
ESP.reset();
delay(1000);
}
Serial.println("Connected!");
//demarre le serveur
server.on("/", handleRoot); // Call the 'handleRoot' function when a client requests URI "/"
server.on("/LED", handleLED); // Call the 'handleLED' function quand on appelle l'URL avec "/LED"
//server.on("/LED", HTTP_POST, handleLED); // Call the 'handleLED' function when a POST request is made to URI "/LED"
server.onNotFound(handleNotFound); // When a client requests an unknown URI (i.e. something other than "/"), call function "handleNotFound"
server.begin(); // Actually start the server
Serial.println("HTTP server started");
/* Blink setup */
pinMode(led1,OUTPUT);
/* Servo setup *//*
servo1.attach(servo_pin); */
}
void loop() {
/* Server */
server.handleClient(); // Listen for HTTP requests from clients
/* Blink */
if(request){
digitalWrite(led1,0);
delay(1000);
digitalWrite(led1,1);
delay(4000);
}
/* Servo controle *//*
servo1.write(10);
delay(1000);
servo1.write(90);
delay(1000);
servo1.write(170);
delay(1000); */
}
void handleRoot() {
//server.send(200, "text/html", "<form action="/LED" method="POST"><input type="submit" value="Toggle LED"></form>");
server.send(200, "text/html", "Root");
digitalWrite(led1,!digitalRead(led1));
}
void handleLED() { // If a POST request is made to URI /LED
digitalWrite(led1,!digitalRead(led1)); // Change the state of the LED
/* server.sendHeader("Location","/"); // Add a header to respond with a new location for the browser to go to the home page again
server.send(303); // Send it back to the browser with an HTTP status 303 (See Other) to redirect */
server.send(200, "text/html", "LED");
}
void handleNotFound(){
server.send(404, "text/plain", "404: Not found"); // Send HTTP status 404 (Not Found) when there's no handler for the URI in the request
}
- Основное действие приложения для Android
package com.example.flowerpotapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendMessage(View view){
Button myButton = (Button)findViewById(R.id.button);
final TextView myTextView = (TextView)findViewById(R.id.errors);
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://192.168.1.57";
//String url ="https://www.google.com";
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response string.
myTextView.setText("Response is: " response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
myTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
if(myButton.getText() == "OFF"){
myButton.setText("ON");
} else {
myButton.setText("OFF");
}
}
}
С некоторой точностью я тестирую его на своем телефоне OnePlus 7 на Android 10 и подключаюсь к тому же Wi-Fi, что и мой ESP, с моим телефоном.
Комментарии:
1. Ваш телефон не сможет общаться с вашим ESP8266, если он не подключен к той же сети Wi-Fi, что и ESP8266. Просто так работает сеть. Если ваш телефон не подключен к той же сети Wi-Fi — если он находится в другой сети Wi-Fi или использует данные сотовой связи — ваш ESP ему вообще не виден. Вот почему люди говорят вам сопоставить порт на вашем маршрутизаторе с ESP. Это единственный способ заставить это работать, все еще используя HTTP.
2. На Android вопрос? Тогда протокол http не будет работать.
3. @romkey, я подключен к тому же Wi-Fi, что и мой ESP
4. @blackapps Android Q больше не разрешает http? Почему я могу отправить http-запрос через приложение Chrome? Что мне тогда делать? Переключить мой ESP на https?
5. Да, переключение вашего устройства esp на https-сервер должно работать, поскольку Android не поддерживает незащищенное соединение, учитывая, что они находятся в одной сети, а chrome по-прежнему обрабатывает http-соединение, вот почему оно работает с chrome, но не на Android