Запрос Volley на локальный ESP8266

#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